Skip to content

Commit 05d26de

Browse files
authored
XmlDoc fixes (dotnet#12783)
* fixes * fix tests
1 parent d016807 commit 05d26de

File tree

3 files changed

+64
-14
lines changed

3 files changed

+64
-14
lines changed

src/fsharp/XmlDoc.fs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,12 @@ type XmlDoc(unprocessedLines: string[], range: range) =
5151
member doc.NonEmpty = not doc.IsEmpty
5252

5353
static member Merge (doc1: XmlDoc) (doc2: XmlDoc) =
54-
XmlDoc(Array.append doc1.UnprocessedLines doc2.UnprocessedLines,
55-
unionRanges doc1.Range doc2.Range)
54+
let range =
55+
if doc1.IsEmpty then doc2.Range
56+
elif doc2.IsEmpty then doc1.Range
57+
else unionRanges doc1.Range doc2.Range
58+
59+
XmlDoc(Array.append doc1.UnprocessedLines doc2.UnprocessedLines, range)
5660

5761
member doc.GetXmlText() =
5862
if doc.IsEmpty then ""

src/fsharp/pars.fsy

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -919,15 +919,15 @@ tyconSpfn:
919919
$3 lhsm $1 (Some mEquals) }
920920
| typeNameInfo opt_classSpfn
921921
{ let mWithKwd, members = $2
922+
let (SynComponentInfo(range=range)) = $1
922923
let m =
923924
match members with
924925
| [] ->
925926
match mWithKwd with
926-
| None -> rhs parseState 1
927-
| Some mWithKwd -> unionRanges (rhs parseState 1) mWithKwd
927+
| None -> range
928+
| Some mWithKwd -> unionRanges range mWithKwd
928929
| decls ->
929-
let (SynComponentInfo(range=start)) = $1
930-
(start, decls) ||> unionRangeWithListBy (fun (s: SynMemberSig) -> s.Range)
930+
(range, decls) ||> unionRangeWithListBy (fun (s: SynMemberSig) -> s.Range)
931931
SynTypeDefnSig($1, None, SynTypeDefnSigRepr.Simple (SynTypeDefnSimpleRepr.None m, m), mWithKwd, members, m) }
932932

933933

@@ -1096,7 +1096,7 @@ classMemberSpfn:
10961096

10971097
| opt_attributes opt_declVisibility NEW COLON topTypeWithTypeConstraints
10981098
{ let vis, doc, (ty, valSynInfo) = $2, grabXmlDoc(parseState, $1, 1), $5
1099-
let m = unionRanges (rhs parseState 1) ty.Range
1099+
let m = unionRanges (rhs parseState 1) ty.Range |> unionRangeWithXmlDoc doc
11001100
let isInline = false
11011101
let valSpfn = SynValSig ($1, mkSynId (rhs parseState 3) "new", noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, None, m)
11021102
SynMemberSig.Member(valSpfn, CtorMemberFlags SynMemberFlagsTrivia.Zero, m) }

tests/service/XmlDocTests.fs

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -349,14 +349,11 @@ type
349349
|]
350350

351351
match parseResults.ParseTree with
352-
| Types(range, [TypeRange(typeRange, synComponentRange)]) ->
352+
| Types(range, [TypeRange(typeRange, synComponentRange)])
353+
| TypeSigs(range, [TypeSigRange(typeRange, synComponentRange)]) ->
353354
assertRange (4, 0) (10, 14) range
354355
assertRange (4, 0) (10, 14) typeRange
355356
assertRange (10, 13) (10, 14) synComponentRange
356-
| TypeSigs(range, [TypeSigRange(typeRange, synComponentRange)]) ->
357-
assertRange (4, 0) (11, 0) range
358-
assertRange (4, 0) (11, 0) typeRange
359-
assertRange (10, 13) (10, 14) synComponentRange
360357
| x ->
361358
failwith $"Unexpected ParsedInput %A{x}")
362359

@@ -484,6 +481,29 @@ type A = class end
484481
| x ->
485482
failwith $"Unexpected ParsedInput %A{x}")
486483

484+
[<Test>]
485+
let ``types 07``(): unit =
486+
let parseResults, checkResults = getParseAndCheckResultsOfSignatureFile """
487+
module Test
488+
489+
type A
490+
491+
///B
492+
and B = int -> int
493+
"""
494+
checkResults
495+
|> checkXmls ["B", [|"B"|]]
496+
497+
parseResults
498+
|> checkParsingErrors [||]
499+
500+
match parseResults.ParseTree with
501+
| TypeSigs(_, [SynTypeDefnSig(range = range1); SynTypeDefnSig(range = range2)]) ->
502+
assertRange (4, 5) (4, 6) range1
503+
assertRange (6, 0) (7, 18) range2
504+
| x ->
505+
failwith $"Unexpected ParsedInput %A{x}"
506+
487507
[<Test>]
488508
let ``let bindings 01 - allowed positions``(): unit =
489509
let parseResults, checkResults = getParseAndCheckResults """
@@ -865,9 +885,11 @@ type B =
865885
|]
866886

867887
match parseResults.ParseTree with
868-
| Members(SynMemberDefn.Member(range = range; memberDefn = binding) :: _) ->
888+
| Members(SynMemberDefn.Member(range = range; memberDefn = SynBinding(xmlDoc = xmlDoc) as binding) :: _) ->
869889
assertRange (3, 4) (10, 37) range
870890
assertRange (3, 4) (8, 37) binding.RangeOfBindingWithRhs
891+
assertRange (3, 4) (4, 9) xmlDoc.Range
892+
assertRange (3, 4) (4, 9) (xmlDoc.ToXmlDoc(false, None).Range)
871893
| x ->
872894
failwith $"Unexpected ParsedInput %A{x}"
873895

@@ -917,6 +939,30 @@ type A ///CTOR1
917939
| x ->
918940
failwith $"Unexpected ParsedInput %A{x}"
919941

942+
[<Test>]
943+
let ``type members 07 - explicit ctor``(): unit =
944+
let parseResults, checkResults = getParseAndCheckResultsOfSignatureFile """
945+
module Test
946+
947+
type A =
948+
///ctor
949+
new: unit -> A
950+
"""
951+
checkResults
952+
|> checkXmls [
953+
"A", [||]
954+
".ctor", [|"ctor"|]
955+
]
956+
957+
parseResults
958+
|> checkParsingErrors [||]
959+
960+
match parseResults.ParseTree with
961+
| MemberSigs([SynMemberSig.Member(range = range)]) ->
962+
assertRange (5, 4) (6, 18) range
963+
| x ->
964+
failwith $"Unexpected ParsedInput %A{x}"
965+
920966
[<Test>]
921967
let record(): unit =
922968
checkSignatureAndImplementation """
@@ -1008,7 +1054,7 @@ module M2 = type A
10081054
match parseResults.ParseTree with
10091055
| NestedModulesSigs(range1, range2) ->
10101056
assertRange (2, 0) (6, 30) range1
1011-
assertRange (8, 0) (11, 0) range2
1057+
assertRange (8, 0) (10, 18) range2
10121058
| x ->
10131059
failwith $"Unexpected ParsedInput: %A{x}"
10141060

0 commit comments

Comments
 (0)