diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 46f9a1e7c7..da62e142c2 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -527,6 +527,11 @@ moduleIntro: let mModule = rhs parseState 1 mModule, $4, [], $3, $2 } + | moduleKeyword opt_attributes opt_access opt_rec recover + { if not (isNil $2) then + parseState.LexBuffer.CheckLanguageFeatureAndRecover LanguageFeature.AttributesToRightOfModuleKeyword (rhs parseState 4) + let mModule = rhs parseState 1 + mModule, $4, [], $3, $2 } /* The start of a namespace declaration */ namespaceIntro: @@ -534,6 +539,10 @@ namespaceIntro: { let mNamespace = rhs parseState 1 mNamespace, $2, $3.LongIdent, grabXmlDoc(parseState, [], 1) } + | NAMESPACE opt_rec recover + { let mNamespace = rhs parseState 1 + mNamespace, $2, [], grabXmlDoc(parseState, [], 1) } + /* The contents of a signature file */ fileNamespaceSpecs: @@ -1138,8 +1147,8 @@ fileModuleImpl: | moduleDefnsOrExprPossiblyEmptyOrBlock { let m = (rhs parseState 1) (fun (mNamespaceOpt, isRec, path, xml) -> - match path with - | [] -> ParsedImplFileFragment.AnonModule($1, m) + match path, mNamespaceOpt with + | [], None -> ParsedImplFileFragment.AnonModule($1, m) | _ -> let lastDeclRange = List.tryLast $1 |> Option.map (fun decl -> decl.Range) |> Option.defaultValue (rhs parseState 1) let m = mkRange lastDeclRange.FileName (lhs parseState).Start lastDeclRange.End diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs new file mode 100644 index 0000000000..6a452c185a --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs @@ -0,0 +1 @@ +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs.bsl new file mode 100644 index 0000000000..11fc84ec74 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 01.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Anon module 01.fs", false, + QualifiedNameOfFile Anon module 01, [], [], + [SynModuleOrNamespace + ([Anon module 01], false, AnonModule, + [Expr (Const (Unit, (1,0--1,2)), (1,0--1,2))], PreXmlDocEmpty, [], + None, (1,0--1,2), { LeadingKeyword = None })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(1,0)-(1,2) parse warning The declarations in this file will be placed in an implicit module 'Anon module 01' based on the file name 'Anon module 01.fs'. However this is not a valid F# identifier, so the contents will not be accessible from other files. Consider renaming the file or adding a 'module' or 'namespace' declaration at the top of the file. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx new file mode 100644 index 0000000000..6a452c185a --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx @@ -0,0 +1 @@ +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx.bsl new file mode 100644 index 0000000000..448d9bae96 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Anon module 02.fsx.bsl @@ -0,0 +1,10 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Anon module 02.fsx", true, + QualifiedNameOfFile Anon module 02$fsx, [], [], + [SynModuleOrNamespace + ([Anon module 02], false, AnonModule, + [Expr (Const (Unit, (1,0--1,2)), (1,0--1,2))], PreXmlDocEmpty, [], + None, (1,0--1,2), { LeadingKeyword = None })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs new file mode 100644 index 0000000000..9053e9990a --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs @@ -0,0 +1,3 @@ +module A. + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs.bsl new file mode 100644 index 0000000000..6f4c8c701d --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 05.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Module 05.fs", false, QualifiedNameOfFile A, [], + [], + [SynModuleOrNamespace + ([A], false, NamedModule, [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in definition diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs new file mode 100644 index 0000000000..1fd0e50bfe --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs @@ -0,0 +1,3 @@ +module + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs.bsl new file mode 100644 index 0000000000..ec0cd02e4c --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 06.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Module 06.fs", false, QualifiedNameOfFile , [], + [], + [SynModuleOrNamespace + ([], false, NamedModule, [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in definition. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs new file mode 100644 index 0000000000..2b59158a73 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs @@ -0,0 +1,3 @@ +module rec + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs.bsl new file mode 100644 index 0000000000..b52a7bcdbf --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Module 07.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Module 07.fs", false, QualifiedNameOfFile , [], + [], + [SynModuleOrNamespace + ([], true, NamedModule, [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--3,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in definition. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs new file mode 100644 index 0000000000..ec0afe0579 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace Ns2.Nested + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs.bsl new file mode 100644 index 0000000000..d4bb61b979 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 01.fs.bsl @@ -0,0 +1,14 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 01.fs", false, + QualifiedNameOfFile Namespace 01, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([Ns2; Nested], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs new file mode 100644 index 0000000000..8bd14088ef --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs.bsl new file mode 100644 index 0000000000..1e5985485f --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 02.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 02.fs", false, + QualifiedNameOfFile Namespace 02, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,0)-(7,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs new file mode 100644 index 0000000000..a0296f7213 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace Ns2. + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs.bsl new file mode 100644 index 0000000000..c822d41e48 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 03.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 03.fs", false, + QualifiedNameOfFile Namespace 03, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([Ns2], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,0)-(7,1) parse error Unexpected start of structured construct in implementation file diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs new file mode 100644 index 0000000000..e530ec3a65 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs @@ -0,0 +1,7 @@ +namespace Ns1 + +() + +namespace rec + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs.bsl new file mode 100644 index 0000000000..e012c095c2 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 04.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 04.fs", false, + QualifiedNameOfFile Namespace 04, [], [], + [SynModuleOrNamespace + ([Ns1], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([], true, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(7,0)-(7,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs new file mode 100644 index 0000000000..f6907897f6 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs @@ -0,0 +1 @@ +namespace diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs.bsl new file mode 100644 index 0000000000..a41e32b658 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 05.fs.bsl @@ -0,0 +1,9 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 05.fs", false, + QualifiedNameOfFile Namespace 05, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, [], PreXmlDocEmpty, [], None, (1,0--2,0), + { LeadingKeyword = Namespace (1,0--1,9) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs new file mode 100644 index 0000000000..e46c3d5e0e --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs @@ -0,0 +1,3 @@ +namespace + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs.bsl new file mode 100644 index 0000000000..06fd680486 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 06.fs.bsl @@ -0,0 +1,12 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 06.fs", false, + QualifiedNameOfFile Namespace 06, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs new file mode 100644 index 0000000000..deec48716d --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs @@ -0,0 +1,3 @@ +namespace + +type T = int diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs.bsl new file mode 100644 index 0000000000..904371c96d --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 07.fs.bsl @@ -0,0 +1,24 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 07.fs", false, + QualifiedNameOfFile Namespace 07, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (3,5--3,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12), + { LeadingKeyword = Type (3,0--3,4) + EqualsRange = Some (3,7--3,8) + WithKeyword = None })], (3,0--3,12))], PreXmlDocEmpty, [], + None, (1,0--3,12), { LeadingKeyword = Namespace (1,0--1,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,4) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs new file mode 100644 index 0000000000..f01fc466be --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs @@ -0,0 +1 @@ +namespace rec diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs.bsl new file mode 100644 index 0000000000..3598403885 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 08.fs.bsl @@ -0,0 +1,9 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 08.fs", false, + QualifiedNameOfFile Namespace 08, [], [], + [SynModuleOrNamespace + ([], true, DeclaredNamespace, [], PreXmlDocEmpty, [], None, (1,0--2,0), + { LeadingKeyword = Namespace (1,0--1,9) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs new file mode 100644 index 0000000000..fd6ffe6cf5 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs @@ -0,0 +1,7 @@ +namespace + +() + +namespace Ns2 + +() diff --git a/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs.bsl b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs.bsl new file mode 100644 index 0000000000..c6f1e667ff --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleOrNamespace/Namespace 09.fs.bsl @@ -0,0 +1,16 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleOrNamespace/Namespace 09.fs", false, + QualifiedNameOfFile Namespace 09, [], [], + [SynModuleOrNamespace + ([], false, DeclaredNamespace, + [Expr (Const (Unit, (3,0--3,2)), (3,0--3,2))], PreXmlDocEmpty, [], + None, (1,0--3,2), { LeadingKeyword = Namespace (1,0--1,9) }); + SynModuleOrNamespace + ([Ns2], false, DeclaredNamespace, + [Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))], PreXmlDocEmpty, [], + None, (5,0--7,2), { LeadingKeyword = Namespace (5,0--5,9) })], + (true, true), { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,0)-(3,1) parse error Unexpected start of structured construct in implementation file. Expected identifier, 'global' or other token.