Skip to content

Commit 70db5b0

Browse files
authored
Correct ranges for nested modules in signature files. (#12585)
* Correct ranges for nested modules in signature files. * Use typeNameInfo and mWithKwd for range of SynTypeDefnSig without members.
1 parent 917051a commit 70db5b0

File tree

2 files changed

+128
-18
lines changed

2 files changed

+128
-18
lines changed

src/fsharp/pars.fsy

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -816,11 +816,10 @@ moduleSpfn:
816816
_xmlDoc.MarkAsInvalid()
817817
let attrs = $1 @ cas
818818
let mTc =
819-
let keywordM = rhs parseState 3
820-
(keywordM, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range) |> unionRanges range
819+
(d3, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range) |> unionRanges range
821820
let xmlDoc = grabXmlDoc(parseState, $1, 1)
822821
let tc = (SynTypeDefnSig(SynComponentInfo(attrs, a, cs, b, xmlDoc, d, d2, d3), equalsRange, typeRepr, withKeyword, members, mTc))
823-
let m = (mTc, $5) ||> unionRangeWithListBy (fun (a: SynTypeDefnSig) -> a.Range)
822+
let m = (mTc, $5) ||> unionRangeWithListBy (fun (a: SynTypeDefnSig) -> a.Range) |> unionRanges (rhs parseState 3)
824823
SynModuleSigDecl.Types (tc :: $5, m) }
825824

826825
| opt_attributes opt_declVisibility exconSpfn
@@ -895,7 +894,16 @@ tyconSpfn:
895894
$3 lhsm $1 (Some mEquals) }
896895
| typeNameInfo opt_classSpfn
897896
{ let mWithKwd, members = $2
898-
SynTypeDefnSig($1, None, SynTypeDefnSigRepr.Simple (SynTypeDefnSimpleRepr.None (lhs parseState), lhs parseState), mWithKwd, members, lhs parseState) }
897+
let m =
898+
match members with
899+
| [] ->
900+
match mWithKwd with
901+
| None -> rhs parseState 1
902+
| Some mWithKwd -> unionRanges (rhs parseState 1) mWithKwd
903+
| decls ->
904+
let (SynComponentInfo(range=start)) = $1
905+
(start, decls) ||> unionRangeWithListBy (fun (s: SynMemberSig) -> s.Range)
906+
SynTypeDefnSig($1, None, SynTypeDefnSigRepr.Simple (SynTypeDefnSimpleRepr.None m, m), mWithKwd, members, m) }
899907

900908

901909
/* The right-hand-side of a type definition in a signature */
@@ -930,8 +938,14 @@ tyconSpfnRhs:
930938
SynTypeDefnSig(nameInfo, mEquals, SynTypeDefnSigRepr.Simple ($1, $1.Range), None, augmentation, mWhole)) }
931939

932940
| tyconClassSpfn
933-
{ let objectModelRange = lhs parseState
934-
let needsCheck, (kind, decls) = $1
941+
{ let needsCheck, (kind, decls) = $1
942+
let objectModelRange =
943+
match decls with
944+
| [] -> lhs parseState
945+
| decls ->
946+
let start = mkSynRange parseState.ResultStartPosition parseState.ResultStartPosition
947+
(start, decls) ||> unionRangeWithListBy (fun (s: SynMemberSig) -> s.Range)
948+
935949
(fun nameRange nameInfo mEquals augmentation ->
936950
if needsCheck && isNil decls then
937951
reportParseErrorAt nameRange (FSComp.SR.parsEmptyTypeDefinition())

tests/service/Symbols.fs

Lines changed: 108 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,8 +1138,9 @@ type MyRecord =
11381138

11391139
match parseResults with
11401140
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
1141-
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
1142-
assertRange (2, 0) (4, 30) r
1141+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types([SynTypeDefnSig.SynTypeDefnSig(range=mSynTypeDefnSig)], mTypes)]) ])) ->
1142+
assertRange (2, 0) (4, 30) mTypes
1143+
assertRange (2, 5) (4, 30) mSynTypeDefnSig
11431144
| _ -> Assert.Fail "Could not get valid AST"
11441145

11451146
[<Test>]
@@ -1154,8 +1155,9 @@ type MyRecord =
11541155

11551156
match parseResults with
11561157
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
1157-
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
1158-
assertRange (2, 0) (5, 30) r
1158+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types([SynTypeDefnSig.SynTypeDefnSig(range=mSynTypeDefnSig)], mTypes)]) ])) ->
1159+
assertRange (2, 0) (5, 30) mTypes
1160+
assertRange (2, 5) (5, 30) mSynTypeDefnSig
11591161
| _ -> Assert.Fail "Could not get valid AST"
11601162

11611163
[<Test>]
@@ -1168,8 +1170,9 @@ type MyFunction =
11681170

11691171
match parseResults with
11701172
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
1171-
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
1172-
assertRange (2, 0) (3, 29) r
1173+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types([SynTypeDefnSig.SynTypeDefnSig(range=mSynTypeDefnSig)], mTypes) ]) ])) ->
1174+
assertRange (2, 0) (3, 29) mTypes
1175+
assertRange (2, 5) (3, 29) mSynTypeDefnSig
11731176
| _ -> Assert.Fail "Could not get valid AST"
11741177

11751178
[<Test>]
@@ -1183,8 +1186,9 @@ type SomeCollection with
11831186

11841187
match parseResults with
11851188
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
1186-
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [SynTypeDefnSig.SynTypeDefnSig(range = r)])]) ])) ->
1187-
assertRange (2, 0) (4, 37) r
1189+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types([SynTypeDefnSig.SynTypeDefnSig(range=mSynTypeDefnSig)], mTypes)]) ])) ->
1190+
assertRange (2, 0) (4, 37) mTypes
1191+
assertRange (2, 5) (4, 37) mSynTypeDefnSig
11881192
| _ -> Assert.Fail "Could not get valid AST"
11891193

11901194
[<Test>]
@@ -1227,13 +1231,13 @@ and [<CustomEquality>] Bang =
12271231

12281232
match parseResults with
12291233
| ParsedInput.SigFile (ParsedSigFileInput (modules = [
1230-
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types(types = [
1234+
SynModuleOrNamespaceSig(decls = [SynModuleSigDecl.Types([
12311235
SynTypeDefnSig.SynTypeDefnSig(range = r1)
12321236
SynTypeDefnSig.SynTypeDefnSig(range = r2)
1233-
]) as t]) ])) ->
1234-
assertRange (4, 0) (5, 9) r1
1237+
], mTypes)]) ])) ->
1238+
assertRange (4, 5) (5, 9) r1
12351239
assertRange (7, 4) (12, 42) r2
1236-
assertRange (4, 0) (12, 42) t.Range
1240+
assertRange (4, 0) (12, 42) mTypes
12371241
| _ -> Assert.Fail "Could not get valid AST"
12381242

12391243
[<Test>]
@@ -1717,6 +1721,98 @@ module X =
17171721
assertRange (4, 9) (4, 10) equalsM
17181722
| _ -> Assert.Fail "Could not get valid AST"
17191723

1724+
[<Test>]
1725+
let ``Range of nested module in signature file should end at the last SynModuleSigDecl`` () =
1726+
let parseResults =
1727+
getParseResultsOfSignatureFile
1728+
"""namespace Microsoft.FSharp.Core
1729+
1730+
open System
1731+
open System.Collections.Generic
1732+
open Microsoft.FSharp.Core
1733+
open Microsoft.FSharp.Collections
1734+
open System.Collections
1735+
1736+
1737+
module Tuple =
1738+
1739+
type Tuple<'T1,'T2,'T3,'T4> =
1740+
interface IStructuralEquatable
1741+
interface IStructuralComparable
1742+
interface IComparable
1743+
new : 'T1 * 'T2 * 'T3 * 'T4 -> Tuple<'T1,'T2,'T3,'T4>
1744+
member Item1 : 'T1 with get
1745+
member Item2 : 'T2 with get
1746+
member Item3 : 'T3 with get
1747+
member Item4 : 'T4 with get
1748+
1749+
1750+
module Choice =
1751+
1752+
/// <summary>Helper types for active patterns with 6 choices.</summary>
1753+
[<StructuralEquality; StructuralComparison>]
1754+
[<CompiledName("FSharpChoice`6")>]
1755+
type Choice<'T1,'T2,'T3,'T4,'T5,'T6> =
1756+
/// <summary>Choice 1 of 6 choices</summary>
1757+
| Choice1Of6 of 'T1
1758+
/// <summary>Choice 2 of 6 choices</summary>
1759+
| Choice2Of6 of 'T2
1760+
/// <summary>Choice 3 of 6 choices</summary>
1761+
| Choice3Of6 of 'T3
1762+
/// <summary>Choice 4 of 6 choices</summary>
1763+
| Choice4Of6 of 'T4
1764+
/// <summary>Choice 5 of 6 choices</summary>
1765+
| Choice5Of6 of 'T5
1766+
/// <summary>Choice 6 of 6 choices</summary>
1767+
| Choice6Of6 of 'T6
1768+
1769+
1770+
1771+
/// <summary>Basic F# Operators. This module is automatically opened in all F# code.</summary>
1772+
[<AutoOpen>]
1773+
module Operators =
1774+
1775+
type ``[,]``<'T> with
1776+
[<CompiledName("Length1")>]
1777+
/// <summary>Get the length of an array in the first dimension </summary>
1778+
member Length1 : int
1779+
[<CompiledName("Length2")>]
1780+
/// <summary>Get the length of the array in the second dimension </summary>
1781+
member Length2 : int
1782+
[<CompiledName("Base1")>]
1783+
/// <summary>Get the lower bound of the array in the first dimension </summary>
1784+
member Base1 : int
1785+
[<CompiledName("Base2")>]
1786+
/// <summary>Get the lower bound of the array in the second dimension </summary>
1787+
member Base2 : int
1788+
"""
1789+
1790+
match parseResults with
1791+
| ParsedInput.SigFile (ParsedSigFileInput (modules = [ SynModuleOrNamespaceSig(decls = [
1792+
SynModuleSigDecl.Open _
1793+
SynModuleSigDecl.Open _
1794+
SynModuleSigDecl.Open _
1795+
SynModuleSigDecl.Open _
1796+
SynModuleSigDecl.Open _
1797+
SynModuleSigDecl.NestedModule(range=mTupleModule; moduleDecls=[ SynModuleSigDecl.Types([
1798+
SynTypeDefnSig(typeRepr=SynTypeDefnSigRepr.ObjectModel(range=mTupleObjectModel); range=mTupleType)
1799+
], mTupleTypes) ])
1800+
SynModuleSigDecl.NestedModule(range=mChoiceModule)
1801+
SynModuleSigDecl.NestedModule(range=mOperatorsModule; moduleDecls=[ SynModuleSigDecl.Types([
1802+
SynTypeDefnSig(typeRepr=SynTypeDefnSigRepr.Simple(range=mAugmentationSimple); range=mAugmentation)
1803+
], mOperatorsTypes) ])
1804+
]) ])) ->
1805+
assertRange (10, 0) (20, 35) mTupleModule
1806+
assertRange (12, 4) (20, 35) mTupleTypes
1807+
assertRange (12, 9) (20, 35) mTupleType
1808+
assertRange (13, 8) (20, 35) mTupleObjectModel
1809+
assertRange (23, 0) (40, 25) mChoiceModule
1810+
assertRange (45, 0) (60, 26) mOperatorsModule
1811+
assertRange (48, 4) (60, 26) mOperatorsTypes
1812+
assertRange (48, 9) (60, 26) mAugmentation
1813+
assertRange (48, 9) (60, 26) mAugmentationSimple
1814+
| _ -> Assert.Fail "Could not get valid AST"
1815+
17201816
module SynBindings =
17211817
[<Test>]
17221818
let ``Range of attribute should be included in SynModuleDecl.Let`` () =

0 commit comments

Comments
 (0)