Skip to content

Commit

Permalink
Include end in nested module range. (dotnet#14751)
Browse files Browse the repository at this point in the history
  • Loading branch information
nojaf authored Feb 16, 2023
1 parent 824b4e4 commit 4247eb9
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 9 deletions.
26 changes: 17 additions & 9 deletions src/Compiler/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -1273,12 +1273,17 @@ moduleDefn:
| Some vis -> raiseParseErrorAt (rhs parseState 1) (FSComp.SR.parsIgnoreAttributesOnModuleAbbreviationAlwaysPrivate(vis.ToString()))
| None -> ()
[ SynModuleDecl.ModuleAbbrev(List.head path, eqn, (rhs parseState 3, eqn) ||> unionRangeWithListBy (fun id -> id.idRange) ) ]
| Choice2Of2 def ->
| Choice2Of2 (def, mEndOpt) ->
if not (isSingleton path) then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsModuleAbbreviationMustBeSimpleName())
let info = SynComponentInfo(attribs @ attribs2, None, [], path, xmlDoc, false, vis, rhs parseState 3)
let mEquals = rhs parseState 4
let trivia: SynModuleDeclNestedModuleTrivia = { ModuleKeyword = Some mModule; EqualsRange = Some mEquals }
[ SynModuleDecl.NestedModule(info, isRec, def, false, ((rhs2 parseState 1 4, def) ||> unionRangeWithListBy (fun d -> d.Range) |> unionRangeWithXmlDoc xmlDoc), trivia)] }
let m =
(rhs2 parseState 1 4, def)
||> unionRangeWithListBy (fun (d: SynModuleDecl) -> d.Range)
|> unionRangeWithXmlDoc xmlDoc
let m = match mEndOpt with | None -> m | Some mEnd -> unionRanges m mEnd
[ SynModuleDecl.NestedModule(info, isRec, def, false, m, trivia) ] }

/* unattached custom attributes */
| attributes recover
Expand Down Expand Up @@ -1339,17 +1344,18 @@ namedModuleDefnBlock:
match $2 with
| [ SynModuleDecl.Expr (LongOrSingleIdent(false, SynLongIdent(path, _, _), None, _), _) ] ->
Choice1Of2 path
| _ ->
Choice2Of2 $2
| _ ->
Choice2Of2 ($2, None)
}

| OBLOCKBEGIN moduleDefnsOrExpr recover
{ // The lex filter ensures we can only get a mismatch in OBLOCKBEGIN/OBLOCKEND tokens if there was some other kind of error, hence we don't need to report this error
// reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnClosedBlockInHashLight())
Choice2Of2 $2 }
Choice2Of2 ($2, None) }

| OBLOCKBEGIN error oblockend
{ Choice2Of2 [] }
{ let mEnd = rhs parseState 3
Choice2Of2 ([], Some mEnd) }

| wrappedNamedModuleDefn
{ Choice2Of2 $1 }
Expand All @@ -1361,14 +1367,16 @@ namedModuleDefnBlock:
/* A module definition that includes a 'begin'...'end' (rarely used in F# with #light syntax) */
wrappedNamedModuleDefn:
| structOrBegin moduleDefnsOrExprPossiblyEmpty END
{ $2 }
{ let mEnd = rhs parseState 3
$2, Some mEnd }

| structOrBegin moduleDefnsOrExprPossiblyEmpty recover
{ reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBeginOrStruct())
$2 }
$2, None }

| structOrBegin error END
{ [] }
{ let mEnd = rhs parseState 3
[], Some mEnd }


tyconDefnAugmentation:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace X

module Y =
begin
let a = 0
end

Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
ImplFile
(ParsedImplFileInput
("/root/NestedModule/NestedModuleWithBeginEndAndDecls.fs", false,
QualifiedNameOfFile NestedModuleWithBeginEndAndDecls, [], [],
[SynModuleOrNamespace
([X], false, DeclaredNamespace,
[NestedModule
(SynComponentInfo
([], None, [], [Y],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false,
None, (3,0--3,8)), false,
[Let
(false,
[SynBinding
(None, Normal, false, false, [],
PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector),
SynValData
(None, SynValInfo ([], SynArgInfo ([], false, None)),
None),
Named (SynIdent (a, None), false, None, (5,12--5,13)),
None, Const (Int32 0, (5,16--5,17)), (5,12--5,13),
Yes (5,8--5,17), { LeadingKeyword = Let (5,8--5,11)
InlineKeyword = None
EqualsRange = Some (5,14--5,15) })],
(5,8--5,17))], false, (3,0--6,7),
{ ModuleKeyword = Some (3,0--3,6)
EqualsRange = Some (3,9--3,10) })], PreXmlDocEmpty, [], None,
(1,0--6,7), { LeadingKeyword = Namespace (1,0--1,9) })], (true, false),
{ ConditionalDirectives = []
CodeComments = [] }, set []))
5 changes: 5 additions & 0 deletions tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
namespace X

module Y =
begin end

16 changes: 16 additions & 0 deletions tests/service/data/SyntaxTree/NestedModule/RangeOfBeginEnd.fs.bsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
ImplFile
(ParsedImplFileInput
("/root/NestedModule/RangeOfBeginEnd.fs", false,
QualifiedNameOfFile RangeOfBeginEnd, [], [],
[SynModuleOrNamespace
([X], false, DeclaredNamespace,
[NestedModule
(SynComponentInfo
([], None, [], [Y],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector), false,
None, (3,0--3,8)), false, [], 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) })],
(true, false), { ConditionalDirectives = []
CodeComments = [] }, set []))

0 comments on commit 4247eb9

Please sign in to comment.