Skip to content

Commit 3846384

Browse files
auduchinokKevinRansom
authored andcommitted
Do not check assembly symbols equality by DefinitionRange and name (#4662)
* Do not check assembly symbols equality by DefinitionRange and name Assembly symbols have startup definition range and considered equal. Fixes #4658. * Add test for equality of entities from assemblies with the same name * Add checks for range0 and rangeCmdArgs ranges * Do not run new tests on netcoreapp2.0
1 parent ab48458 commit 3846384

File tree

3 files changed

+71
-7
lines changed

3 files changed

+71
-7
lines changed

src/fsharp/NameResolution.fs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1346,19 +1346,23 @@ let tyconRefDefnHash (_g: TcGlobals) (eref1:EntityRef) =
13461346
hash eref1.LogicalName
13471347

13481348
let tyconRefDefnEq g (eref1:EntityRef) (eref2: EntityRef) =
1349-
tyconRefEq g eref1 eref2
1349+
tyconRefEq g eref1 eref2 ||
1350+
13501351
// Signature items considered equal to implementation items
1351-
|| ((eref1.DefinitionRange = eref2.DefinitionRange || eref1.SigRange = eref2.SigRange) &&
1352-
(eref1.LogicalName = eref2.LogicalName))
1352+
eref1.DefinitionRange <> Range.rangeStartup && eref1.DefinitionRange <> Range.range0 && eref1.DefinitionRange <> Range.rangeCmdArgs &&
1353+
(eref1.DefinitionRange = eref2.DefinitionRange || eref1.SigRange = eref2.SigRange) &&
1354+
eref1.LogicalName = eref2.LogicalName
13531355

1354-
let valRefDefnHash (_g: TcGlobals) (vref1:ValRef)=
1356+
let valRefDefnHash (_g: TcGlobals) (vref1:ValRef) =
13551357
hash vref1.DisplayName
13561358

13571359
let valRefDefnEq g (vref1:ValRef) (vref2: ValRef) =
1358-
valRefEq g vref1 vref2
1360+
valRefEq g vref1 vref2 ||
1361+
13591362
// Signature items considered equal to implementation items
1360-
|| ((vref1.DefinitionRange = vref2.DefinitionRange || vref1.SigRange = vref2.SigRange)) &&
1361-
(vref1.LogicalName = vref2.LogicalName)
1363+
vref1.DefinitionRange <> Range.rangeStartup && vref1.DefinitionRange <> Range.range0 && vref1.DefinitionRange <> Range.rangeCmdArgs &&
1364+
(vref1.DefinitionRange = vref2.DefinitionRange || vref1.SigRange = vref2.SigRange) &&
1365+
vref1.LogicalName = vref2.LogicalName
13621366

13631367
let unionCaseRefDefnEq g (uc1:UnionCaseRef) (uc2: UnionCaseRef) =
13641368
uc1.CaseName = uc2.CaseName && tyconRefDefnEq g uc1.TyconRef uc2.TyconRef

tests/service/CSharpProjectAnalysis.fs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,53 @@ let _ = CSharpClass(0)
146146
Seq.exists (fun (mfv : FSharpMemberOrFunctionOrValue) -> mfv.IsEffectivelySameAs ctor) members |> should be True
147147
| None -> failwith "Expected Some for DeclaringEntity"
148148

149+
let getEntitiesUses source =
150+
let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll"
151+
let results, _ = getProjectReferences(source, [csharpAssembly], None, None)
152+
results.GetAllUsesOfAllSymbols()
153+
|> Async.RunSynchronously
154+
|> Seq.choose (fun su ->
155+
match su.Symbol with
156+
| :? FSharpEntity as entity -> Some entity
157+
| _ -> None)
158+
|> List.ofSeq
159+
160+
[<Test>]
161+
#if NETCOREAPP2_0
162+
[<Ignore("SKIPPED: need to check if these tests can be enabled for .NET Core testing of FSharp.Compiler.Service")>]
163+
#endif
164+
let ``Different types with the same short name equality check`` () =
165+
let source = """
166+
module CtorTest
167+
168+
let (s1: System.String) = null
169+
let (s2: FSharp.Compiler.Service.Tests.String) = null
170+
"""
171+
172+
let stringSymbols =
173+
getEntitiesUses source
174+
|> List.filter (fun entity -> entity.LogicalName = "String")
175+
176+
match stringSymbols with
177+
| e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False
178+
| _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith
179+
180+
[<Test>]
181+
#if NETCOREAPP2_0
182+
[<Ignore("SKIPPED: need to check if these tests can be enabled for .NET Core testing of FSharp.Compiler.Service")>]
183+
#endif
184+
let ``Different namespaces with the same short name equality check`` () =
185+
let source = """
186+
module CtorTest
187+
188+
open System.Linq
189+
open FSharp.Compiler.Service.Tests.Linq
190+
"""
191+
192+
let stringSymbols =
193+
getEntitiesUses source
194+
|> List.filter (fun entity -> entity.LogicalName = "Linq")
195+
196+
match stringSymbols with
197+
| e1 :: e2 :: [] -> e1.IsEffectivelySameAs(e2) |> should be False
198+
| _ -> sprintf "Expecting two symbols, got %A" stringSymbols |> failwith

tests/service/data/CSharp_Analysis/CSharpClass.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,14 @@ public static int StaticMember()
126126
}
127127
}
128128

129+
public class String
130+
{
131+
}
132+
133+
namespace Linq
134+
{
135+
public class DummyClass
136+
{
137+
}
138+
}
129139
}

0 commit comments

Comments
 (0)