Skip to content

Commit bb9fb78

Browse files
committed
Merge branch 'master' of https://github.com/fsharp/FSharp.Compiler.Service into fix-exprs
2 parents 52b104d + 4482d67 commit bb9fb78

File tree

3 files changed

+81
-4
lines changed

3 files changed

+81
-4
lines changed

src/fsharp/tast.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3197,7 +3197,7 @@ and UnionCaseRef =
31973197

31983198
member x.DefinitionRange = x.UnionCase.DefinitionRange
31993199

3200-
member x.SigRange = x.UnionCase.DefinitionRange
3200+
member x.SigRange = x.UnionCase.SigRange
32013201

32023202
member x.Index =
32033203
try
@@ -3227,7 +3227,7 @@ and RecdFieldRef =
32273227

32283228
member x.DefinitionRange = x.RecdField.DefinitionRange
32293229

3230-
member x.SigRange = x.RecdField.DefinitionRange
3230+
member x.SigRange = x.RecdField.SigRange
32313231

32323232
member x.Index =
32333233
let (RFRef(tcref,id)) = x

src/fsharp/vs/Symbols.fs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1839,13 +1839,27 @@ and FSharpType(cenv, typ:TType) =
18391839
member private typ.AdjustType(t) =
18401840
FSharpType(typ.cenv, t)
18411841

1842+
// Note: This equivalence relation is modulo type abbreviations
18421843
override x.Equals(other : obj) =
18431844
box x === other ||
18441845
match other with
18451846
| :? FSharpType as t -> typeEquiv cenv.g typ t.V
18461847
| _ -> false
18471848

1848-
override x.GetHashCode() = hash x
1849+
// Note: This equivalence relation is modulo type abbreviations. The hash is less than perfect.
1850+
override x.GetHashCode() =
1851+
let rec hashType typ =
1852+
let typ = stripTyEqnsWrtErasure EraseNone cenv.g typ
1853+
match typ with
1854+
| TType_forall _ -> 10000
1855+
| TType_var tp -> 10100 + int32 tp.Stamp
1856+
| TType_app (tc1,b1) -> 10200 + int32 tc1.Stamp + List.sumBy hashType b1
1857+
| TType_ucase _ -> 10300 // shouldn't occur in symbols
1858+
| TType_tuple l1 -> 10400 + List.sumBy hashType l1
1859+
| TType_fun (dty,rty) -> 10500 + hashType dty + hashType rty
1860+
| TType_measure _ -> 10600
1861+
hashType typ
1862+
18491863

18501864
member x.Format(denv: FSharpDisplayContext) =
18511865
protect <| fun () ->

tests/service/ProjectAnalysisTests.fs

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2689,6 +2689,67 @@ let ``Test Project16 sig symbols are equal to impl symbols`` () =
26892689
testFind ("implementation", symbolsImpl) ("implementation", symbolsImpl) // of course this should pass...
26902690
testFind ("signature", symbolsSig) ("signature", symbolsSig) // of course this should pass...
26912691

2692+
[<Test>]
2693+
let ``Test Project16 sym locations`` () =
2694+
2695+
let wholeProjectResults = checker.ParseAndCheckProject(Project16.options) |> Async.RunSynchronously
2696+
2697+
let fmtLoc (mOpt: Range.range option) =
2698+
match mOpt with
2699+
| None -> None
2700+
| Some m ->
2701+
let file = Project16.cleanFileName m.FileName
2702+
if file = "??" then None
2703+
else Some (file, (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn ))
2704+
2705+
let allUsesOfAllSymbols =
2706+
wholeProjectResults.GetAllUsesOfAllSymbols()
2707+
|> Async.RunSynchronously
2708+
|> Array.choose (fun su ->
2709+
match fmtLoc su.Symbol.SignatureLocation, fmtLoc su.Symbol.DeclarationLocation, fmtLoc su.Symbol.ImplementationLocation with
2710+
| Some a, Some b, Some c -> Some (su.Symbol.ToString(), a, b, c)
2711+
| _ -> None)
2712+
2713+
allUsesOfAllSymbols |> shouldEqual
2714+
[|("field Field1", ("sig1", (16, 10), (16, 16)),("sig1", (16, 10), (16, 16)), ("file1", (13, 10), (13, 16)));
2715+
("field Field2", ("sig1", (16, 24), (16, 30)),("sig1", (16, 24), (16, 30)), ("file1", (13, 24), (13, 30)));
2716+
("Case1", ("sig1", (17, 8), (17, 13)), ("sig1", (17, 8), (17, 13)),("file1", (14, 8), (14, 13)));
2717+
("Case2", ("sig1", (17, 16), (17, 21)), ("sig1", (17, 16), (17, 21)),("file1", (14, 16), (14, 21)));
2718+
("C", ("sig1", (4, 5), (4, 6)), ("sig1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6)));
2719+
("C", ("sig1", (4, 5), (4, 6)), ("sig1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6)));
2720+
("member .ctor", ("sig1", (5, 4), (5, 7)), ("sig1", (5, 4), (5, 7)),("file1", (4, 5), (4, 6)));
2721+
("member get_PC", ("sig1", (6, 11), (6, 13)), ("sig1", (6, 11), (6, 13)),("file1", (5, 13), (5, 15)));
2722+
("D", ("sig1", (8, 14), (8, 15)), ("sig1", (8, 14), (8, 15)),("file1", (7, 4), (7, 5)));
2723+
("D", ("sig1", (8, 14), (8, 15)), ("sig1", (8, 14), (8, 15)),("file1", (7, 4), (7, 5)));
2724+
("member .ctor", ("sig1", (9, 4), (9, 7)), ("sig1", (9, 4), (9, 7)),("file1", (7, 4), (7, 5)));
2725+
("member get_PD", ("sig1", (10, 11), (10, 13)),("sig1", (10, 11), (10, 13)), ("file1", (8, 13), (8, 15)));
2726+
("E", ("sig1", (12, 14), (12, 15)), ("sig1", (12, 14), (12, 15)),("file1", (10, 4), (10, 5)));
2727+
("E", ("sig1", (12, 14), (12, 15)), ("sig1", (12, 14), (12, 15)),("file1", (10, 4), (10, 5)));
2728+
("member .ctor", ("sig1", (13, 4), (13, 7)), ("sig1", (13, 4), (13, 7)),("file1", (10, 4), (10, 5)));
2729+
("member get_PE", ("sig1", (14, 11), (14, 13)),("sig1", (14, 11), (14, 13)), ("file1", (11, 13), (11, 15)));
2730+
("F", ("sig1", (16, 4), (16, 5)), ("sig1", (16, 4), (16, 5)),("file1", (13, 4), (13, 5)));
2731+
("G", ("sig1", (17, 4), (17, 5)), ("sig1", (17, 4), (17, 5)),("file1", (14, 4), (14, 5)));
2732+
("Impl", ("sig1", (2, 7), (2, 11)), ("sig1", (2, 7), (2, 11)),("file1", (2, 7), (2, 11)));
2733+
("field Field1", ("sig1", (16, 10), (16, 16)),("file1", (13, 10), (13, 16)), ("file1", (13, 10), (13, 16)));
2734+
("field Field2", ("sig1", (16, 24), (16, 30)),("file1", (13, 24), (13, 30)), ("file1", (13, 24), (13, 30)));
2735+
("Case1", ("sig1", (17, 8), (17, 13)), ("file1", (14, 8), (14, 13)),("file1", (14, 8), (14, 13)));
2736+
("Case2", ("sig1", (17, 16), (17, 21)), ("file1", (14, 16), (14, 21)),("file1", (14, 16), (14, 21)));
2737+
("C", ("sig1", (4, 5), (4, 6)), ("file1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6)));
2738+
("D", ("sig1", (8, 14), (8, 15)), ("file1", (7, 4), (7, 5)),("file1", (7, 4), (7, 5)));
2739+
("E", ("sig1", (12, 14), (12, 15)), ("file1", (10, 4), (10, 5)),("file1", (10, 4), (10, 5)));
2740+
("F", ("sig1", (16, 4), (16, 5)), ("file1", (13, 4), (13, 5)),("file1", (13, 4), (13, 5)));
2741+
("G", ("sig1", (17, 4), (17, 5)), ("file1", (14, 4), (14, 5)),("file1", (14, 4), (14, 5)));
2742+
("member .ctor", ("sig1", (5, 4), (5, 7)), ("file1", (4, 5), (4, 6)),("file1", (4, 5), (4, 6)));
2743+
("member get_PC", ("sig1", (6, 11), (6, 13)), ("file1", (5, 13), (5, 15)),("file1", (5, 13), (5, 15)));
2744+
("member .ctor", ("sig1", (9, 4), (9, 7)), ("file1", (7, 4), (7, 5)),("file1", (7, 4), (7, 5)));
2745+
("member get_PD", ("sig1", (10, 11), (10, 13)),("file1", (8, 13), (8, 15)), ("file1", (8, 13), (8, 15)));
2746+
("member .ctor", ("sig1", (13, 4), (13, 7)), ("file1", (10, 4), (10, 5)),("file1", (10, 4), (10, 5)));
2747+
("member get_PE", ("sig1", (14, 11), (14, 13)),("file1", (11, 13), (11, 15)), ("file1", (11, 13), (11, 15)));
2748+
("val x", ("file1", (5, 11), (5, 12)), ("file1", (5, 11), (5, 12)),("file1", (5, 11), (5, 12)));
2749+
("val x", ("file1", (8, 11), (8, 12)), ("file1", (8, 11), (8, 12)),("file1", (8, 11), (8, 12)));
2750+
("val x", ("file1", (11, 11), (11, 12)), ("file1", (11, 11), (11, 12)),("file1", (11, 11), (11, 12)));
2751+
("Impl", ("sig1", (2, 7), (2, 11)), ("file1", (2, 7), (2, 11)),("file1", (2, 7), (2, 11)))|]
2752+
26922753

26932754

26942755
//-----------------------------------------------------------------------------------------
@@ -4691,7 +4752,9 @@ type A<'XX, 'YY>() =
46914752
[<Test>]
46924753
let ``Test project38 abstract slot information`` () =
46934754
let printAbstractSignature (s: FSharpAbstractSignature) =
4694-
let printType (t: FSharpType) = (string t).[5 ..]
4755+
let printType (t: FSharpType) =
4756+
hash t |> ignore // smoke test to check hash code doesn't loop
4757+
(string t).[5 ..]
46954758
let args =
46964759
(s.AbstractArguments |> Seq.concat |> Seq.map (fun a ->
46974760
(match a.Name with Some n -> n + ":" | _ -> "") + printType a.Type) |> String.concat " * ")

0 commit comments

Comments
 (0)