From a766f25ccc9eb7681eba223d59668874dea58c70 Mon Sep 17 00:00:00 2001 From: Florian Verdonck Date: Thu, 20 Apr 2023 11:31:53 +0200 Subject: [PATCH] Include end in nested sig module range. (#15117) --- src/Compiler/pars.fsy | 14 ++++--- .../NestedModuleWithBeginEndAndDecls.fsi | 7 ++++ .../NestedModuleWithBeginEndAndDecls.fsi.bsl | 40 +++++++++++++++++++ .../NestedModule/RangeOfBeginEnd.fsi | 4 ++ .../NestedModule/RangeOfBeginEnd.fsi.bsl | 16 ++++++++ 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi create mode 100644 tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi.bsl create mode 100644 tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi create mode 100644 tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi.bsl diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 01350198cdd..111f914dd72 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -662,11 +662,13 @@ moduleSpfn: if isRec then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsInvalidUseOfRec()) let info = SynComponentInfo($1 @ attribs2, None, [], path, xmlDoc, false, vis, rhs parseState 3) if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) - let m = (rhs2 parseState 1 4, $5) + let decls, mOptEnd = $5 + let m = (rhs2 parseState 1 4, decls) ||> unionRangeWithListBy (fun (d: SynModuleSigDecl) -> d.Range) |> unionRangeWithXmlDoc xmlDoc + let m = match mOptEnd with | None -> m | Some mEnd -> unionRanges m mEnd let trivia: SynModuleSigDeclNestedModuleTrivia = { ModuleKeyword = Some mModule; EqualsRange = $4 } - SynModuleSigDecl.NestedModule(info, isRec, $5, m, trivia) } + SynModuleSigDecl.NestedModule(info, isRec, decls, m, trivia) } | opt_attributes opt_access moduleIntro error { let mModule, isRec, path, vis, attribs2 = $3 @@ -743,15 +745,17 @@ moduleSpecBlock: /* #light-syntax, with no sig/end or begin/end */ | OBLOCKBEGIN moduleSpfns oblockend - { $2 } + { $2, None } /* #light-syntax, with sig/end or begin/end */ | OBLOCKBEGIN sigOrBegin moduleSpfnsPossiblyEmpty END oblockend - { $3 } + { let mEnd = rhs parseState 4 + $3, Some mEnd } /* non-#light-syntax, with sig/end or begin/end */ | sigOrBegin moduleSpfnsPossiblyEmpty END - { $2 } + { let mEnd = rhs parseState 3 + $2, Some mEnd } tyconSpfnList: diff --git a/tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi b/tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi new file mode 100644 index 00000000000..0a647263162 --- /dev/null +++ b/tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi @@ -0,0 +1,7 @@ +namespace X + +module Y = + begin + val a: int + type B = string + end diff --git a/tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi.bsl b/tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi.bsl new file mode 100644 index 00000000000..63876c52c8d --- /dev/null +++ b/tests/service/data/SyntaxTree/NestedModule/NestedModuleWithBeginEndAndDecls.fsi.bsl @@ -0,0 +1,40 @@ +SigFile + (ParsedSigFileInput + ("/root/NestedModule/NestedModuleWithBeginEndAndDecls.fsi", + QualifiedNameOfFile NestedModuleWithBeginEndAndDecls, [], [], + [SynModuleOrNamespaceSig + ([X], false, DeclaredNamespace, + [NestedModule + (SynComponentInfo + ([], None, [], [Y], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false, + None, (3,0--3,8)), false, + [Val + (SynValSig + ([], SynIdent (a, None), SynValTyparDecls (None, true), + LongIdent (SynLongIdent ([int], [], [None])), + SynValInfo ([], SynArgInfo ([], false, None)), false, false, + PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector), + None, None, (5,8--5,18), { LeadingKeyword = Val (5,8--5,11) + InlineKeyword = None + WithKeyword = None + EqualsRange = None }), + (5,8--5,18)); + Types + ([SynTypeDefnSig + (SynComponentInfo + ([], None, [], [B], + PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector), + false, None, (6,13--6,14)), + Simple + (TypeAbbrev + (Ok, LongIdent (SynLongIdent ([string], [], [None])), + (6,17--6,23)), (6,17--6,23)), [], (6,13--6,23), + { LeadingKeyword = Type (6,8--6,12) + EqualsRange = Some (6,15--6,16) + WithKeyword = None })], (6,8--6,23))], (3,0--7,7), + { ModuleKeyword = Some (3,0--3,6) + EqualsRange = Some (3,9--3,10) })], PreXmlDocEmpty, [], None, + (1,0--7,7), { LeadingKeyword = Namespace (1,0--1,9) })], + { ConditionalDirectives = [] + CodeComments = [] }, set [])) diff --git a/tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi b/tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi new file mode 100644 index 00000000000..ce52cae2fb6 --- /dev/null +++ b/tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi @@ -0,0 +1,4 @@ +namespace X + +module Y = + begin end diff --git a/tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi.bsl b/tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi.bsl new file mode 100644 index 00000000000..33815671eb9 --- /dev/null +++ b/tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fsi.bsl @@ -0,0 +1,16 @@ +SigFile + (ParsedSigFileInput + ("/root/NestedModule/RangeOfBeginEnd.fsi", + QualifiedNameOfFile RangeOfBeginEnd, [], [], + [SynModuleOrNamespaceSig + ([X], false, DeclaredNamespace, + [NestedModule + (SynComponentInfo + ([], None, [], [Y], + PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false, + None, (3,0--3,8)), false, [], (3,0--4,13), + { ModuleKeyword = Some (3,0--3,6) + EqualsRange = Some (3,9--3,10) })], PreXmlDocEmpty, [], None, + (1,0--4,13), { LeadingKeyword = Namespace (1,0--1,9) })], + { ConditionalDirectives = [] + CodeComments = [] }, set []))