Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/fsharp/XmlDoc.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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 ""
Expand Down
10 changes: 5 additions & 5 deletions src/fsharp/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -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) }


Expand Down Expand Up @@ -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) }
Expand Down
60 changes: 53 additions & 7 deletions tests/service/XmlDocTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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}")

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

[<Test>]
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}"

[<Test>]
let ``let bindings 01 - allowed positions``(): unit =
let parseResults, checkResults = getParseAndCheckResults """
Expand Down Expand Up @@ -865,9 +885,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}"

Expand Down Expand Up @@ -917,6 +939,30 @@ type A ///CTOR1
| x ->
failwith $"Unexpected ParsedInput %A{x}"

[<Test>]
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}"

[<Test>]
let record(): unit =
checkSignatureAndImplementation """
Expand Down Expand Up @@ -1008,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}"

Expand Down