Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/fsharp/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -5247,7 +5247,7 @@ let rec TcSignatureElementNonMutRec (cenv: cenv) parent typeNames endm (env: TcE
return env


| SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId, isRec, kind, defs, xml, attribs, vis, m)) ->
| SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId, isRec, kind, defs, xml, attribs, vis, m, _)) ->

do for id in longId do
CheckNamespaceModuleOrTypeName g id
Expand Down Expand Up @@ -5560,7 +5560,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv: cenv) parent typeNames scopem
return ((fun modDefs -> modDefn :: modDefs), topAttrsNew), env, envAtEnd


| SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId, isRec, kind, defs, xml, attribs, vis, m)) ->
| SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId, isRec, kind, defs, xml, attribs, vis, m, _)) ->

if progress then dprintn ("Typecheck implementation " + textOfLid longId)
let endm = m.EndRange
Expand Down
54 changes: 28 additions & 26 deletions src/fsharp/ParseAndCheckInputs.fs
Original file line number Diff line number Diff line change
Expand Up @@ -60,24 +60,24 @@ let ComputeQualifiedNameOfFileFromUniquePath (m, p: string list) =

let QualFileNameOfSpecs filename specs =
match specs with
| [SynModuleOrNamespaceSig(modname, _, kind, _, _, _, _, m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname
| [SynModuleOrNamespaceSig(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename
| [SynModuleOrNamespaceSig(longId = modname; kind = kind; range = m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname
| [SynModuleOrNamespaceSig(kind = kind; range = m)] when not kind.IsModule -> QualFileNameOfFilename m filename
| _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename

let QualFileNameOfImpls filename specs =
match specs with
| [SynModuleOrNamespace(modname, _, kind, _, _, _, _, m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname
| [SynModuleOrNamespace(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename
| [SynModuleOrNamespace(longId = modname; kind = kind; range = m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname
| [SynModuleOrNamespace(kind = kind; range = m)] when not kind.IsModule -> QualFileNameOfFilename m filename
| _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename

let PrependPathToQualFileName x (QualifiedNameOfFile q) =
ComputeQualifiedNameOfFileFromUniquePath (q.idRange, pathOfLid x@[q.idText])

let PrependPathToImpl x (SynModuleOrNamespace(p, b, c, d, e, f, g, h)) =
SynModuleOrNamespace(x@p, b, c, d, e, f, g, h)
let PrependPathToImpl x (SynModuleOrNamespace(longId, isRecursive, kind, decls, xmlDoc, attribs, accessibility, range, trivia)) =
SynModuleOrNamespace(x@longId, isRecursive, kind, decls, xmlDoc, attribs, accessibility, range, trivia)

let PrependPathToSpec x (SynModuleOrNamespaceSig(p, b, c, d, e, f, g, h)) =
SynModuleOrNamespaceSig(x@p, b, c, d, e, f, g, h)
let PrependPathToSpec x (SynModuleOrNamespaceSig(longId, isRecursive, kind, decls, xmlDoc, attribs, accessibility, range, trivia)) =
SynModuleOrNamespaceSig(x@longId, isRecursive, kind, decls, xmlDoc, attribs, accessibility, range, trivia)

let PrependPathToInput x inp =
match inp with
Expand All @@ -104,14 +104,14 @@ let ComputeAnonModuleName check defaultNamespace filename (m: range) =

let PostParseModuleImpl (_i, defaultNamespace, isLastCompiland, filename, impl) =
match impl with
| ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m)) ->
| ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m, trivia)) ->
let lid =
match lid with
| [id] when kind.IsModule && id.idText = MangledGlobalName ->
error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange))
| id :: rest when id.idText = MangledGlobalName -> rest
| _ -> lid
SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m)
SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m, trivia)

| ParsedImplFileFragment.AnonModule (defs, m)->
let isLast, isExe = isLastCompiland
Expand All @@ -121,26 +121,27 @@ let PostParseModuleImpl (_i, defaultNamespace, isLastCompiland, filename, impl)
| _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(), trimRangeToLine m))

let modname = ComputeAnonModuleName (not (isNil defs)) defaultNamespace filename (trimRangeToLine m)
SynModuleOrNamespace(modname, false, SynModuleOrNamespaceKind.AnonModule, defs, PreXmlDoc.Empty, [], None, m)
let trivia: SynModuleOrNamespaceTrivia = { ModuleKeyword = None; NamespaceKeyword = None }
SynModuleOrNamespace(modname, false, SynModuleOrNamespaceKind.AnonModule, defs, PreXmlDoc.Empty, [], None, m, trivia)

| ParsedImplFileFragment.NamespaceFragment (lid, a, kind, c, d, e, m)->
| ParsedImplFileFragment.NamespaceFragment (lid, isRecursive, kind, decls, xmlDoc, attributes, range, trivia)->
let lid, kind =
match lid with
| id :: rest when id.idText = MangledGlobalName ->
rest, if List.isEmpty rest then SynModuleOrNamespaceKind.GlobalNamespace else kind
| _ -> lid, kind
SynModuleOrNamespace(lid, a, kind, c, d, e, None, m)
SynModuleOrNamespace(lid, isRecursive, kind, decls, xmlDoc, attributes, None, range, trivia)

let PostParseModuleSpec (_i, defaultNamespace, isLastCompiland, filename, intf) =
match intf with
| ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, isRec, kind, decls, xmlDoc, attribs, access, m)) ->
| ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, isRec, kind, decls, xmlDoc, attribs, access, m, trivia)) ->
let lid =
match lid with
| [id] when kind.IsModule && id.idText = MangledGlobalName ->
error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange))
| id :: rest when id.idText = MangledGlobalName -> rest
| _ -> lid
SynModuleOrNamespaceSig(lid, isRec, SynModuleOrNamespaceKind.NamedModule, decls, xmlDoc, attribs, access, m)
SynModuleOrNamespaceSig(lid, isRec, SynModuleOrNamespaceKind.NamedModule, decls, xmlDoc, attribs, access, m, trivia)

| ParsedSigFileFragment.AnonModule (defs, m) ->
let isLast, isExe = isLastCompiland
Expand All @@ -150,15 +151,16 @@ let PostParseModuleSpec (_i, defaultNamespace, isLastCompiland, filename, intf)
| _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(), m))

let modname = ComputeAnonModuleName (not (isNil defs)) defaultNamespace filename (trimRangeToLine m)
SynModuleOrNamespaceSig(modname, false, SynModuleOrNamespaceKind.AnonModule, defs, PreXmlDoc.Empty, [], None, m)
let trivia: SynModuleOrNamespaceSigTrivia = { ModuleKeyword = None; NamespaceKeyword = None }
SynModuleOrNamespaceSig(modname, false, SynModuleOrNamespaceKind.AnonModule, defs, PreXmlDoc.Empty, [], None, m, trivia)

| ParsedSigFileFragment.NamespaceFragment (lid, a, kind, c, d, e, m)->
| ParsedSigFileFragment.NamespaceFragment (lid, isRecursive, kind, decls, xmlDoc, attributes, range, trivia)->
let lid, kind =
match lid with
| id :: rest when id.idText = MangledGlobalName ->
rest, if List.isEmpty rest then SynModuleOrNamespaceKind.GlobalNamespace else kind
| _ -> lid, kind
SynModuleOrNamespaceSig(lid, a, kind, c, d, e, None, m)
SynModuleOrNamespaceSig(lid, isRecursive, kind, decls, xmlDoc, attributes, None, range, trivia)

let GetScopedPragmasForInput input =
match input with
Expand All @@ -184,7 +186,7 @@ let private collectCodeComments (lexbuf: UnicodeLexing.Lexbuf) (tripleSlashComme
| CommentTrivia.BlockComment r -> r.StartLine, r.StartColumn)

let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImplFile (hashDirectives, impls), lexbuf: UnicodeLexing.Lexbuf, tripleSlashComments: range list) =
match impls |> List.rev |> List.tryPick (function ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, _, _, _, _, _, _, _)) -> Some lid | _ -> None) with
match impls |> List.rev |> List.tryPick (function ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(longId = lid)) -> Some lid | _ -> None) with
| Some lid when impls.Length > 1 ->
errorR(Error(FSComp.SR.buildMultipleToplevelModules(), rangeOfLid lid))
| _ ->
Expand All @@ -194,7 +196,7 @@ let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImp
let isScript = IsScript filename

let scopedPragmas =
[ for SynModuleOrNamespace(_, _, _, decls, _, _, _, _) in impls do
[ for SynModuleOrNamespace(decls = decls) in impls do
for d in decls do
match d with
| SynModuleDecl.HashDirective (hd, _) -> yield! GetScopedPragmasForHashDirective hd
Expand All @@ -209,7 +211,7 @@ let PostParseModuleImpls (defaultNamespace, filename, isLastCompiland, ParsedImp
ParsedInput.ImplFile (ParsedImplFileInput (filename, isScript, qualName, scopedPragmas, hashDirectives, impls, isLastCompiland, trivia))

let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSigFile (hashDirectives, specs), lexbuf: UnicodeLexing.Lexbuf, tripleSlashComments: range list) =
match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, _, _, _, _, _, _, _)) -> Some lid | _ -> None) with
match specs |> List.rev |> List.tryPick (function ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(longId = lid)) -> Some lid | _ -> None) with
| Some lid when specs.Length > 1 ->
errorR(Error(FSComp.SR.buildMultipleToplevelModules(), rangeOfLid lid))
| _ ->
Expand All @@ -218,7 +220,7 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig
let specs = specs |> List.mapi (fun i x -> PostParseModuleSpec(i, defaultNamespace, isLastCompiland, filename, x))
let qualName = QualFileNameOfSpecs filename specs
let scopedPragmas =
[ for SynModuleOrNamespaceSig(_, _, _, decls, _, _, _, _) in specs do
[ for SynModuleOrNamespaceSig(decls = decls) in specs do
for d in decls do
match d with
| SynModuleSigDecl.HashDirective(hd, _) -> yield! GetScopedPragmasForHashDirective hd
Expand Down Expand Up @@ -338,8 +340,8 @@ let ReportParsingStatistics res =
let rec flattenDefns specs =
specs |> List.collect (function SynModuleDecl.NestedModule (decls=subDecls) -> flattenDefns subDecls | defn -> [defn])

let flattenModSpec (SynModuleOrNamespaceSig(_, _, _, decls, _, _, _, _)) = flattenSpecs decls
let flattenModImpl (SynModuleOrNamespace(_, _, _, decls, _, _, _, _)) = flattenDefns decls
let flattenModSpec (SynModuleOrNamespaceSig(decls = decls)) = flattenSpecs decls
let flattenModImpl (SynModuleOrNamespace(decls = decls)) = flattenDefns decls
match res with
| ParsedInput.SigFile (ParsedSigFileInput (modules = specs)) ->
printfn "parsing yielded %d specs" (List.collect flattenModSpec specs).Length
Expand Down Expand Up @@ -640,7 +642,7 @@ let ProcessMetaCommandsFromInput
| SynModuleDecl.NestedModule (decls=subDecls) -> WarnOnIgnoredImplDecls subDecls
| _ -> ())

let ProcessMetaCommandsFromModuleSpec state (SynModuleOrNamespaceSig(_, _, _, decls, _, _, _, _)) =
let ProcessMetaCommandsFromModuleSpec state (SynModuleOrNamespaceSig(decls = decls)) =
List.fold (fun s d ->
match d with
| SynModuleSigDecl.HashDirective (h, _) -> ProcessMetaCommand s h
Expand All @@ -649,7 +651,7 @@ let ProcessMetaCommandsFromInput
state
decls

let ProcessMetaCommandsFromModuleImpl state (SynModuleOrNamespace(_, _, _, decls, _, _, _, _)) =
let ProcessMetaCommandsFromModuleImpl state (SynModuleOrNamespace(decls = decls)) =
List.fold (fun s d ->
match d with
| SynModuleDecl.HashDirective (h, _) -> ProcessMetaCommand s h
Expand Down
12 changes: 8 additions & 4 deletions src/fsharp/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1925,7 +1925,8 @@ type SynModuleOrNamespace =
xmlDoc: PreXmlDoc *
attribs: SynAttributes *
accessibility: SynAccess option *
range: range
range: range *
trivia: SynModuleOrNamespaceTrivia

member this.Range =
match this with
Expand All @@ -1941,7 +1942,8 @@ type SynModuleOrNamespaceSig =
xmlDoc: PreXmlDoc *
attribs: SynAttributes *
accessibility: SynAccess option *
range: range
range: range *
trivia: SynModuleOrNamespaceSigTrivia

member this.Range =
match this with
Expand Down Expand Up @@ -1981,7 +1983,8 @@ type ParsedImplFileFragment =
decls: SynModuleDecl list *
xmlDoc: PreXmlDoc *
attributes: SynAttributes *
range: range
range: range *
trivia: SynModuleOrNamespaceTrivia

[<NoEquality; NoComparison; RequireQualifiedAccess>]
type ParsedSigFileFragment =
Expand All @@ -2000,7 +2003,8 @@ type ParsedSigFileFragment =
decls: SynModuleSigDecl list *
xmlDoc: PreXmlDoc *
attributes: SynAttributes *
range: range
range: range *
trivia: SynModuleOrNamespaceSigTrivia

[<NoEquality; NoComparison; RequireQualifiedAccess>]
type ParsedScriptInteraction =
Expand Down
12 changes: 8 additions & 4 deletions src/fsharp/SyntaxTree.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -1727,7 +1727,8 @@ type SynModuleOrNamespace =
xmlDoc: PreXmlDoc *
attribs: SynAttributes *
accessibility: SynAccess option *
range: range
range: range *
trivia: SynModuleOrNamespaceTrivia

/// Gets the syntax range of this construct
member Range: range
Expand All @@ -1743,7 +1744,8 @@ type SynModuleOrNamespaceSig =
xmlDoc: PreXmlDoc *
attribs: SynAttributes *
accessibility: SynAccess option *
range: range
range: range *
trivia: SynModuleOrNamespaceSigTrivia

/// Gets the syntax range of this construct
member Range: range
Expand Down Expand Up @@ -1779,7 +1781,8 @@ type ParsedImplFileFragment =
decls: SynModuleDecl list *
xmlDoc: PreXmlDoc *
attributes: SynAttributes *
range: range
range: range *
trivia: SynModuleOrNamespaceTrivia

/// Represents the syntax tree for the contents of a parsed signature file
[<NoEquality; NoComparison; RequireQualifiedAccess>]
Expand All @@ -1799,7 +1802,8 @@ type ParsedSigFileFragment =
decls: SynModuleSigDecl list *
xmlDoc: PreXmlDoc *
attributes: SynAttributes *
range: range
range: range *
trivia: SynModuleOrNamespaceSigTrivia

/// Represents a parsed syntax tree for an F# Interactive interaction
[<NoEquality; NoComparison; RequireQualifiedAccess>]
Expand Down
10 changes: 10 additions & 0 deletions src/fsharp/SyntaxTrivia.fs
Original file line number Diff line number Diff line change
Expand Up @@ -147,3 +147,13 @@ type SynModuleSigDeclNestedModuleTrivia =
{ ModuleKeyword: range option
EqualsRange: range option }
static member Zero: SynModuleSigDeclNestedModuleTrivia = { ModuleKeyword = None; EqualsRange = None }

[<NoEquality; NoComparison>]
type SynModuleOrNamespaceTrivia =
{ ModuleKeyword: range option
NamespaceKeyword: range option }

[<NoEquality; NoComparison>]
type SynModuleOrNamespaceSigTrivia =
{ ModuleKeyword: range option
NamespaceKeyword: range option }
16 changes: 16 additions & 0 deletions src/fsharp/SyntaxTrivia.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -212,3 +212,19 @@ type SynModuleSigDeclNestedModuleTrivia =
/// The syntax range of the `=` token.
EqualsRange: range option }
static member Zero: SynModuleSigDeclNestedModuleTrivia

/// Represents additional information for SynModuleOrNamespace
[<NoEquality; NoComparison>]
type SynModuleOrNamespaceTrivia =
{ /// The syntax range of the `module` keyword
ModuleKeyword: range option
/// The syntax range of the `namespace` keyword
NamespaceKeyword: range option }

/// Represents additional information for SynModuleOrNamespaceSig
[<NoEquality; NoComparison>]
type SynModuleOrNamespaceSigTrivia =
{ /// The syntax range of the `module` keyword
ModuleKeyword: range option
/// The syntax range of the `namespace` keyword
NamespaceKeyword: range option }
2 changes: 1 addition & 1 deletion src/fsharp/fsi/fsi.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1783,7 +1783,7 @@ type internal FsiDynamicCompiler
let m = match defs with [] -> rangeStdin0 | _ -> List.reduce unionRanges [for d in defs -> d.Range]
let prefix = mkFragmentPath m i
let prefixPath = pathOfLid prefix
let impl = SynModuleOrNamespace(prefix,(*isRec*)false, SynModuleOrNamespaceKind.NamedModule,defs,PreXmlDoc.Empty,[],None,m)
let impl = SynModuleOrNamespace(prefix,(*isRec*)false, SynModuleOrNamespaceKind.NamedModule,defs,PreXmlDoc.Empty,[],None,m, { ModuleKeyword = None; NamespaceKeyword = None })
let isLastCompiland = true
let isExe = false
let input = ParsedInput.ImplFile (ParsedImplFileInput (filename,true, ComputeQualifiedNameOfFileFromUniquePath (m,prefixPath),[],[],[impl],(isLastCompiland, isExe), { ConditionalDirectives = []; CodeComments = [] }))
Expand Down
Loading