From fe714ac60021bb6f8b2cec74ba46bb194831f9da Mon Sep 17 00:00:00 2001 From: nojaf Date: Mon, 17 Jul 2023 15:51:47 +0200 Subject: [PATCH 01/10] Rough UpdateAccessibilityInSignatureFix. --- .../src/Stages/FcsErrorsStageProcessBase.fs | 2 + .../FSharp.Psi.Intentions.fsproj | 1 + .../UpdateAccessibilityInSignatureFix.fs | 51 +++++++++++++++++++ .../src/Daemon/Highlightings/FcsErrors.xml | 11 ++++ .../src/FSharp.Psi/src/Impl/ModifiersUtil.cs | 11 ++++ .../src/Impl/Tree/BindingSignature.cs | 21 ++++++++ .../FSharp.Psi/src/Tree/IBindingSignature.cs | 9 ++++ 7 files changed, 106 insertions(+) create mode 100644 ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureFix.fs create mode 100644 ReSharper.FSharp/src/FSharp.Psi/src/Tree/IBindingSignature.cs diff --git a/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs b/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs index a73cea2a62..37436f95dc 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs @@ -319,6 +319,8 @@ type FcsErrorsStageProcessBase(fsFile, daemonProcess) = | ValueNotContainedMutability -> if error.Message.EndsWith("The mutability attributes differ") then createHighlightingFromNodeWithMessage ValueNotContainedMutabilityAttributesDifferError range error + elif error.Message.EndsWith("The accessibility specified in the signature is more than that specified in the implementation") then + createHighlightingFromNodeWithMessage ValueNotContainedMutabilityAccessibilityMoreError range error else createGenericHighlighting error range diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj b/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj index 5c9e7bc265..6b2ba88703 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj @@ -101,6 +101,7 @@ + QUICKFIX JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureFix.fs new file mode 100644 index 0000000000..9f374b50ce --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureFix.fs @@ -0,0 +1,51 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes + +open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Resources.Shell +open JetBrains.ReSharper.Plugins.FSharp.Psi + +type UpdateAccessibilityInSignatureFix(error: ValueNotContainedMutabilityAccessibilityMoreError) = + inherit FSharpQuickFixBase() + + let tryFindBindingSignatureAccessRights (declaredElement: IFSharpMember) = + declaredElement.GetDeclarations() + |> Seq.tryPick (function + | :? IReferencePat as pat when pat.IsFSharpSigFile() -> + match pat.DeclaredElement.As() with + | null -> None + | sigMember -> + let bindingSignature = BindingSignatureNavigator.GetByHeadPattern(pat) + if isNull bindingSignature then None else + Some (bindingSignature, sigMember.GetAccessRights()) + | _ -> None + ) + + let tryFindImplementationBindingInfo (pat: ITopReferencePat) = + if isNull pat then None else + + match pat.DeclaredElement.As() with + | null -> None + | fsMember -> Some fsMember + + let mutable implAccessRights = AccessRights.NONE + let mutable bindingSignature = null + + override x.Text = $"Update accessibility for {error.ReferenceName.Identifier.Name} in signature" + + override x.IsAvailable _ = + let topPat = TopReferencePatNavigator.GetByReferenceName(error.ReferenceName) + match tryFindImplementationBindingInfo topPat with + | None -> false + | Some implDeclaredElement -> + match tryFindBindingSignatureAccessRights implDeclaredElement with + | None -> false + | Some (bindingSig, sigAccessRights) -> + implAccessRights <- implDeclaredElement.GetAccessRights() + bindingSignature <- bindingSig + implAccessRights <> sigAccessRights + + override x.ExecutePsiTransaction _ = + use writeCookie = WriteLockCookie.Create(error.ReferenceName.IsPhysical()) + bindingSignature.SetAccessModifier(implAccessRights) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml index 891563e5b0..e3ab00cc63 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml +++ b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml @@ -218,6 +218,17 @@ UpdateMutabilityInSignatureFix + + + + referenceName.GetNavigationRange() + + fcsMessage + + + UpdateAccessibilityInSignatureFix + + diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/ModifiersUtil.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/ModifiersUtil.cs index b7087faa59..f779a1c0dd 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/ModifiersUtil.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/ModifiersUtil.cs @@ -5,6 +5,7 @@ using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.ExtensionsAPI.Caches2; +using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree; using JetBrains.ReSharper.Psi.Tree; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl @@ -121,5 +122,15 @@ public static AccessRights GetAccessRights([CanBeNull] ITokenNode accessModifier return AccessRights.PUBLIC; } + + public static ITreeNode GetAccessNode(AccessRights accessRights) + { + return accessRights switch + { + AccessRights.PRIVATE => FSharpTokenType.PRIVATE.CreateTreeElement(), + AccessRights.INTERNAL => FSharpTokenType.INTERNAL.CreateTreeElement(), + _ => FSharpTokenType.PUBLIC.CreateTreeElement() + }; + } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs index b398945633..86c2b59545 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs @@ -1,4 +1,5 @@ using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; +using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree @@ -22,5 +23,25 @@ public void SetIsMutable(bool value) if (headPat != null) FSharpImplUtil.AddTokenBefore(headPat, FSharpTokenType.MUTABLE); } + + public void SetAccessModifier(AccessRights accessModifier) + { + // TODO: check for AccessRights.NONE + if (AccessModifier == null) + { + if (Attributes.IsEmpty && FirstChild != null) + { + ModificationUtil.AddChildBefore(FirstChild, ModifiersUtil.GetAccessNode(accessModifier)); + } + else + { + ModificationUtil.AddChildAfter(Attributes.Last(), ModifiersUtil.GetAccessNode(accessModifier)); + } + } + else + { + ModificationUtil.ReplaceChild(AccessModifier, ModifiersUtil.GetAccessNode(accessModifier)); + } + } } } diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IBindingSignature.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IBindingSignature.cs new file mode 100644 index 0000000000..67483a1d39 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IBindingSignature.cs @@ -0,0 +1,9 @@ +using JetBrains.ReSharper.Psi; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public partial interface IBindingSignature + { + void SetAccessModifier(AccessRights accessModifier); + } +} From 86616076ea97cf8a1546fb1dee95b52d7bd0504c Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 18 Jul 2023 09:55:54 +0200 Subject: [PATCH 02/10] Add initial unit test. --- .../Binding - 01.fs | 3 +++ .../Binding - 01.fs.gold | 3 +++ .../Binding - 01.fsi | 3 +++ .../Binding - 01.fsi.gold | 3 +++ .../FSharp.Intentions.Tests.fsproj | 1 + .../UpdateAccessibilityInSignatureFixTest.fs | 13 +++++++++++++ 6 files changed, 26 insertions(+) create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi.gold create mode 100644 ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs new file mode 100644 index 0000000000..6834fdaa81 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs @@ -0,0 +1,3 @@ +module A + +let private a{caret} = 0 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs.gold new file mode 100644 index 0000000000..6834fdaa81 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs.gold @@ -0,0 +1,3 @@ +module A + +let private a{caret} = 0 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi new file mode 100644 index 0000000000..c186b48986 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi @@ -0,0 +1,3 @@ +module A + +val internal a: int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi.gold new file mode 100644 index 0000000000..3e1989afdd --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi.gold @@ -0,0 +1,3 @@ +module A + +val private a: int diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj index 851df9608e..c0474b7337 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj @@ -118,6 +118,7 @@ + diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs new file mode 100644 index 0000000000..0dfe4f0a99 --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs @@ -0,0 +1,13 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Intentions.QuickFixes + +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Tests +open NUnit.Framework + +[] +type UpdateAccessibilityInSignatureFixTest() = + inherit FSharpQuickFixTestBase() + + override x.RelativeTestDataPath = "features/quickFixes/updateAccessibilityInSignatureFix" + + [] member x.``Binding - 01`` () = x.DoNamedTestWithSignature() From 0c3ff6c4aec179af699ccd5a644d3f54518fbc28 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 18 Jul 2023 13:41:40 +0200 Subject: [PATCH 03/10] Add additional binding tests. --- .../src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs | 9 +-------- .../updateAccessibilityInSignatureFix/Binding - 02.fs | 3 +++ .../Binding - 02.fs.gold | 3 +++ .../updateAccessibilityInSignatureFix/Binding - 02.fsi | 3 +++ .../Binding - 02.fsi.gold | 3 +++ .../updateAccessibilityInSignatureFix/Binding - 03.fs | 3 +++ .../Binding - 03.fs.gold | 3 +++ .../updateAccessibilityInSignatureFix/Binding - 03.fsi | 3 +++ .../Binding - 03.fsi.gold | 3 +++ .../updateAccessibilityInSignatureFix/Binding - 04.fs | 3 +++ .../Binding - 04.fs.gold | 3 +++ .../updateAccessibilityInSignatureFix/Binding - 04.fsi | 3 +++ .../Binding - 04.fsi.gold | 3 +++ .../QuickFixes/UpdateAccessibilityInSignatureFixTest.fs | 3 +++ 14 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi.gold diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs index 86c2b59545..4db40a0a42 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/BindingSignature.cs @@ -29,14 +29,7 @@ public void SetAccessModifier(AccessRights accessModifier) // TODO: check for AccessRights.NONE if (AccessModifier == null) { - if (Attributes.IsEmpty && FirstChild != null) - { - ModificationUtil.AddChildBefore(FirstChild, ModifiersUtil.GetAccessNode(accessModifier)); - } - else - { - ModificationUtil.AddChildAfter(Attributes.Last(), ModifiersUtil.GetAccessNode(accessModifier)); - } + ModificationUtil.AddChildAfter(BindingKeyword, ModifiersUtil.GetAccessNode(accessModifier)); } else { diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs new file mode 100644 index 0000000000..38bae14239 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs @@ -0,0 +1,3 @@ +module A + +let internal a{caret} = 0 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs.gold new file mode 100644 index 0000000000..38bae14239 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs.gold @@ -0,0 +1,3 @@ +module A + +let internal a{caret} = 0 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi new file mode 100644 index 0000000000..ecb2230752 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi @@ -0,0 +1,3 @@ +module A + +val a: int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi.gold new file mode 100644 index 0000000000..9fd34442ef --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi.gold @@ -0,0 +1,3 @@ +module A + +val internal a: int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs new file mode 100644 index 0000000000..374651c526 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs @@ -0,0 +1,3 @@ +module A + +let inline private a{caret} b = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs.gold new file mode 100644 index 0000000000..374651c526 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs.gold @@ -0,0 +1,3 @@ +module A + +let inline private a{caret} b = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi new file mode 100644 index 0000000000..c7cfe72551 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi @@ -0,0 +1,3 @@ +module A + +val inline public a: b: 't -> unit diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi.gold new file mode 100644 index 0000000000..a71d4689c7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi.gold @@ -0,0 +1,3 @@ +module A + +val inline private a: b: 't -> unit diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs new file mode 100644 index 0000000000..d7eef5488c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs @@ -0,0 +1,3 @@ +module A + +let mutable private a{caret} = 4 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs.gold new file mode 100644 index 0000000000..d7eef5488c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs.gold @@ -0,0 +1,3 @@ +module A + +let mutable private a{caret} = 4 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi new file mode 100644 index 0000000000..343f1eb9ba --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi @@ -0,0 +1,3 @@ +module A + +val mutable public a: int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi.gold new file mode 100644 index 0000000000..8eb129387f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi.gold @@ -0,0 +1,3 @@ +module A + +val mutable private a: int diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs index 0dfe4f0a99..f49674f513 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs @@ -11,3 +11,6 @@ type UpdateAccessibilityInSignatureFixTest() = override x.RelativeTestDataPath = "features/quickFixes/updateAccessibilityInSignatureFix" [] member x.``Binding - 01`` () = x.DoNamedTestWithSignature() + [] member x.``Binding - 02`` () = x.DoNamedTestWithSignature() + [] member x.``Binding - 03`` () = x.DoNamedTestWithSignature() + [] member x.``Binding - 04`` () = x.DoNamedTestWithSignature() From 709a9581a967a1ace26c57488d4dac8d144c0eca Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 18 Jul 2023 14:30:16 +0200 Subject: [PATCH 04/10] Split quick fix into two. --- .../src/Stages/FcsErrorsStageProcessBase.fs | 6 ++- .../FSharp.Psi.Intentions.fsproj | 3 +- ...dateAccessibilityInSignatureBindingFix.fs} | 2 +- ...UpdateAccessibilityInSignatureMemberFix.fs | 54 +++++++++++++++++++ .../src/Daemon/Highlightings/FcsErrors.xml | 15 +++++- .../Binding - 01.fs | 0 .../Binding - 01.fs.gold | 0 .../Binding - 01.fsi | 0 .../Binding - 01.fsi.gold | 0 .../Binding - 02.fs | 0 .../Binding - 02.fs.gold | 0 .../Binding - 02.fsi | 0 .../Binding - 02.fsi.gold | 0 .../Binding - 03.fs | 0 .../Binding - 03.fs.gold | 0 .../Binding - 03.fsi | 0 .../Binding - 03.fsi.gold | 0 .../Binding - 04.fs | 0 .../Binding - 04.fs.gold | 0 .../Binding - 04.fsi | 0 .../Binding - 04.fsi.gold | 0 .../FSharp.Intentions.Tests.fsproj | 2 +- ...AccessibilityInSignatureBindingFixTest.fs} | 6 +-- 23 files changed, 79 insertions(+), 9 deletions(-) rename ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/{UpdateAccessibilityInSignatureFix.fs => UpdateAccessibilityInSignatureBindingFix.fs} (94%) create mode 100644 ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 01.fs (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 01.fs.gold (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 01.fsi (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 01.fsi.gold (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 02.fs (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 02.fs.gold (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 02.fsi (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 02.fsi.gold (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 03.fs (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 03.fs.gold (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 03.fsi (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 03.fsi.gold (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 04.fs (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 04.fs.gold (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 04.fsi (100%) rename ReSharper.FSharp/test/data/features/quickFixes/{updateAccessibilityInSignatureFix => updateAccessibilityInSignatureBindingFix}/Binding - 04.fsi.gold (100%) rename ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/{UpdateAccessibilityInSignatureFixTest.fs => UpdateAccessibilityInSignatureBindingFixTest.fs} (86%) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs b/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs index 37436f95dc..5ff298eb2f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs @@ -320,7 +320,11 @@ type FcsErrorsStageProcessBase(fsFile, daemonProcess) = if error.Message.EndsWith("The mutability attributes differ") then createHighlightingFromNodeWithMessage ValueNotContainedMutabilityAttributesDifferError range error elif error.Message.EndsWith("The accessibility specified in the signature is more than that specified in the implementation") then - createHighlightingFromNodeWithMessage ValueNotContainedMutabilityAccessibilityMoreError range error + let ref = nodeSelectionProvider.GetExpressionInRange(fsFile, range, false, null) + let memberName = nodeSelectionProvider.GetExpressionInRange(fsFile, range, false, null) + if isNotNull ref then ValueNotContainedMutabilityAccessibilityMoreInBindingError (ref, error.Message) :> _ + elif isNotNull memberName then ValueNotContainedMutabilityAccessibilityMoreInMemberError (memberName, error.Message) :> _ + else createGenericHighlighting error range else createGenericHighlighting error range diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj b/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj index 6b2ba88703..2049d2e566 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj @@ -101,7 +101,8 @@ - + + QUICKFIX JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureBindingFix.fs similarity index 94% rename from ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureFix.fs rename to ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureBindingFix.fs index 9f374b50ce..e579162415 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureBindingFix.fs @@ -6,7 +6,7 @@ open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Resources.Shell open JetBrains.ReSharper.Plugins.FSharp.Psi -type UpdateAccessibilityInSignatureFix(error: ValueNotContainedMutabilityAccessibilityMoreError) = +type UpdateAccessibilityInSignatureBindingFix(error: ValueNotContainedMutabilityAccessibilityMoreInBindingError) = inherit FSharpQuickFixBase() let tryFindBindingSignatureAccessRights (declaredElement: IFSharpMember) = diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs new file mode 100644 index 0000000000..e250a3bbc7 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs @@ -0,0 +1,54 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes + +open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings +open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Resources.Shell +open JetBrains.ReSharper.Plugins.FSharp.Psi + +type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityAccessibilityMoreInMemberError) = + inherit FSharpQuickFixBase() + + let tryFindBindingSignatureAccessRights (declaredElement: IFSharpMember) = + declaredElement.GetDeclarations() + |> Seq.tryPick (function + | :? IReferencePat as pat when pat.IsFSharpSigFile() -> + match pat.DeclaredElement.As() with + | null -> None + | sigMember -> + let bindingSignature = BindingSignatureNavigator.GetByHeadPattern(pat) + if isNull bindingSignature then + None + else + Some (bindingSignature, sigMember.GetAccessRights()) + | _ -> None + ) + + let tryFindImplementationBindingInfo (pat: ITopReferencePat) = + if isNull pat then None else + + match pat.DeclaredElement.As() with + | null -> None + | fsMember -> Some fsMember + + let mutable implAccessRights = AccessRights.NONE + let mutable bindingSignature = null + + override x.Text = $"Update accessibility for {error.MemberName.Name} in signature" + + override x.IsAvailable _ = false + // let topPat = TopReferencePatNavigator.GetByReferenceName(error.ReferenceName) + // match tryFindImplementationBindingInfo topPat with + // | None -> false + // | Some implDeclaredElement -> + // match tryFindBindingSignatureAccessRights implDeclaredElement with + // | None -> false + // | Some (bindingSig, sigAccessRights) -> + // implAccessRights <- implDeclaredElement.GetAccessRights() + // bindingSignature <- bindingSig + // implAccessRights <> sigAccessRights + + override x.ExecutePsiTransaction _ = + use writeCookie = WriteLockCookie.Create(error.MemberName.IsPhysical()) + () + // bindingSignature.SetAccessModifier(implAccessRights) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml index e3ab00cc63..241f327ba0 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml +++ b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml @@ -218,7 +218,7 @@ UpdateMutabilityInSignatureFix - + referenceName.GetNavigationRange() @@ -226,7 +226,18 @@ fcsMessage - UpdateAccessibilityInSignatureFix + UpdateAccessibilityInSignatureBindingFix + + + + + + memberName.GetNavigationRange() + + fcsMessage + + + UpdateAccessibilityInSignatureMemberFix diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fs similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fs diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fs.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fs.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fs.gold diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fsi similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fsi diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fsi.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 01.fsi.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 01.fsi.gold diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fs similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fs diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fs.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fs.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fs.gold diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fsi similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fsi diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fsi.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 02.fsi.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 02.fsi.gold diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fs similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fs diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fs.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fs.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fs.gold diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fsi similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fsi diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fsi.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 03.fsi.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 03.fsi.gold diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fs similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fs diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fs.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fs.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fs.gold diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fsi similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fsi diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fsi.gold similarity index 100% rename from ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureFix/Binding - 04.fsi.gold rename to ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureBindingFix/Binding - 04.fsi.gold diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj index c0474b7337..4c33c74a85 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj @@ -118,7 +118,7 @@ - + diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureBindingFixTest.fs similarity index 86% rename from ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs rename to ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureBindingFixTest.fs index f49674f513..7d891d40dc 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureFixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureBindingFixTest.fs @@ -5,10 +5,10 @@ open JetBrains.ReSharper.Plugins.FSharp.Tests open NUnit.Framework [] -type UpdateAccessibilityInSignatureFixTest() = - inherit FSharpQuickFixTestBase() +type UpdateAccessibilityInSignatureBindingFixTest() = + inherit FSharpQuickFixTestBase() - override x.RelativeTestDataPath = "features/quickFixes/updateAccessibilityInSignatureFix" + override x.RelativeTestDataPath = "features/quickFixes/updateAccessibilityInSignatureBindingFix" [] member x.``Binding - 01`` () = x.DoNamedTestWithSignature() [] member x.``Binding - 02`` () = x.DoNamedTestWithSignature() From cf4fede6e5f7237363089e9a027df6f18e360264 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 18 Jul 2023 15:40:00 +0200 Subject: [PATCH 05/10] Add quickfix to update member signature. --- .../src/Stages/FcsErrorsStageProcessBase.fs | 8 +-- ...UpdateAccessibilityInSignatureMemberFix.fs | 55 ++++++------------- .../src/Daemon/Highlightings/FcsErrors.xml | 4 +- .../src/Impl/Tree/MemberSignature.cs | 12 ++++ .../FSharp.Psi/src/Tree/IMemberSignature.cs | 9 +++ .../Member - 01.fs | 4 ++ .../Member - 01.fs.gold | 4 ++ .../Member - 01.fsi | 5 ++ .../Member - 01.fsi.gold | 5 ++ .../FSharp.Intentions.Tests.fsproj | 1 + ...teAccessibilityInSignatureMemberFixTest.fs | 13 +++++ 11 files changed, 77 insertions(+), 43 deletions(-) create mode 100644 ReSharper.FSharp/src/FSharp.Psi/src/Tree/IMemberSignature.cs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi.gold create mode 100644 ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs diff --git a/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs b/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs index 5ff298eb2f..1cd4d08f14 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Daemon/src/Stages/FcsErrorsStageProcessBase.fs @@ -320,10 +320,10 @@ type FcsErrorsStageProcessBase(fsFile, daemonProcess) = if error.Message.EndsWith("The mutability attributes differ") then createHighlightingFromNodeWithMessage ValueNotContainedMutabilityAttributesDifferError range error elif error.Message.EndsWith("The accessibility specified in the signature is more than that specified in the implementation") then - let ref = nodeSelectionProvider.GetExpressionInRange(fsFile, range, false, null) - let memberName = nodeSelectionProvider.GetExpressionInRange(fsFile, range, false, null) - if isNotNull ref then ValueNotContainedMutabilityAccessibilityMoreInBindingError (ref, error.Message) :> _ - elif isNotNull memberName then ValueNotContainedMutabilityAccessibilityMoreInMemberError (memberName, error.Message) :> _ + let refHighlighting = createHighlightingFromNodeWithMessage ValueNotContainedMutabilityAccessibilityMoreInBindingError range error + let memberHighlighting = createHighlightingFromParentNodeWithMessage ValueNotContainedMutabilityAccessibilityMoreInMemberError range error + if isNotNull refHighlighting then refHighlighting + elif isNotNull memberHighlighting then memberHighlighting else createGenericHighlighting error range else createGenericHighlighting error range diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs index e250a3bbc7..edeb38224f 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs @@ -9,46 +9,27 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityAccessibilityMoreInMemberError) = inherit FSharpQuickFixBase() - let tryFindBindingSignatureAccessRights (declaredElement: IFSharpMember) = - declaredElement.GetDeclarations() + let tryFindSignatureMemberAccessRights (memberDeclaration: IMemberDeclaration) = + if isNull memberDeclaration.DeclaredElement then None else + memberDeclaration.DeclaredElement.GetDeclarations() |> Seq.tryPick (function - | :? IReferencePat as pat when pat.IsFSharpSigFile() -> - match pat.DeclaredElement.As() with - | null -> None - | sigMember -> - let bindingSignature = BindingSignatureNavigator.GetByHeadPattern(pat) - if isNull bindingSignature then - None - else - Some (bindingSignature, sigMember.GetAccessRights()) - | _ -> None - ) - - let tryFindImplementationBindingInfo (pat: ITopReferencePat) = - if isNull pat then None else - - match pat.DeclaredElement.As() with - | null -> None - | fsMember -> Some fsMember - + | :? IMemberSignature as memberSig -> Some (memberSig, memberSig.GetAccessRights()) + | _ -> None) let mutable implAccessRights = AccessRights.NONE - let mutable bindingSignature = null + let mutable memberSignature = null + + override x.Text = $"Update accessibility for {error.MemberDeclaration.Identifier.GetText()} in signature" - override x.Text = $"Update accessibility for {error.MemberName.Name} in signature" + override x.IsAvailable _ = + if isNull error.MemberDeclaration then false else + implAccessRights <- error.MemberDeclaration.GetAccessRights() - override x.IsAvailable _ = false - // let topPat = TopReferencePatNavigator.GetByReferenceName(error.ReferenceName) - // match tryFindImplementationBindingInfo topPat with - // | None -> false - // | Some implDeclaredElement -> - // match tryFindBindingSignatureAccessRights implDeclaredElement with - // | None -> false - // | Some (bindingSig, sigAccessRights) -> - // implAccessRights <- implDeclaredElement.GetAccessRights() - // bindingSignature <- bindingSig - // implAccessRights <> sigAccessRights + match tryFindSignatureMemberAccessRights error.MemberDeclaration with + | None -> false + | Some (ms, sigAccessRights) -> + memberSignature <- ms + implAccessRights <> sigAccessRights override x.ExecutePsiTransaction _ = - use writeCookie = WriteLockCookie.Create(error.MemberName.IsPhysical()) - () - // bindingSignature.SetAccessModifier(implAccessRights) + use writeCookie = WriteLockCookie.Create(error.MemberDeclaration.IsPhysical()) + memberSignature.SetAccessModifier(implAccessRights) diff --git a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml index 241f327ba0..2cce13f5f2 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml +++ b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml @@ -230,9 +230,9 @@ - + - memberName.GetNavigationRange() + memberDeclaration.GetNavigationRange() fcsMessage diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs index 37a79dce91..a1cb802acd 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs @@ -2,6 +2,7 @@ using JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing; using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree; using JetBrains.ReSharper.Psi; +using JetBrains.ReSharper.Psi.ExtensionsAPI.Tree; namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree { @@ -27,6 +28,17 @@ protected override IDeclaredElement CreateDeclaredElement(FSharpSymbol fcsSymbol this.CreateMemberDeclaredElement(fcsSymbol); public bool IsIndexer => this.IsIndexer(); + public void SetAccessModifier(AccessRights accessModifier) + { + if (AccessModifier == null) + { + ModificationUtil.AddChildAfter(MemberKeyword, ModifiersUtil.GetAccessNode(accessModifier)); + } + else + { + ModificationUtil.ReplaceChild(AccessModifier, ModifiersUtil.GetAccessNode(accessModifier)); + } + } public override bool IsStatic => StaticKeyword != null; public override bool IsVirtual => MemberKeyword?.GetTokenType() == FSharpTokenType.DEFAULT; diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IMemberSignature.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IMemberSignature.cs new file mode 100644 index 0000000000..fb8d5a79f4 --- /dev/null +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Tree/IMemberSignature.cs @@ -0,0 +1,9 @@ +using JetBrains.ReSharper.Psi; + +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +{ + public partial interface IMemberSignature + { + void SetAccessModifier(AccessRights accessModifier); + } +} diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs new file mode 100644 index 0000000000..430bc71e15 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs @@ -0,0 +1,4 @@ +module A + +type B() = + member private this.Foo{caret}() = 1 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs.gold new file mode 100644 index 0000000000..430bc71e15 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fs.gold @@ -0,0 +1,4 @@ +module A + +type B() = + member private this.Foo{caret}() = 1 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi new file mode 100644 index 0000000000..e466eaa4cb --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + member internal Foo: unit -> int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi.gold new file mode 100644 index 0000000000..d257281a06 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 01.fsi.gold @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + member private Foo: unit -> int diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj index 4c33c74a85..e68d64e2a9 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/FSharp.Intentions.Tests.fsproj @@ -119,6 +119,7 @@ + diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs new file mode 100644 index 0000000000..6cd5c39ebd --- /dev/null +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs @@ -0,0 +1,13 @@ +namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Intentions.QuickFixes + +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Tests +open NUnit.Framework + +[] +type UpdateAccessibilityInSignatureMemberFixTest() = + inherit FSharpQuickFixTestBase() + + override x.RelativeTestDataPath = "features/quickFixes/updateAccessibilityInSignatureMemberFix" + + [] member x.``Member - 01`` () = x.DoNamedTestWithSignature() From 2360953792c6506d3d97a9eff021d0af2b3225d3 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 18 Jul 2023 15:50:16 +0200 Subject: [PATCH 06/10] Add additional tests for members. --- ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi | 1 + .../src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs | 2 +- .../updateAccessibilityInSignatureMemberFix/Member - 02.fs | 4 ++++ .../Member - 02.fs.gold | 4 ++++ .../updateAccessibilityInSignatureMemberFix/Member - 02.fsi | 5 +++++ .../Member - 02.fsi.gold | 5 +++++ .../updateAccessibilityInSignatureMemberFix/Member - 03.fs | 4 ++++ .../Member - 03.fs.gold | 4 ++++ .../updateAccessibilityInSignatureMemberFix/Member - 03.fsi | 5 +++++ .../Member - 03.fsi.gold | 5 +++++ .../UpdateAccessibilityInSignatureMemberFixTest.fs | 2 ++ 11 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi.gold diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi b/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi index aef607808c..4a2eab93e2 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi +++ b/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi @@ -1317,6 +1317,7 @@ memberSignature options { stubBase="FSharpProperTypeMemberDeclarationBase"; } e attributeList* STATIC? memberKeyword{MEMBER_KEYWORD, MemberKeyword} + INLINE? accessModifier{ACCESS_MODIFIER, AccessModifier}? identOrOpName{IDENTIFIER, Identifier} postfixTypeParameterDeclarationList? diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs index a1cb802acd..c878642486 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs @@ -32,7 +32,7 @@ public void SetAccessModifier(AccessRights accessModifier) { if (AccessModifier == null) { - ModificationUtil.AddChildAfter(MemberKeyword, ModifiersUtil.GetAccessNode(accessModifier)); + ModificationUtil.AddChildAfter(InlineKeyword ?? MemberKeyword, ModifiersUtil.GetAccessNode(accessModifier)); } else { diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs new file mode 100644 index 0000000000..32ad7c9484 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs @@ -0,0 +1,4 @@ +module A + +type B() = + static member private Foo{caret}() = 1 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs.gold new file mode 100644 index 0000000000..32ad7c9484 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fs.gold @@ -0,0 +1,4 @@ +module A + +type B() = + static member private Foo{caret}() = 1 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi new file mode 100644 index 0000000000..ba943c6e3f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + static member public Foo: unit -> int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi.gold new file mode 100644 index 0000000000..581dab478a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 02.fsi.gold @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + static member private Foo: unit -> int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs new file mode 100644 index 0000000000..4dbb32cacc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs @@ -0,0 +1,4 @@ +module A + +type B() = + static member inline private Foo{caret}() = 1 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs.gold new file mode 100644 index 0000000000..4dbb32cacc --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fs.gold @@ -0,0 +1,4 @@ +module A + +type B() = + static member inline private Foo{caret}() = 1 diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi new file mode 100644 index 0000000000..f19e345ad8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + static member inline Foo: unit -> int diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi.gold new file mode 100644 index 0000000000..cb67a27f8d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Member - 03.fsi.gold @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + static member inline private Foo: unit -> int diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs index 6cd5c39ebd..3593374c37 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs @@ -11,3 +11,5 @@ type UpdateAccessibilityInSignatureMemberFixTest() = override x.RelativeTestDataPath = "features/quickFixes/updateAccessibilityInSignatureMemberFix" [] member x.``Member - 01`` () = x.DoNamedTestWithSignature() + [] member x.``Member - 02`` () = x.DoNamedTestWithSignature() + [] member x.``Member - 03`` () = x.DoNamedTestWithSignature() From 78f0dcbc250a6d9653ef504de7ed9bc2ef68d88a Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 18 Jul 2023 16:25:50 +0200 Subject: [PATCH 07/10] Add support for auto property. --- .../QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs | 2 +- .../src/Daemon/Highlightings/FcsErrors.xml | 2 +- ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi | 2 ++ .../src/FSharp.Psi/src/Impl/Tree/AutoPropertyDeclaration.cs | 1 + .../AutoProperty - 01.fs | 4 ++++ .../AutoProperty - 01.fs.gold | 4 ++++ .../AutoProperty - 01.fsi | 5 +++++ .../AutoProperty - 01.fsi.gold | 5 +++++ .../UpdateAccessibilityInSignatureMemberFixTest.fs | 2 ++ 9 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi.gold diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs index edeb38224f..dac3015090 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs @@ -9,7 +9,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityAccessibilityMoreInMemberError) = inherit FSharpQuickFixBase() - let tryFindSignatureMemberAccessRights (memberDeclaration: IMemberDeclaration) = + let tryFindSignatureMemberAccessRights (memberDeclaration: IOverridableMemberDeclaration) = if isNull memberDeclaration.DeclaredElement then None else memberDeclaration.DeclaredElement.GetDeclarations() |> Seq.tryPick (function diff --git a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml index 2cce13f5f2..1b989c12f1 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml +++ b/ReSharper.FSharp/src/FSharp.Psi.Services/src/Daemon/Highlightings/FcsErrors.xml @@ -230,7 +230,7 @@ - + memberDeclaration.GetNavigationRange() diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi b/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi index 4a2eab93e2..1fc69db256 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi +++ b/ReSharper.FSharp/src/FSharp.Psi/src/FSharp.psi @@ -1370,6 +1370,8 @@ autoPropertyDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBas STATIC? memberKeyword{MEMBER, MemberKeyword} VAL + MUTABLE? + accessModifier{ACCESS_MODIFIER, AccessModifier}? IDENTIFIER EQUALS chameleonExpression diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AutoPropertyDeclaration.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AutoPropertyDeclaration.cs index 4e6d5b1eaf..caeb2cb091 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AutoPropertyDeclaration.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/AutoPropertyDeclaration.cs @@ -29,5 +29,6 @@ protected override IDeclaredElement CreateDeclaredElement(FSharpSymbol fcsSymbol public override bool IsOverride => this.IsOverride(); public override bool IsExplicitImplementation => this.IsExplicitImplementation(); + public override AccessRights GetAccessRights() => ModifiersUtil.GetAccessRights(AccessModifier); } } diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs new file mode 100644 index 0000000000..8c4349c3a4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs @@ -0,0 +1,4 @@ +module A + +type B() = + member val private Foo{caret} = 1 with get,set diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs.gold new file mode 100644 index 0000000000..8c4349c3a4 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fs.gold @@ -0,0 +1,4 @@ +module A + +type B() = + member val private Foo{caret} = 1 with get,set diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi new file mode 100644 index 0000000000..6df7d1a626 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + member Foo: int with get,set diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi.gold new file mode 100644 index 0000000000..1ec9dafda7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/AutoProperty - 01.fsi.gold @@ -0,0 +1,5 @@ +module A + +type B = + new: unit -> B + member private Foo: int with get,set diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs index 3593374c37..761aa7c9aa 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs @@ -13,3 +13,5 @@ type UpdateAccessibilityInSignatureMemberFixTest() = [] member x.``Member - 01`` () = x.DoNamedTestWithSignature() [] member x.``Member - 02`` () = x.DoNamedTestWithSignature() [] member x.``Member - 03`` () = x.DoNamedTestWithSignature() + + [] member x.``AutoProperty - 01`` () = x.DoNamedTestWithSignature() From 122e8972a1b0b3d3a517cf8fdd9cb846b4f8ae32 Mon Sep 17 00:00:00 2001 From: nojaf Date: Tue, 18 Jul 2023 17:42:22 +0200 Subject: [PATCH 08/10] Initial support for properties. --- .../src/Parsing/FSharpTreeBuilderBase.fs | 11 ++++-- ...UpdateAccessibilityInSignatureMemberFix.fs | 35 ++++++++++++++++++- .../src/Impl/Tree/MemberSignature.cs | 1 + .../Property - 01.fs | 4 +++ .../Property - 01.fs.gold | 4 +++ .../Property - 01.fsi | 6 ++++ .../Property - 01.fsi.gold | 6 ++++ ...teAccessibilityInSignatureMemberFixTest.fs | 2 ++ 8 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi.gold diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs index 4a10f72810..87d9ac142c 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs @@ -927,17 +927,24 @@ type FSharpTreeBuilderBase(lexer, document: IDocument, lifetime, path: VirtualFi member x.ProcessTypeMemberSignature(memberSig) = match memberSig with - | SynMemberSig.Member(SynValSig(attrs, _, _, synType, arity, _, _, XmlDoc xmlDoc, _, _, _, trivia), flags, range, _) -> + | SynMemberSig.Member(SynValSig(attrs, _, _, synType, arity, _, _, XmlDoc xmlDoc, _, _, _, valSigTrivia), flags, range, memberTrivia) -> let mark = x.MarkAndProcessIntro(attrs, xmlDoc, null, range) x.ProcessReturnTypeInfo(arity, synType) let elementType = if flags.IsDispatchSlot then - x.ProcessAccessorsNamesClause(trivia, range) + x.ProcessAccessorsNamesClause(valSigTrivia, range) ElementType.ABSTRACT_MEMBER_DECLARATION else match flags.MemberKind with | SynMemberKind.Constructor -> ElementType.CONSTRUCTOR_SIGNATURE | _ -> ElementType.MEMBER_SIGNATURE + + match valSigTrivia.WithKeyword, memberTrivia.GetSetKeywords with + | Some withKw, Some getSetKeywords -> + let m = Range.unionRanges withKw getSetKeywords.Range + x.MarkAndDone(m, ElementType.ACCESSOR_DECLARATION) + | _ -> () + x.Done(range, mark, elementType) | SynMemberSig.ValField(SynField(attrs, _, id, synType, _, XmlDoc xmlDoc, _, _, _), range) -> diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs index dac3015090..c788a86621 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs @@ -4,7 +4,6 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Psi open JetBrains.ReSharper.Resources.Shell -open JetBrains.ReSharper.Plugins.FSharp.Psi type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityAccessibilityMoreInMemberError) = inherit FSharpQuickFixBase() @@ -15,6 +14,21 @@ type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityA |> Seq.tryPick (function | :? IMemberSignature as memberSig -> Some (memberSig, memberSig.GetAccessRights()) | _ -> None) + + let tryFindSignatureMemberInPropertyAccessRights (memberDeclaration: IMemberDeclaration) (accessorDeclaration:IAccessorDeclaration) = + if isNull memberDeclaration.DeclaredElement then None else + let implAccessRights = accessorDeclaration.GetAccessRights() + memberDeclaration.DeclaredElement.GetDeclarations() + |> Seq.tryPick (function + | :? IMemberSignature as memberSig -> + memberSig.AccessorDeclarationsEnumerable + |> Seq.tryFind (fun ad -> ad.DeclaredName = accessorDeclaration.DeclaredName) + |> Option.bind (fun _ -> + if implAccessRights <> memberSig.GetAccessRights() then + Some (memberSig, accessorDeclaration.DeclaredName, implAccessRights) + else None) + | _ -> None) + let mutable implAccessRights = AccessRights.NONE let mutable memberSignature = null @@ -22,6 +36,25 @@ type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityA override x.IsAvailable _ = if isNull error.MemberDeclaration then false else + + match error.MemberDeclaration with + | :? IMemberDeclaration as md when md.AccessorDeclarations.Count = 2 -> + // property with get/set + let properties = + md.AccessorDeclarationsEnumerable + |> Seq.choose (fun ad -> tryFindSignatureMemberInPropertyAccessRights md ad) + |> Seq.toList + + // TODO: check for scenario when more than one property has different access rights + + match properties with + | [ memberSig, _, implAccR ] -> + implAccessRights <- implAccR + memberSignature <- memberSig + true + | _ -> false + | _ -> + implAccessRights <- error.MemberDeclaration.GetAccessRights() match tryFindSignatureMemberAccessRights error.MemberDeclaration with diff --git a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs index c878642486..d1876bb4c5 100644 --- a/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs +++ b/ReSharper.FSharp/src/FSharp.Psi/src/Impl/Tree/MemberSignature.cs @@ -43,5 +43,6 @@ public void SetAccessModifier(AccessRights accessModifier) public override bool IsStatic => StaticKeyword != null; public override bool IsVirtual => MemberKeyword?.GetTokenType() == FSharpTokenType.DEFAULT; public override bool IsOverride => this.IsOverride(); + public override AccessRights GetAccessRights() => ModifiersUtil.GetAccessRights(AccessModifier); } } diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs new file mode 100644 index 0000000000..23bfc44577 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs @@ -0,0 +1,4 @@ +module A + +type B() = + member this.Foo{caret} with get () = 1 and private set (v: int) = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs.gold new file mode 100644 index 0000000000..23bfc44577 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fs.gold @@ -0,0 +1,4 @@ +module A + +type B() = + member this.Foo{caret} with get () = 1 and private set (v: int) = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi new file mode 100644 index 0000000000..b48867d5f8 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi @@ -0,0 +1,6 @@ +module A + +type B = + new: unit -> B + member Foo: int with get + member internal Foo: int with set diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi.gold new file mode 100644 index 0000000000..bf468b2f4f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 01.fsi.gold @@ -0,0 +1,6 @@ +module A + +type B = + new: unit -> B + member Foo: int with get + member private Foo: int with set diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs index 761aa7c9aa..54368c151d 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs @@ -15,3 +15,5 @@ type UpdateAccessibilityInSignatureMemberFixTest() = [] member x.``Member - 03`` () = x.DoNamedTestWithSignature() [] member x.``AutoProperty - 01`` () = x.DoNamedTestWithSignature() + + [] member x.``Property - 01`` () = x.DoNamedTestWithSignature() From 8408776b6bc282d673ab9fa9a91bb24626f04f38 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 19 Jul 2023 09:51:11 +0200 Subject: [PATCH 09/10] Support properties where both get/set have a mismatch. --- ...UpdateAccessibilityInSignatureMemberFix.fs | 38 ++++++++----------- .../Property - 02.fs | 4 ++ .../Property - 02.fs.gold | 4 ++ .../Property - 02.fsi | 6 +++ .../Property - 02.fsi.gold | 6 +++ ...teAccessibilityInSignatureMemberFixTest.fs | 1 + 6 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi.gold diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs index c788a86621..ca87aa8183 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs @@ -29,40 +29,32 @@ type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityA else None) | _ -> None) - let mutable implAccessRights = AccessRights.NONE - let mutable memberSignature = null + let updatableSignatures : ResizeArray = ResizeArray() override x.Text = $"Update accessibility for {error.MemberDeclaration.Identifier.GetText()} in signature" override x.IsAvailable _ = if isNull error.MemberDeclaration then false else + // If both the get and set of a property are reported, IsAvailable will be called twice. + if updatableSignatures.Count > 0 then true else match error.MemberDeclaration with | :? IMemberDeclaration as md when md.AccessorDeclarations.Count = 2 -> // property with get/set - let properties = - md.AccessorDeclarationsEnumerable - |> Seq.choose (fun ad -> tryFindSignatureMemberInPropertyAccessRights md ad) - |> Seq.toList - - // TODO: check for scenario when more than one property has different access rights - - match properties with - | [ memberSig, _, implAccR ] -> - implAccessRights <- implAccR - memberSignature <- memberSig - true - | _ -> false + md.AccessorDeclarationsEnumerable + |> Seq.choose (tryFindSignatureMemberInPropertyAccessRights md) + |> Seq.iter (fun (memberSig, _declName, implAccR) -> updatableSignatures.Add (memberSig, implAccR)) | _ -> + match tryFindSignatureMemberAccessRights error.MemberDeclaration with + | None -> () + | Some (ms, sigAccessRights) -> + let implAccessRights = error.MemberDeclaration.GetAccessRights() + if implAccessRights <> sigAccessRights then + updatableSignatures.Add (ms, implAccessRights) - implAccessRights <- error.MemberDeclaration.GetAccessRights() - - match tryFindSignatureMemberAccessRights error.MemberDeclaration with - | None -> false - | Some (ms, sigAccessRights) -> - memberSignature <- ms - implAccessRights <> sigAccessRights + updatableSignatures.Count > 0 override x.ExecutePsiTransaction _ = use writeCookie = WriteLockCookie.Create(error.MemberDeclaration.IsPhysical()) - memberSignature.SetAccessModifier(implAccessRights) + for memberSignature, implAccessRights in updatableSignatures do + memberSignature.SetAccessModifier(implAccessRights) diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs new file mode 100644 index 0000000000..6eb1fa0a94 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs @@ -0,0 +1,4 @@ +module A + +type B() = + member this.Foo{caret} with private get () = 1 and internal set (v: int) = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs.gold new file mode 100644 index 0000000000..6eb1fa0a94 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fs.gold @@ -0,0 +1,4 @@ +module A + +type B() = + member this.Foo{caret} with private get () = 1 and internal set (v: int) = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi new file mode 100644 index 0000000000..915701d806 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi @@ -0,0 +1,6 @@ +module A + +type B = + new: unit -> B + member Foo: int with get + member Foo: int with set diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi.gold new file mode 100644 index 0000000000..1d00910ec3 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 02.fsi.gold @@ -0,0 +1,6 @@ +module A + +type B = + new: unit -> B + member private Foo: int with get + member internal Foo: int with set diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs index 54368c151d..63db649b16 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs @@ -17,3 +17,4 @@ type UpdateAccessibilityInSignatureMemberFixTest() = [] member x.``AutoProperty - 01`` () = x.DoNamedTestWithSignature() [] member x.``Property - 01`` () = x.DoNamedTestWithSignature() + [] member x.``Property - 02`` () = x.DoNamedTestWithSignature() From 432d2009fdda494222184ab2865f77195c7c5678 Mon Sep 17 00:00:00 2001 From: nojaf Date: Wed, 19 Jul 2023 11:03:07 +0200 Subject: [PATCH 10/10] Support indexed properties. --- ...UpdateAccessibilityInSignatureMemberFix.fs | 30 ++++++++++++++++--- .../Property - 03.fs | 4 +++ .../Property - 03.fs.gold | 4 +++ .../Property - 03.fsi | 6 ++++ .../Property - 03.fsi.gold | 6 ++++ ...teAccessibilityInSignatureMemberFixTest.fs | 1 + 6 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi create mode 100644 ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi.gold diff --git a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs index ca87aa8183..1bbcf69377 100644 --- a/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs +++ b/ReSharper.FSharp/src/FSharp.Psi.Intentions/src/QuickFixes/UpdateAccessibilityInSignatureMemberFix.fs @@ -1,8 +1,10 @@ -namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes +open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Psi +open JetBrains.ReSharper.Psi.Tree open JetBrains.ReSharper.Resources.Shell type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityAccessibilityMoreInMemberError) = @@ -14,15 +16,35 @@ type UpdateAccessibilityInSignatureMemberFix(error: ValueNotContainedMutabilityA |> Seq.tryPick (function | :? IMemberSignature as memberSig -> Some (memberSig, memberSig.GetAccessRights()) | _ -> None) - + let tryFindSignatureMemberInPropertyAccessRights (memberDeclaration: IMemberDeclaration) (accessorDeclaration:IAccessorDeclaration) = if isNull memberDeclaration.DeclaredElement then None else let implAccessRights = accessorDeclaration.GetAccessRights() - memberDeclaration.DeclaredElement.GetDeclarations() + + let allDeclarations : IDeclaration array = memberDeclaration.DeclaredElement.GetDeclarations() |> Seq.toArray + let allDeclarations = + if allDeclarations.Length > 1 then allDeclarations else + + // Search via the parent + let fm = memberDeclaration.DeclaredElement.As() + if isNull fm then Array.empty else + + fm.ContainingType.GetDeclarations() + |> Seq.tryPick (fun t -> + match t with + | :? IFSharpTypeDeclaration as td when td.IsFSharpSigFile() -> + td.TypeMembers + |> Seq.choose (function | :? IDeclaration as decl -> Some decl | _ -> None) + |> Seq.toArray + |> Some + | _ -> None) + |> Option.defaultValue Array.empty + + allDeclarations |> Seq.tryPick (function | :? IMemberSignature as memberSig -> memberSig.AccessorDeclarationsEnumerable - |> Seq.tryFind (fun ad -> ad.DeclaredName = accessorDeclaration.DeclaredName) + |> Seq.tryFind (fun ad -> ad.DeclaredName = accessorDeclaration.DeclaredName) |> Option.bind (fun _ -> if implAccessRights <> memberSig.GetAccessRights() then Some (memberSig, accessorDeclaration.DeclaredName, implAccessRights) diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs new file mode 100644 index 0000000000..3cf3d4db7a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs @@ -0,0 +1,4 @@ +module A + +type B() = + member this.Foo{caret} with private get (i:int) = 1 and private set (i:int) v = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs.gold new file mode 100644 index 0000000000..3cf3d4db7a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fs.gold @@ -0,0 +1,4 @@ +module A + +type B() = + member this.Foo{caret} with private get (i:int) = 1 and private set (i:int) v = () diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi new file mode 100644 index 0000000000..38bf571e7f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi @@ -0,0 +1,6 @@ +module A + +type B = + new: unit -> B + member public Foo: int -> int with get + member Foo: int -> int with set diff --git a/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi.gold b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi.gold new file mode 100644 index 0000000000..2e99550a7f --- /dev/null +++ b/ReSharper.FSharp/test/data/features/quickFixes/updateAccessibilityInSignatureMemberFix/Property - 03.fsi.gold @@ -0,0 +1,6 @@ +module A + +type B = + new: unit -> B + member private Foo: int -> int with get + member private Foo: int -> int with set diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs index 63db649b16..d8c72bd514 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/QuickFixes/UpdateAccessibilityInSignatureMemberFixTest.fs @@ -18,3 +18,4 @@ type UpdateAccessibilityInSignatureMemberFixTest() = [] member x.``Property - 01`` () = x.DoNamedTestWithSignature() [] member x.``Property - 02`` () = x.DoNamedTestWithSignature() + [] member x.``Property - 03`` () = x.DoNamedTestWithSignature()