diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 9784dee0c3..e01d623145 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -706,7 +706,7 @@ moduleSpfn: SynModuleSigDecl.Exception(synExnDefn, mWhole) } | openDecl - { SynModuleSigDecl.Open($1, (rhs parseState 1)) } + { SynModuleSigDecl.Open $1 } valSpfn: | opt_attributes opt_access VAL opt_attributes opt_inline opt_mutable opt_access nameop opt_explicitValTyparDecls COLON topTypeWithTypeConstraints optLiteralValueSpfn @@ -1320,15 +1320,26 @@ moduleDefn: /* 'open' declarations */ | openDecl - { [ SynModuleDecl.Open($1, (rhs parseState 1)) ] } + { [ SynModuleDecl.Open $1 ] } openDecl: - /* 'open' declarations */ | OPEN path - { SynOpenDeclTarget.ModuleOrNamespace($2, (rhs parseState 2)) } + { let mOpen = rhs parseState 1 + let mPath = $2.Range + SynOpenDeclTarget.ModuleOrNamespace($2, mPath), unionRanges mOpen mPath } + + | OPEN recover + { let mOpen = rhs parseState 1 + SynOpenDeclTarget.ModuleOrNamespace(SynLongIdent([], [], []), mOpen.EndRange), mOpen } | OPEN typeKeyword appType - { SynOpenDeclTarget.Type($3, (rhs parseState 3)) } + { let mOpen = rhs parseState 1 + let mPath = $3.Range + SynOpenDeclTarget.Type($3, mPath), unionRanges mOpen mPath } + + | OPEN typeKeyword recover + { let m = rhs2 parseState 1 2 + SynOpenDeclTarget.ModuleOrNamespace(SynLongIdent([], [], []), m.EndRange), m } /* The right-hand-side of a module abbreviation definition */ /* This occurs on the right of a module abbreviation (#light encloses the r.h.s. with OBLOCKBEGIN/OBLOCKEND) */ diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 01.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 01.fs new file mode 100644 index 0000000000..a6746f4ead --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 01.fs @@ -0,0 +1,4 @@ +module Module + +open +open Ns1 diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 01.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 01.fs.bsl new file mode 100644 index 0000000000..9ba9b81eb5 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 01.fs.bsl @@ -0,0 +1,17 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 01.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace (SynLongIdent ([], [], []), (3,4--3,4)), + (3,0--3,4)); + Open + (ModuleOrNamespace (SynLongIdent ([Ns1], [], [None]), (4,5--4,8)), + (4,0--4,8))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,8), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,5)-(4,0) parse error Incomplete structured construct at or before this point in open declaration. Expected identifier, 'global', 'type' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 02.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 02.fs new file mode 100644 index 0000000000..6546212aeb --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 02.fs @@ -0,0 +1,4 @@ +module Module + +open type +open Ns1 diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 02.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 02.fs.bsl new file mode 100644 index 0000000000..2a17ef664a --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 02.fs.bsl @@ -0,0 +1,17 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 02.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace (SynLongIdent ([], [], []), (3,9--3,9)), + (3,0--3,9)); + Open + (ModuleOrNamespace (SynLongIdent ([Ns1], [], [None]), (4,5--4,8)), + (4,0--4,8))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,8), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,10)-(4,0) parse error Incomplete structured construct at or before this point in open declaration diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 03.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 03.fs new file mode 100644 index 0000000000..15a614bc78 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 03.fs @@ -0,0 +1,5 @@ +module Module + +open type + +() diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 03.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 03.fs.bsl new file mode 100644 index 0000000000..549a2c50a7 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 03.fs.bsl @@ -0,0 +1,14 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 03.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace (SynLongIdent ([], [], []), (3,9--3,9)), + (3,0--3,9)); Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,10)-(5,0) parse error Incomplete structured construct at or before this point in open declaration diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 04.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 04.fs new file mode 100644 index 0000000000..798a6aef2e --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 04.fs @@ -0,0 +1,5 @@ +module Module + +open type + +ignore diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 04.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 04.fs.bsl new file mode 100644 index 0000000000..26532b885c --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 04.fs.bsl @@ -0,0 +1,14 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 04.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace (SynLongIdent ([], [], []), (3,9--3,9)), + (3,0--3,9)); Expr (Ident ignore, (5,0--5,6))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,10)-(5,0) parse error Incomplete structured construct at or before this point in open declaration diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 05.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 05.fs new file mode 100644 index 0000000000..0999fac7c7 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 05.fs @@ -0,0 +1,5 @@ +module Module + +open + +type T = int diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 05.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 05.fs.bsl new file mode 100644 index 0000000000..d6339de665 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 05.fs.bsl @@ -0,0 +1,27 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 05.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace (SynLongIdent ([], [], []), (3,4--3,4)), + (3,0--3,4)); + Types + ([SynTypeDefn + (SynComponentInfo + ([], None, [], [T], + PreXmlDoc ((5,0), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (5,5--5,6)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([int], [], [None])), + (5,9--5,12)), (5,9--5,12)), [], None, (5,5--5,12), + { LeadingKeyword = Type (5,0--5,4) + EqualsRange = Some (5,7--5,8) + WithKeyword = None })], (5,0--5,12))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,5)-(5,0) parse error Incomplete structured construct at or before this point in open declaration. Expected identifier, 'global', 'type' or other token. diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 06.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 06.fs new file mode 100644 index 0000000000..77b1a3f007 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 06.fs @@ -0,0 +1,4 @@ +module Module + +open Ns1. +open Ns2 diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 06.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 06.fs.bsl new file mode 100644 index 0000000000..44453c403f --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 06.fs.bsl @@ -0,0 +1,18 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 06.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace + (SynLongIdent ([Ns1], [(3,8--3,9)], [None]), (3,5--3,9)), + (3,0--3,9)); + Open + (ModuleOrNamespace (SynLongIdent ([Ns2], [], [None]), (4,5--4,8)), + (4,0--4,8))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,8), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,10)-(4,0) parse error Incomplete structured construct at or before this point in open declaration diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 07.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 07.fs new file mode 100644 index 0000000000..66d705cb2d --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 07.fs @@ -0,0 +1,5 @@ +module Module + +open Ns1. + +ignore diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 07.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 07.fs.bsl new file mode 100644 index 0000000000..38af89635b --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 07.fs.bsl @@ -0,0 +1,15 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 07.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace + (SynLongIdent ([Ns1], [(3,8--3,9)], [None]), (3,5--3,9)), + (3,0--3,9)); Expr (Ident ignore, (5,0--5,6))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--5,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set [])) + +(3,10)-(5,0) parse error Incomplete structured construct at or before this point in open declaration diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 08.fs b/tests/service/data/SyntaxTree/ModuleMember/Open 08.fs new file mode 100644 index 0000000000..998eb9b5f9 --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 08.fs @@ -0,0 +1,4 @@ +module Module + +open Ns1. + Ns2 diff --git a/tests/service/data/SyntaxTree/ModuleMember/Open 08.fs.bsl b/tests/service/data/SyntaxTree/ModuleMember/Open 08.fs.bsl new file mode 100644 index 0000000000..5968d7456b --- /dev/null +++ b/tests/service/data/SyntaxTree/ModuleMember/Open 08.fs.bsl @@ -0,0 +1,13 @@ +ImplFile + (ParsedImplFileInput + ("/root/ModuleMember/Open 08.fs", false, QualifiedNameOfFile Module, [], [], + [SynModuleOrNamespace + ([Module], false, NamedModule, + [Open + (ModuleOrNamespace + (SynLongIdent ([Ns1; Ns2], [(3,8--3,9)], [None; None]), + (3,5--4,4)), (3,0--4,4))], + PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None, + (1,0--4,4), { LeadingKeyword = Module (1,0--1,6) })], (true, true), + { ConditionalDirectives = [] + CodeComments = [] }, set []))