Skip to content

Commit a2743ca

Browse files
authored
Correct range of SynTypeDefnSig. (#11474)
1 parent b2e5b0e commit a2743ca

File tree

5 files changed

+84
-6
lines changed

5 files changed

+84
-6
lines changed

src/fsharp/SyntaxTree.fs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,14 @@ type SynMemberSig =
12201220
nestedType: SynTypeDefnSig *
12211221
range: range
12221222

1223+
member d.Range =
1224+
match d with
1225+
| SynMemberSig.Member (range=m)
1226+
| SynMemberSig.Interface (range=m)
1227+
| SynMemberSig.Inherit (range=m)
1228+
| SynMemberSig.ValField (range=m)
1229+
| SynMemberSig.NestedType (range=m) -> m
1230+
12231231
[<NoEquality; NoComparison; RequireQualifiedAccess>]
12241232
type SynTypeDefnKind =
12251233
| Unspecified

src/fsharp/SyntaxTree.fsi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,9 @@ type SynMemberSig =
14071407
nestedType: SynTypeDefnSig *
14081408
range: range
14091409

1410+
/// Gets the syntax range of this construct
1411+
member Range: range
1412+
14101413
/// Represents the kind of a type definition whether explicit or inferred
14111414
[<NoEquality; NoComparison; RequireQualifiedAccess>]
14121415
type SynTypeDefnKind =

src/fsharp/pars.fsy

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -908,25 +908,30 @@ tyconSpfnRhsBlock:
908908
/* The right-hand-side of a type definition in a signature */
909909
tyconSpfnRhs:
910910
| tyconDefnOrSpfnSimpleRepr
911-
{ let m = $1.Range
912-
(fun lhsm nameInfo augmentation ->
913-
SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.Simple ($1, m), augmentation, m)) }
911+
{ (fun lhsm nameInfo augmentation ->
912+
let declRange = unionRanges lhsm $1.Range
913+
let mWhole = (declRange, augmentation) ||> unionRangeWithListBy (fun (mem: SynMemberSig) -> mem.Range)
914+
SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.Simple ($1, $1.Range), augmentation, mWhole)) }
914915

915916
| tyconClassSpfn
916-
{ let m = lhs parseState
917+
{ let objectModelRange = lhs parseState
917918
let needsCheck, (kind, decls) = $1
918919
(fun nameRange nameInfo augmentation ->
919920
if needsCheck && isNil decls then
920921
reportParseErrorAt nameRange (FSComp.SR.parsEmptyTypeDefinition())
921-
SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel (kind, decls, m), augmentation, m)) }
922+
923+
let declRange = unionRanges nameRange objectModelRange
924+
let mWhole = (declRange, augmentation) ||> unionRangeWithListBy (fun (mem: SynMemberSig) -> mem.Range)
925+
SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel (kind, decls, objectModelRange), augmentation, mWhole)) }
922926

923927
| DELEGATE OF topType
924928
{ let m = lhs parseState
925929
let ty, arity = $3
926930
let invoke = SynMemberSig.Member(SynValSig([], mkSynId m "Invoke", inferredTyparDecls, ty, arity, false, false, PreXmlDoc.Empty, None, None, m), AbstractMemberFlags SynMemberKind.Member, m)
927931
(fun nameRange nameInfo augmentation ->
928932
if not (isNil augmentation) then raiseParseErrorAt m (FSComp.SR.parsAugmentationsIllegalOnDelegateType())
929-
SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel (SynTypeDefnKind.Delegate (ty, arity), [invoke], m), [], m)) }
933+
let mWhole = unionRanges nameRange m
934+
SynTypeDefnSig(nameInfo, SynTypeDefnSigRepr.ObjectModel (SynTypeDefnKind.Delegate (ty, arity), [invoke], m), [], mWhole)) }
930935

931936

932937
/* The right-hand-side of an object type definition in a signature */

tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7253,6 +7253,8 @@ FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig+Member
72537253
FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig+NestedType
72547254
FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig+Tags
72557255
FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig+ValField
7256+
FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Text.Range Range
7257+
FSharp.Compiler.Syntax.SynMemberSig: FSharp.Compiler.Text.Range get_Range()
72567258
FSharp.Compiler.Syntax.SynMemberSig: Int32 Tag
72577259
FSharp.Compiler.Syntax.SynMemberSig: Int32 get_Tag()
72587260
FSharp.Compiler.Syntax.SynMemberSig: System.String ToString()

tests/service/Symbols.fs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,66 @@ type Meh =
553553
assertRange (3, 0) (5,11) r
554554
| _ -> Assert.Fail "Could not get valid AST"
555555

556+
[<Test>]
557+
let ``Range of TypeDefnSig record should end at last member`` () =
558+
let parseResults =
559+
getParseResultsOfSignatureFile
560+
"""namespace X
561+
type MyRecord =
562+
{ Level: int }
563+
member Score : unit -> int"""
564+
565+
match parseResults with
566+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
567+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
568+
assertRange (2, 5) (4, 30) r
569+
| _ -> Assert.Fail "Could not get valid AST"
570+
571+
[<Test>]
572+
let ``Range of TypeDefnSig object model should end at last member`` () =
573+
let parseResults =
574+
getParseResultsOfSignatureFile
575+
"""namespace X
576+
type MyRecord =
577+
class
578+
end
579+
member Score : unit -> int"""
580+
581+
match parseResults with
582+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
583+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
584+
assertRange (2, 5) (5, 30) r
585+
| _ -> Assert.Fail "Could not get valid AST"
586+
587+
[<Test>]
588+
let ``Range of TypeDefnSig delegate of should start from name`` () =
589+
let parseResults =
590+
getParseResultsOfSignatureFile
591+
"""namespace Y
592+
type MyFunction =
593+
delegate of int -> string"""
594+
595+
match parseResults with
596+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
597+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
598+
assertRange (2, 5) (3, 29) r
599+
| _ -> Assert.Fail "Could not get valid AST"
600+
601+
[<Test>]
602+
let ``Range of TypeDefnSig simple should end at last val`` () =
603+
let parseResults =
604+
getParseResultsOfSignatureFile
605+
"""namespace Z
606+
type SomeCollection with
607+
val LastIndex : int
608+
val SomeThingElse : int -> string"""
609+
610+
match parseResults with
611+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
612+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
613+
assertRange (2, 5) (4, 37) r
614+
| _ -> Assert.Fail "Could not get valid AST"
615+
556616
module SynMatchClause =
557617
[<Test>]
558618
let ``Range of single SynMatchClause`` () =

0 commit comments

Comments
 (0)