From 442481f44ec4cb1a4c5dd19c30c4b1280a0ca5a1 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Mon, 29 May 2023 11:03:22 +0200 Subject: [PATCH 1/4] Fix navigation for external enums, DUs and name resultion for members --- src/Compiler/Symbols/Symbols.fs | 4 +++ src/Compiler/Symbols/Symbols.fsi | 3 +++ .../Navigation/GoToDefinition.fs | 26 ++++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Compiler/Symbols/Symbols.fs b/src/Compiler/Symbols/Symbols.fs index 8595d61bf1..a7baed599b 100644 --- a/src/Compiler/Symbols/Symbols.fs +++ b/src/Compiler/Symbols/Symbols.fs @@ -988,6 +988,10 @@ type FSharpUnionCase(cenv, v: UnionCaseRef) = checkIsResolved() v.Range + member _.DeclaringEntity = + checkIsResolved() + FSharpEntity(cenv, v.TyconRef) + member _.HasFields = if isUnresolved() then false else v.UnionCase.RecdFieldsArray.Length <> 0 diff --git a/src/Compiler/Symbols/Symbols.fsi b/src/Compiler/Symbols/Symbols.fsi index 44e215e521..418b42b03d 100644 --- a/src/Compiler/Symbols/Symbols.fsi +++ b/src/Compiler/Symbols/Symbols.fsi @@ -454,6 +454,9 @@ type FSharpUnionCase = /// Get the range of the name of the case member DeclarationLocation: range + /// Get the declaring entity of the case + member DeclaringEntity: FSharpEntity + /// Indicates if the union case has field definitions member HasFields: bool diff --git a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs index 8eea7460ba..44a7eb6259 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs @@ -467,12 +467,23 @@ type internal GoToDefinition(metadataAsSource: FSharpMetadataAsSourceService) = use __ = statusBar.Animate() statusBar.Message(SR.NavigatingTo()) - let textOpt = + let rec textOpt = match targetSymbolUse.Symbol with | :? FSharpEntity as symbol -> symbol.TryGetMetadataText() |> Option.map (fun text -> text, symbol.DisplayName) | :? FSharpMemberOrFunctionOrValue as symbol -> symbol.ApparentEnclosingEntity.TryGetMetadataText() |> Option.map (fun text -> text, symbol.ApparentEnclosingEntity.DisplayName) + | :? FSharpField as symbol -> + match symbol.DeclaringEntity with + | Some entity -> + let text = entity.TryGetMetadataText() + match text with + | Some text -> + Some(text, entity.DisplayName) + | None -> None + | None -> None + | :? FSharpUnionCase as symbol -> + symbol.DeclaringEntity.TryGetMetadataText() |> Option.map (fun text -> text, symbol.DisplayName) | _ -> None let result = @@ -523,6 +534,10 @@ type internal GoToDefinition(metadataAsSource: FSharpMetadataAsSourceService) = symbol1.DisplayName = symbol2.DisplayName | (:? FSharpMemberOrFunctionOrValue as symbol1), (:? FSharpMemberOrFunctionOrValue as symbol2) -> symbol1.DisplayName = symbol2.DisplayName + && + (match symbol1.DeclaringEntity, symbol2.DeclaringEntity with + | Some e1, Some e2 -> e1.CompiledName = e2.CompiledName + | _ -> false) && symbol1.GenericParameters.Count = symbol2.GenericParameters.Count && symbol1.CurriedParameterGroups.Count = symbol2.CurriedParameterGroups.Count && ((symbol1.CurriedParameterGroups, symbol2.CurriedParameterGroups) @@ -530,6 +545,15 @@ type internal GoToDefinition(metadataAsSource: FSharpMetadataAsSourceService) = pg1.Count = pg2.Count && ((pg1, pg2) ||> Seq.forall2 (fun p1 p2 -> areTypesEqual p1.Type p2.Type)))) && areTypesEqual symbol1.ReturnParameter.Type symbol2.ReturnParameter.Type + | (:? FSharpField as symbol1), (:? FSharpField as symbol2) when x.IsFromDefinition -> + symbol1.DisplayName = symbol2.DisplayName + && + (match symbol1.DeclaringEntity, symbol2.DeclaringEntity with + | Some e1, Some e2 -> e1.CompiledName = e2.CompiledName + | _ -> false) + | (:? FSharpUnionCase as symbol1), (:? FSharpUnionCase as symbol2) -> + symbol1.DisplayName = symbol2.DisplayName + && symbol1.DeclaringEntity.CompiledName = symbol2.DeclaringEntity.CompiledName | _ -> false) |> Option.map (fun x -> x.Range) From d3407ca6a48cc85597bd7c12e7bba882d7764951 Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Mon, 29 May 2023 11:06:16 +0200 Subject: [PATCH 2/4] Fix navigation for external enums, DUs and name resultion for members --- vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs index 44a7eb6259..ff11bf70df 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs @@ -467,7 +467,7 @@ type internal GoToDefinition(metadataAsSource: FSharpMetadataAsSourceService) = use __ = statusBar.Animate() statusBar.Message(SR.NavigatingTo()) - let rec textOpt = + let textOpt = match targetSymbolUse.Symbol with | :? FSharpEntity as symbol -> symbol.TryGetMetadataText() |> Option.map (fun text -> text, symbol.DisplayName) | :? FSharpMemberOrFunctionOrValue as symbol -> From f8e9f04f6f93b04c4f5f100df25bb4e5104749de Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Mon, 29 May 2023 11:08:10 +0200 Subject: [PATCH 3/4] Fantomas --- .../Navigation/GoToDefinition.fs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs index ff11bf70df..64e229f00c 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs @@ -477,13 +477,14 @@ type internal GoToDefinition(metadataAsSource: FSharpMetadataAsSourceService) = match symbol.DeclaringEntity with | Some entity -> let text = entity.TryGetMetadataText() + match text with - | Some text -> - Some(text, entity.DisplayName) + | Some text -> Some(text, entity.DisplayName) | None -> None | None -> None | :? FSharpUnionCase as symbol -> - symbol.DeclaringEntity.TryGetMetadataText() |> Option.map (fun text -> text, symbol.DisplayName) + symbol.DeclaringEntity.TryGetMetadataText() + |> Option.map (fun text -> text, symbol.DisplayName) | _ -> None let result = @@ -534,10 +535,9 @@ type internal GoToDefinition(metadataAsSource: FSharpMetadataAsSourceService) = symbol1.DisplayName = symbol2.DisplayName | (:? FSharpMemberOrFunctionOrValue as symbol1), (:? FSharpMemberOrFunctionOrValue as symbol2) -> symbol1.DisplayName = symbol2.DisplayName - && - (match symbol1.DeclaringEntity, symbol2.DeclaringEntity with - | Some e1, Some e2 -> e1.CompiledName = e2.CompiledName - | _ -> false) + && (match symbol1.DeclaringEntity, symbol2.DeclaringEntity with + | Some e1, Some e2 -> e1.CompiledName = e2.CompiledName + | _ -> false) && symbol1.GenericParameters.Count = symbol2.GenericParameters.Count && symbol1.CurriedParameterGroups.Count = symbol2.CurriedParameterGroups.Count && ((symbol1.CurriedParameterGroups, symbol2.CurriedParameterGroups) @@ -547,10 +547,9 @@ type internal GoToDefinition(metadataAsSource: FSharpMetadataAsSourceService) = && areTypesEqual symbol1.ReturnParameter.Type symbol2.ReturnParameter.Type | (:? FSharpField as symbol1), (:? FSharpField as symbol2) when x.IsFromDefinition -> symbol1.DisplayName = symbol2.DisplayName - && - (match symbol1.DeclaringEntity, symbol2.DeclaringEntity with - | Some e1, Some e2 -> e1.CompiledName = e2.CompiledName - | _ -> false) + && (match symbol1.DeclaringEntity, symbol2.DeclaringEntity with + | Some e1, Some e2 -> e1.CompiledName = e2.CompiledName + | _ -> false) | (:? FSharpUnionCase as symbol1), (:? FSharpUnionCase as symbol2) -> symbol1.DisplayName = symbol2.DisplayName && symbol1.DeclaringEntity.CompiledName = symbol2.DeclaringEntity.CompiledName From 8bee8895c33fd0cb4fc29754847be8df09ef10de Mon Sep 17 00:00:00 2001 From: Vlad Zarytovskii Date: Mon, 29 May 2023 12:20:52 +0200 Subject: [PATCH 4/4] Surface area --- ...Sharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl | 4 +++- ...arp.Compiler.Service.SurfaceArea.netstandard20.release.bsl | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index 0faf9512f3..ef145c9083 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -20,7 +20,7 @@ FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean IsCDecl FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean IsDefault FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean IsFastCall FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean IsStdCall -FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean IsThisCall +FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean IsThisCal FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean IsVarArg FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean get_IsCDecl() FSharp.Compiler.AbstractIL.IL+ILArgConvention: Boolean get_IsDefault() @@ -5130,6 +5130,8 @@ FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpXmlDoc Xm FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpXmlDoc get_XmlDoc() FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Text.Range DeclarationLocation FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Text.Range get_DeclarationLocation() +FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpEntity DeclaringEntity +FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpEntity get_DeclaringEntity() FSharp.Compiler.Symbols.FSharpUnionCase: Int32 GetHashCode() FSharp.Compiler.Symbols.FSharpUnionCase: System.Collections.Generic.IList`1[FSharp.Compiler.Symbols.FSharpAttribute] Attributes FSharp.Compiler.Symbols.FSharpUnionCase: System.Collections.Generic.IList`1[FSharp.Compiler.Symbols.FSharpAttribute] get_Attributes() diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index 0faf9512f3..ee9b402e2b 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -5130,6 +5130,8 @@ FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpXmlDoc Xm FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpXmlDoc get_XmlDoc() FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Text.Range DeclarationLocation FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Text.Range get_DeclarationLocation() +FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpEntity DeclaringEntity +FSharp.Compiler.Symbols.FSharpUnionCase: FSharp.Compiler.Symbols.FSharpEntity get_DeclaringEntity() FSharp.Compiler.Symbols.FSharpUnionCase: Int32 GetHashCode() FSharp.Compiler.Symbols.FSharpUnionCase: System.Collections.Generic.IList`1[FSharp.Compiler.Symbols.FSharpAttribute] Attributes FSharp.Compiler.Symbols.FSharpUnionCase: System.Collections.Generic.IList`1[FSharp.Compiler.Symbols.FSharpAttribute] get_Attributes()