Skip to content

Commit 251e2b7

Browse files
committed
Include attributes in range of SynTypeDefnSig, SynModuleSigDecl.NestedModule and SynValSpfn.
1 parent b1fa258 commit 251e2b7

File tree

2 files changed

+107
-8
lines changed

2 files changed

+107
-8
lines changed

src/fsharp/pars.fsy

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -803,17 +803,20 @@ moduleSpfn:
803803
if isRec then raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsInvalidUseOfRec())
804804
let info = SynComponentInfo($1, [], [], path, xml, false, vis, rhs parseState 3)
805805
if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
806-
SynModuleSigDecl.NestedModule(info, isRec, $5, rhs2 parseState 1 5) }
806+
let m = (rhs2 parseState 1 4, $5) ||> unionRangeWithListBy (fun (d: SynModuleSigDecl) -> d.Range)
807+
SynModuleSigDecl.NestedModule(info, isRec, $5, m) }
807808

808809
| opt_attributes opt_declVisibility tyconSpfns
809810
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
810811
let (SynTypeDefnSig(SynComponentInfo(cas, a, cs, b, c, d, d2, d3), e, f, g)), rest =
811812
match $3 with
812813
| [] -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEmptyModuleDefn())
813814
| h :: t -> h, t
814-
let tc = (SynTypeDefnSig(SynComponentInfo($1@cas, a, cs, b, c, d, d2, d3), e, f, g))
815+
let attrs = $1@cas
816+
let mTc = (g, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
817+
let tc = (SynTypeDefnSig(SynComponentInfo(attrs, a, cs, b, c, d, d2, d3), e, f, mTc))
815818
let lastType = List.tryLast rest |> Option.defaultValue tc |> fun t -> t.Range
816-
let m = mkRange lastType.FileName (lhs parseState).Start lastType.End
819+
let m = mkRange lastType.FileName mTc.Start lastType.End
817820
SynModuleSigDecl.Types (tc :: rest, m) }
818821

819822
| opt_attributes opt_declVisibility exconSpfn
@@ -1009,6 +1012,7 @@ classMemberSpfn:
10091012
match getSetRangeOpt with
10101013
| None -> unionRanges m ty.Range
10111014
| Some m2 -> unionRanges m m2
1015+
|> fun m -> (m, $1) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
10121016
let valSpfn = SynValSig($1, id, explicitValTyparDecls, ty, arity, isInline, false, doc, vis2, optLiteralValue, wholeRange)
10131017
let _, flags = $3
10141018
SynMemberSig.Member(valSpfn, flags (getSetAdjuster arity), wholeRange) }

tests/service/Symbols.fs

Lines changed: 100 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -596,11 +596,11 @@ type Meh =
596596
match parseResults with
597597
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
598598
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(range = r)]) ])) ->
599-
assertRange (3, 0) (5,11) r
599+
assertRange (3, 5) (5,11) r
600600
| _ -> Assert.Fail "Could not get valid AST"
601601

602602
[<Test>]
603-
let ``Range of TypeDefnSig record should end at last member`` () =
603+
let ``Range of SynTypeDefnSig record should end at last member`` () =
604604
let parseResults =
605605
getParseResultsOfSignatureFile
606606
"""namespace X
@@ -615,7 +615,7 @@ type MyRecord =
615615
| _ -> Assert.Fail "Could not get valid AST"
616616

617617
[<Test>]
618-
let ``Range of TypeDefnSig object model should end at last member`` () =
618+
let ``Range of SynTypeDefnSig object model should end at last member`` () =
619619
let parseResults =
620620
getParseResultsOfSignatureFile
621621
"""namespace X
@@ -631,7 +631,7 @@ type MyRecord =
631631
| _ -> Assert.Fail "Could not get valid AST"
632632

633633
[<Test>]
634-
let ``Range of TypeDefnSig delegate of should start from name`` () =
634+
let ``Range of SynTypeDefnSig delegate of should start from name`` () =
635635
let parseResults =
636636
getParseResultsOfSignatureFile
637637
"""namespace Y
@@ -645,7 +645,7 @@ type MyFunction =
645645
| _ -> Assert.Fail "Could not get valid AST"
646646

647647
[<Test>]
648-
let ``Range of TypeDefnSig simple should end at last val`` () =
648+
let ``Range of SynTypeDefnSig simple should end at last val`` () =
649649
let parseResults =
650650
getParseResultsOfSignatureFile
651651
"""namespace Z
@@ -659,6 +659,79 @@ type SomeCollection with
659659
assertRange (2, 5) (4, 37) r
660660
| _ -> Assert.Fail "Could not get valid AST"
661661

662+
[<Test>]
663+
let ``Range of attribute should be included in SynTypeDefnSig`` () =
664+
let parseResults =
665+
getParseResultsOfSignatureFile
666+
"""
667+
namespace SomeNamespace
668+
669+
[<Foo1>]
670+
type MyType =
671+
class
672+
end
673+
"""
674+
675+
match parseResults with
676+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
677+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)]) as t]) ])) ->
678+
assertRange (4, 0) (7, 7) r
679+
assertRange (4, 0) (7, 7) t.Range
680+
| _ -> Assert.Fail "Could not get valid AST"
681+
682+
[<Test>]
683+
let ``Range of attributes should be included in recursive types`` () =
684+
let parseResults =
685+
getParseResultsOfSignatureFile
686+
"""
687+
namespace SomeNamespace
688+
689+
type Foo =
690+
| Bar
691+
692+
and [<CustomEquality>] Bang =
693+
internal
694+
{
695+
LongNameBarBarBarBarBarBarBar: int
696+
}
697+
override GetHashCode : unit -> int
698+
"""
699+
700+
match parseResults with
701+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
702+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [
703+
SynTypeDefnSig.SynTypeDefnSig(range = r1)
704+
SynTypeDefnSig.SynTypeDefnSig(range = r2)
705+
]) as t]) ])) ->
706+
assertRange (4, 5) (5, 9) r1
707+
assertRange (7, 4) (12, 42) r2
708+
assertRange (4, 5) (12, 42) t.Range
709+
| _ -> Assert.Fail "Could not get valid AST"
710+
711+
[<Test>]
712+
let ``Range of attribute should be included in SynValSpfn and Member`` () =
713+
let parseResults =
714+
getParseResultsOfSignatureFile
715+
"""
716+
namespace SomeNamespace
717+
718+
type FooType =
719+
[<Foo2>] // ValSpfn
720+
abstract x : int
721+
"""
722+
723+
match parseResults with
724+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
725+
SynModuleOrNamespaceSig(decls =
726+
[ SynModuleSigDecl.Types(types = [
727+
SynTypeDefnSig.SynTypeDefnSig(typeRepr =
728+
SynTypeDefnSigRepr.ObjectModel(memberSigs = [
729+
SynMemberSig.Member(range = mr; memberSig = SynValSig(range = mv)) ]))
730+
]) ]) ])) ->
731+
assertRange (5, 4) (6, 20) mr
732+
assertRange (5, 4) (6, 20) mv
733+
| _ -> Assert.Fail "Could not get valid AST"
734+
662735
module SynMatchClause =
663736
[<Test>]
664737
let ``Range of single SynMatchClause`` () =
@@ -807,4 +880,26 @@ __SOURCE_FILE__"""
807880
SynModuleDecl.DoExpr(expr = SynExpr.Const(SynConst.SourceIdentifier("__SOURCE_FILE__", _, range), _))
808881
]) ])) ->
809882
assertRange (2, 0) (2, 15) range
883+
| _ -> Assert.Fail "Could not get valid AST"
884+
885+
module NestedModules =
886+
887+
[<Test>]
888+
let ``Range of attribute should be included in SynModuleSigDecl.NestedModule`` () =
889+
let parseResults =
890+
getParseResultsOfSignatureFile
891+
"""
892+
namespace SomeNamespace
893+
894+
[<Foo>]
895+
module Nested =
896+
val x : int
897+
"""
898+
899+
match parseResults with
900+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [ SynModuleOrNamespaceSig(decls = [
901+
SynModuleSigDecl.NestedModule _ as nm
902+
]) as sigModule ])) ->
903+
assertRange (4, 0) (6, 15) nm.Range
904+
assertRange (2, 0) (6, 15) sigModule.Range
810905
| _ -> Assert.Fail "Could not get valid AST"

0 commit comments

Comments
 (0)