From 38d4e3be6360b53c8da06d979ca5ce7b6b6f60b0 Mon Sep 17 00:00:00 2001 From: Alex Berezhnykh Date: Wed, 2 Mar 2022 17:05:51 +0300 Subject: [PATCH 1/2] fixes --- src/fsharp/XmlDoc.fs | 8 ++++-- src/fsharp/pars.fsy | 10 +++---- tests/service/XmlDocTests.fs | 51 +++++++++++++++++++++++++++++++++++- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/fsharp/XmlDoc.fs b/src/fsharp/XmlDoc.fs index 06074635e17..d6adf52caf1 100644 --- a/src/fsharp/XmlDoc.fs +++ b/src/fsharp/XmlDoc.fs @@ -51,8 +51,12 @@ type XmlDoc(unprocessedLines: string[], range: range) = member doc.NonEmpty = not doc.IsEmpty static member Merge (doc1: XmlDoc) (doc2: XmlDoc) = - XmlDoc(Array.append doc1.UnprocessedLines doc2.UnprocessedLines, - unionRanges doc1.Range doc2.Range) + let range = + if doc1.IsEmpty then doc2.Range + elif doc2.IsEmpty then doc1.Range + else unionRanges doc1.Range doc2.Range + + XmlDoc(Array.append doc1.UnprocessedLines doc2.UnprocessedLines, range) member doc.GetXmlText() = if doc.IsEmpty then "" diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 3dc0db1a0d5..ddb9f219e75 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -919,15 +919,15 @@ tyconSpfn: $3 lhsm $1 (Some mEquals) } | typeNameInfo opt_classSpfn { let mWithKwd, members = $2 + let (SynComponentInfo(range=range)) = $1 let m = match members with | [] -> match mWithKwd with - | None -> rhs parseState 1 - | Some mWithKwd -> unionRanges (rhs parseState 1) mWithKwd + | None -> range + | Some mWithKwd -> unionRanges range mWithKwd | decls -> - let (SynComponentInfo(range=start)) = $1 - (start, decls) ||> unionRangeWithListBy (fun (s: SynMemberSig) -> s.Range) + (range, decls) ||> unionRangeWithListBy (fun (s: SynMemberSig) -> s.Range) SynTypeDefnSig($1, None, SynTypeDefnSigRepr.Simple (SynTypeDefnSimpleRepr.None m, m), mWithKwd, members, m) } @@ -1096,7 +1096,7 @@ classMemberSpfn: | opt_attributes opt_declVisibility NEW COLON topTypeWithTypeConstraints { let vis, doc, (ty, valSynInfo) = $2, grabXmlDoc(parseState, $1, 1), $5 - let m = unionRanges (rhs parseState 1) ty.Range + let m = unionRanges (rhs parseState 1) ty.Range |> unionRangeWithXmlDoc doc let isInline = false let valSpfn = SynValSig ($1, mkSynId (rhs parseState 3) "new", noInferredTypars, ty, valSynInfo, isInline, false, doc, vis, None, None, m) SynMemberSig.Member(valSpfn, CtorMemberFlags SynMemberFlagsTrivia.Zero, m) } diff --git a/tests/service/XmlDocTests.fs b/tests/service/XmlDocTests.fs index eeb92a2aa66..4e94e68a467 100644 --- a/tests/service/XmlDocTests.fs +++ b/tests/service/XmlDocTests.fs @@ -484,6 +484,29 @@ type A = class end | x -> failwith $"Unexpected ParsedInput %A{x}") +[] +let ``types 07``(): unit = + let parseResults, checkResults = getParseAndCheckResultsOfSignatureFile """ +module Test + +type A + +///B +and B = int -> int +""" + checkResults + |> checkXmls ["B", [|"B"|]] + + parseResults + |> checkParsingErrors [||] + + match parseResults.ParseTree with + | TypeSigs(_, [SynTypeDefnSig(range = range1); SynTypeDefnSig(range = range2)]) -> + assertRange (4, 5) (4, 6) range1 + assertRange (6, 0) (7, 18) range2 + | x -> + failwith $"Unexpected ParsedInput %A{x}" + [] let ``let bindings 01 - allowed positions``(): unit = let parseResults, checkResults = getParseAndCheckResults """ @@ -865,9 +888,11 @@ type B = |] match parseResults.ParseTree with - | Members(SynMemberDefn.Member(range = range; memberDefn = binding) :: _) -> + | Members(SynMemberDefn.Member(range = range; memberDefn = SynBinding(xmlDoc = xmlDoc) as binding) :: _) -> assertRange (3, 4) (10, 37) range assertRange (3, 4) (8, 37) binding.RangeOfBindingWithRhs + assertRange (3, 4) (4, 9) xmlDoc.Range + assertRange (3, 4) (4, 9) (xmlDoc.ToXmlDoc(false, None).Range) | x -> failwith $"Unexpected ParsedInput %A{x}" @@ -917,6 +942,30 @@ type A ///CTOR1 | x -> failwith $"Unexpected ParsedInput %A{x}" +[] +let ``type members 07 - explicit ctor``(): unit = + let parseResults, checkResults = getParseAndCheckResultsOfSignatureFile """ +module Test + +type A = + ///ctor + new: unit -> A +""" + checkResults + |> checkXmls [ + "A", [||] + ".ctor", [|"ctor"|] + ] + + parseResults + |> checkParsingErrors [||] + + match parseResults.ParseTree with + | MemberSigs([SynMemberSig.Member(range = range)]) -> + assertRange (5, 4) (6, 18) range + | x -> + failwith $"Unexpected ParsedInput %A{x}" + [] let record(): unit = checkSignatureAndImplementation """ From 7a80a8742d4b7417f503d648a10bad99e67f3573 Mon Sep 17 00:00:00 2001 From: Alex Berezhnykh Date: Wed, 2 Mar 2022 17:57:10 +0300 Subject: [PATCH 2/2] fix tests --- tests/service/XmlDocTests.fs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/tests/service/XmlDocTests.fs b/tests/service/XmlDocTests.fs index 4e94e68a467..fe5c8acdf44 100644 --- a/tests/service/XmlDocTests.fs +++ b/tests/service/XmlDocTests.fs @@ -349,14 +349,11 @@ type |] match parseResults.ParseTree with - | Types(range, [TypeRange(typeRange, synComponentRange)]) -> + | Types(range, [TypeRange(typeRange, synComponentRange)]) + | TypeSigs(range, [TypeSigRange(typeRange, synComponentRange)]) -> assertRange (4, 0) (10, 14) range assertRange (4, 0) (10, 14) typeRange assertRange (10, 13) (10, 14) synComponentRange - | TypeSigs(range, [TypeSigRange(typeRange, synComponentRange)]) -> - assertRange (4, 0) (11, 0) range - assertRange (4, 0) (11, 0) typeRange - assertRange (10, 13) (10, 14) synComponentRange | x -> failwith $"Unexpected ParsedInput %A{x}") @@ -1057,7 +1054,7 @@ module M2 = type A match parseResults.ParseTree with | NestedModulesSigs(range1, range2) -> assertRange (2, 0) (6, 30) range1 - assertRange (8, 0) (11, 0) range2 + assertRange (8, 0) (10, 18) range2 | x -> failwith $"Unexpected ParsedInput: %A{x}"