From a979f7805735984c763627b37120f69393168d12 Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Tue, 17 Dec 2024 03:19:18 +0300 Subject: [PATCH 1/8] wip --- .../FSharp.Psi.Intentions.fsproj | 2 +- .../Intentions/FunctionAnnotationAction.fs | 41 +++++++++++++++---- .../QuickFixes/SpecifyParameterBaseTypeFix.fs | 2 +- .../src/QuickFixes/SpecifyParameterTypeFix.fs | 2 +- .../specifyTypes/availability/Patterns 01.fs | 6 +++ .../src/Intentions/SpecifyTypesTest.fs | 10 ++++- 6 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj index bcce22fda4..ce524fa30f 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/FSharp.Psi.Intentions.fsproj @@ -36,7 +36,7 @@ - + diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/FunctionAnnotationAction.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/FunctionAnnotationAction.fs index 50f63521a5..de9727ff10 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/FunctionAnnotationAction.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/FunctionAnnotationAction.fs @@ -50,7 +50,7 @@ module SpecifyTypes = parenPat.SetPattern(pattern) |> ignore parenPat :> IFSharpPattern - let specifyParameterType displayContext (fcsType: FSharpType) (pattern: IFSharpPattern) = + let specifyPattern displayContext (fcsType: FSharpType) (pattern: IFSharpPattern) = let pattern = pattern.IgnoreParentParens() let factory = pattern.CreateElementFactory() @@ -61,13 +61,11 @@ module SpecifyTypes = let typedPat = let typeUsage = factory.CreateTypeUsage(fcsType.Format(displayContext), TypeUsageContext.TopLevel) - let typedPat = factory.CreateTypedPat(newPattern, typeUsage) - if isNull (TuplePatNavigator.GetByPattern(pattern)) then - addParens factory typedPat - else - typedPat :> _ + factory.CreateTypedPat(newPattern, typeUsage) - ModificationUtil.ReplaceChild(pattern, typedPat) |> ignore + ModificationUtil.ReplaceChild(pattern, typedPat) + |> ParenPatUtil.addParensIfNeeded + |> ignore let specifyPropertyType displayContext (fcsType: FSharpType) (decl: IMemberDeclaration) = Assertion.Assert(isNull decl.ReturnTypeInfo, "isNull decl.ReturnTypeInfo") @@ -104,7 +102,7 @@ type FunctionAnnotationAction(dataProvider: FSharpContextActionDataProvider) = | TupleLikePattern pat when isTopLevel -> specifyParameterTypes fcsType.GenericArguments pat.Patterns false | pattern -> - SpecifyTypes.specifyParameterType displayContext fcsType pattern + SpecifyTypes.specifyPattern displayContext fcsType pattern specifyParameterTypes types parameters true @@ -153,3 +151,30 @@ type FunctionAnnotationAction(dataProvider: FSharpContextActionDataProvider) = if isNull binding.ReturnTypeInfo then SpecifyTypes.specifyBindingReturnType displayContext mfv binding + + +[, + Description = "Annotate named pattern")>] +type PatternAnnotationAction(dataProvider: FSharpContextActionDataProvider) = + inherit FSharpContextActionBase(dataProvider) + override x.Text = "Add type annotation" + + override x.IsAvailable _ = + let pattern = dataProvider.GetSelectedElement().IgnoreParentParens() + isNotNull pattern && + isNull (TypedPatNavigator.GetByPattern(pattern)) && + isNull (BindingNavigator.GetByHeadPattern(pattern)) + + override x.ExecutePsiTransaction _ = + let pattern = dataProvider.GetSelectedElement() + + use writeCookie = WriteLockCookie.Create(pattern.IsPhysical()) + use disableFormatter = new DisableCodeFormatter() + + let symbolUse = pattern.GetFcsSymbolUse() + let symbol = symbolUse.Symbol.As() + + let mfv = symbolUse.Symbol :?> FSharpMemberOrFunctionOrValue + let displayContext = symbolUse.DisplayContext + + SpecifyTypes.specifyPattern displayContext mfv.FullType pattern diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs index 31f0780780..f2032b8f24 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs @@ -122,7 +122,7 @@ type SpecifyParameterBaseTypeFix(refExpr: IReferenceExpr, typeUsage: ITypeUsage) use writeCookie = WriteLockCookie.Create(pat.IsPhysical()) let baseType, displayContext = baseType.Value - SpecifyTypes.specifyParameterType displayContext baseType pat + SpecifyTypes.specifyPattern displayContext baseType pat override this.Execute(solution, textControl) = let fcsEntity, displayContext = getFcsEntity typeUsage |> Option.get diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs index 498ba35449..a3495a5f52 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs @@ -81,7 +81,7 @@ type SpecifyParameterTypeFix(qualifiedExpr: IQualifiedExpr) = override this.SpecifyType(decl, mfv, d) = let decl = decl :?> ILocalReferencePat - SpecifyTypes.specifyParameterType d mfv.FullType decl + SpecifyTypes.specifyPattern d mfv.FullType decl type SpecifyPropertyTypeFix(qualifiedExpr: IQualifiedExpr) = diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs new file mode 100644 index 0000000000..cd8cc6765b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs @@ -0,0 +1,6 @@ +module Module + +let x{off} = 1 +let a, b{on} = 1, 1 + +let f{off} x{on} (So{off}me(y{on})) (z{off}: int) = () diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs index f8f092ef10..69ccb7f26f 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs @@ -5,7 +5,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Services.Formatter open JetBrains.ReSharper.TestFramework open NUnit.Framework -type SpecifyTypesActionTest() = +type SpecifyFunctionTypesActionTest() = inherit FSharpContextActionExecuteTestBase() override x.ExtraPath = "specifyTypes" @@ -71,3 +71,11 @@ type SpecifyTypesActionAvailabilityTest() = [] member x.``LetBang - 01`` () = x.DoNamedTest() [] member x.``UseBang - 01`` () = x.DoNamedTest() [] member x.``AndBang - 01`` () = x.DoNamedTest() + + +type SpecifyPatternTypeActionAvailabilityTest() = + inherit FSharpContextActionAvailabilityTestBase() + + override x.ExtraPath = "specifyTypes" + + [] member x.``Patterns 01``() = x.DoNamedTest() From bbf3c337b021b617b3c0e3bbe2b3c12e3f733702 Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Tue, 17 Dec 2024 03:33:47 +0300 Subject: [PATCH 2/8] fix --- .../{FunctionAnnotationAction.fs => AnnotationActions.fs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/{FunctionAnnotationAction.fs => AnnotationActions.fs} (100%) diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/FunctionAnnotationAction.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs similarity index 100% rename from ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/FunctionAnnotationAction.fs rename to ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs From 1eba79653dbaae607a01b257c77070b427018814 Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Tue, 17 Dec 2024 03:49:12 +0300 Subject: [PATCH 3/8] wip --- .../src/Intentions/AnnotationActions.fs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs index de9727ff10..b9ab942c99 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs @@ -8,6 +8,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree @@ -51,6 +52,12 @@ module SpecifyTypes = parenPat :> IFSharpPattern let specifyPattern displayContext (fcsType: FSharpType) (pattern: IFSharpPattern) = + let optionalValPat = OptionalValPatNavigator.GetByPattern(pattern) + + let (pattern: IFSharpPattern), fcsType = + if isNotNull optionalValPat && isOption fcsType then optionalValPat, fcsType.GenericArguments[0] + else pattern, fcsType + let pattern = pattern.IgnoreParentParens() let factory = pattern.CreateElementFactory() @@ -172,7 +179,6 @@ type PatternAnnotationAction(dataProvider: FSharpContextActionDataProvider) = use disableFormatter = new DisableCodeFormatter() let symbolUse = pattern.GetFcsSymbolUse() - let symbol = symbolUse.Symbol.As() let mfv = symbolUse.Symbol :?> FSharpMemberOrFunctionOrValue let displayContext = symbolUse.DisplayContext From 8cb4ab3fe93956d58f664dc044ceee0c7a6043e4 Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Tue, 17 Dec 2024 04:25:55 +0300 Subject: [PATCH 4/8] wip --- .../src/Stages/PatternTypeHintsStage.fs | 5 ++--- .../src/Intentions/AnnotationActions.fs | 10 +++++----- .../FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs | 7 +++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs index a318be54ef..67f69561de 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs @@ -11,6 +11,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Daemon.Highlightings.FSharpTypeHints open JetBrains.ReSharper.Plugins.FSharp.Psi.Daemon.Utils.VisibleRangeContainer open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Stages +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FcsTypeUtil open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Util @@ -201,11 +202,9 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet if isNull symbol then ValueNone else let fcsType = symbol.FullType + let pattern, fcsType = fixIfOptionalParameter refPat fcsType let range = pattern.GetNavigationRange().EndOffsetRange() - let isOptional = isNotNull (OptionalValPatNavigator.GetByPattern(refPat)) - let fcsType = if isOptional && isOption fcsType then fcsType.GenericArguments[0] else fcsType - createTypeHintHighlighting fcsType defaultDisplayContext range pushToHintMode actionsProvider false |> ValueSome diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs index b9ab942c99..0bcaae71be 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs @@ -5,6 +5,7 @@ open JetBrains.Diagnostics open JetBrains.ReSharper.Feature.Services.ContextActions open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util +open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FcsTypeUtil open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree @@ -52,11 +53,10 @@ module SpecifyTypes = parenPat :> IFSharpPattern let specifyPattern displayContext (fcsType: FSharpType) (pattern: IFSharpPattern) = - let optionalValPat = OptionalValPatNavigator.GetByPattern(pattern) - - let (pattern: IFSharpPattern), fcsType = - if isNotNull optionalValPat && isOption fcsType then optionalValPat, fcsType.GenericArguments[0] - else pattern, fcsType + let pattern, fcsType = + match pattern with + | :? IReferencePat as pattern -> fixIfOptionalParameter pattern fcsType + | _ -> pattern, fcsType let pattern = pattern.IgnoreParentParens() let factory = pattern.CreateElementFactory() diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs index 618c270bf4..b5ceddcbb6 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs @@ -1,6 +1,8 @@ module JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FcsTypeUtil open FSharp.Compiler.Symbols +open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Util let getFunctionTypeArgs includeReturnType fcsType = let rec loop (fcsType: FSharpType) acc = @@ -19,3 +21,8 @@ let getFunctionTypeArgs includeReturnType fcsType = acc loop fcsType [] |> List.rev + +let fixIfOptionalParameter (pattern: IReferencePat) fcsType = + let optionalValPat = OptionalValPatNavigator.GetByPattern(pattern) + if isNotNull optionalValPat && isOption fcsType then (optionalValPat : IFSharpPattern), fcsType.GenericArguments[0] + else pattern, fcsType From 5edf93d107701421e643d5b59a4502c9bb723234 Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Tue, 17 Dec 2024 05:18:20 +0300 Subject: [PATCH 5/8] fix --- .../src/Intentions/AnnotationActions.fs | 4 +--- .../src/Util/ParenPatUtil.fs | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs index 0bcaae71be..2ab8b3fc4b 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs @@ -5,11 +5,9 @@ open JetBrains.Diagnostics open JetBrains.ReSharper.Feature.Services.ContextActions open JetBrains.ReSharper.Plugins.FSharp.Psi open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util -open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FcsTypeUtil open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree -open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi.ExtensionsAPI open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree open JetBrains.ReSharper.Psi.Tree @@ -55,7 +53,7 @@ module SpecifyTypes = let specifyPattern displayContext (fcsType: FSharpType) (pattern: IFSharpPattern) = let pattern, fcsType = match pattern with - | :? IReferencePat as pattern -> fixIfOptionalParameter pattern fcsType + | :? IReferencePat as pattern -> FcsTypeUtil.fixIfOptionalParameter pattern fcsType | _ -> pattern, fcsType let pattern = pattern.IgnoreParentParens() diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/ParenPatUtil.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/ParenPatUtil.fs index 4fe8d4f311..f9b706d05e 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/ParenPatUtil.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/ParenPatUtil.fs @@ -221,22 +221,27 @@ let addParensIfNeeded (pattern: IFSharpPattern) = let nextSibling = nameNode.NextSibling if isInlineSpace nextSibling && nextSibling.NextSibling == pattern && nextSibling.GetTextLength() = 1 then - let settingsStore = pattern.GetSettingsStoreWithEditorConfig() - let spaceBeforeUppercase = - settingsStore.GetValue(fun (key: FSharpFormatSettingsKey) -> key.SpaceBeforeUppercaseInvocation) + ModificationUtil.DeleteChild(nextSibling) - if not spaceBeforeUppercase then - ModificationUtil.DeleteChild(nextSibling) + let settingsStore = parenPattern.GetSettingsStoreWithEditorConfig() let parametersOwnerPat = ParametersOwnerPatNavigator.GetByParameter(parenPattern) - if isNotNull parametersOwnerPat then + if isNotNull parametersOwnerPat && + not (settingsStore.GetValue(fun (key: FSharpFormatSettingsKey) -> key.SpaceBeforeUppercaseInvocation)) then removeSpace parametersOwnerPat.ReferenceName parenPattern let patternDeclaration = ParametersPatternDeclarationNavigator.GetByPattern(parenPattern) let memberDeclaration = MemberDeclarationNavigator.GetByParametersDeclaration(patternDeclaration) - if isNotNull memberDeclaration then + if isNotNull memberDeclaration && + not (settingsStore.GetValue(fun (key: FSharpFormatSettingsKey) -> key.SpaceBeforeUppercaseInvocation)) then removeSpace memberDeclaration.Identifier patternDeclaration + let ctorDeclaration = PrimaryConstructorDeclarationNavigator.GetByParametersDeclaration(patternDeclaration) + let typeDeclaration = FSharpTypeDeclarationNavigator.GetByPrimaryConstructorDeclaration(ctorDeclaration) + if isNotNull typeDeclaration && + not (settingsStore.GetValue(fun (key: FSharpFormatSettingsKey) -> key.SpaceBeforeClassConstructor)) then + removeSpace typeDeclaration.Identifier ctorDeclaration + pattern else pattern From 53a4ff6e7080a1a848c8a8266cc2a38eac3149cf Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Tue, 17 Dec 2024 19:11:56 +0300 Subject: [PATCH 6/8] tests --- .../specifyTypes/patterns/Ands pat 01.fs | 5 ++++ .../specifyTypes/patterns/Ands pat 01.fs.gold | 5 ++++ .../specifyTypes/patterns/As pat 01.fs | 3 +++ .../specifyTypes/patterns/As pat 01.fs.gold | 3 +++ .../specifyTypes/patterns/Lambda 01.fs | 3 +++ .../specifyTypes/patterns/Lambda 01.fs.gold | 3 +++ .../specifyTypes/patterns/Parameter 01.fs | 3 +++ .../patterns/Parameter 01.fs.gold | 3 +++ .../patterns/Parameter 02 - Optional.fs | 4 +++ .../patterns/Parameter 02 - Optional.fs.gold | 4 +++ .../specifyTypes/patterns/Record field 01.fs | 5 ++++ .../patterns/Record field 01.fs.gold | 5 ++++ .../specifyTypes/patterns/Tuple 01.fs | 3 +++ .../specifyTypes/patterns/Tuple 01.fs.gold | 3 +++ .../patterns/Tuple 02 - Top level.fs | 3 +++ .../patterns/Tuple 02 - Top level.fs.gold | 3 +++ .../specifyTypes/patterns/Tuple 03 - As.fs | 3 +++ .../patterns/Tuple 03 - As.fs.gold | 3 +++ .../specifyTypes/patterns/Union case 01.fs | 3 +++ .../patterns/Union case 01.fs.gold | 3 +++ .../patterns/Union case 02 - Named.fs | 3 +++ .../patterns/Union case 02 - Named.fs.gold | 3 +++ .../patterns/Union case 03 - Parens.fs | 3 +++ .../patterns/Union case 03 - Parens.fs.gold | 3 +++ .../src/Intentions/SpecifyTypesTest.fs | 25 +++++++++++++++++++ 25 files changed, 107 insertions(+) create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs create mode 100644 ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs.gold diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs new file mode 100644 index 0000000000..8a2e45e871 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs @@ -0,0 +1,5 @@ +module Module + +let (|Bool|) (x: int) = true + +let f (x{caret} & Bool(_)) = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs.gold new file mode 100644 index 0000000000..ad7e18de3e --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Ands pat 01.fs.gold @@ -0,0 +1,5 @@ +module Module + +let (|Bool|) (x: int) = true + +let f (x: int{caret} & Bool(_)) = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs new file mode 100644 index 0000000000..24131b5f3d --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs @@ -0,0 +1,3 @@ +module Module + +let f (x, y as z{caret}) = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs.gold new file mode 100644 index 0000000000..9ce13b98c7 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/As pat 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +let f (x, y as (z: 'a * 'b){caret}) = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs new file mode 100644 index 0000000000..187e45d4d5 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs @@ -0,0 +1,3 @@ +module Module + +fun x{caret} -> x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs.gold new file mode 100644 index 0000000000..7f2bf28940 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Lambda 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +fun (x: int){caret} -> x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs new file mode 100644 index 0000000000..e2c940f577 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs @@ -0,0 +1,3 @@ +module Module + +let f x{caret} = x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs.gold new file mode 100644 index 0000000000..98e05f2a9b --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +let f (x: int){caret} = x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs new file mode 100644 index 0000000000..09ca243f2c --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs @@ -0,0 +1,4 @@ +module Module + +type A = + member _.M1(?x{caret}) = x.Value + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs.gold new file mode 100644 index 0000000000..3b82122a9a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Parameter 02 - Optional.fs.gold @@ -0,0 +1,4 @@ +module Module + +type A = + member _.M1(?x: int{caret}) = x.Value + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs new file mode 100644 index 0000000000..64f04dd2a0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs @@ -0,0 +1,5 @@ +module Module + +type R = { A: int } + +let f { A = a{caret} } = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs.gold new file mode 100644 index 0000000000..99ff82b8ab --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Record field 01.fs.gold @@ -0,0 +1,5 @@ +module Module + +type R = { A: int } + +let f { A = (a: int){caret} } = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs new file mode 100644 index 0000000000..6223b12fd1 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs @@ -0,0 +1,3 @@ +module Module + +let f (a{caret}, b) = a + b diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs.gold new file mode 100644 index 0000000000..adb7122d69 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +let f (a: int{caret}, b) = a + b diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs new file mode 100644 index 0000000000..7270641ad2 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs @@ -0,0 +1,3 @@ +module Module + +let a, b{caret} = 1, 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs.gold new file mode 100644 index 0000000000..865721db24 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 02 - Top level.fs.gold @@ -0,0 +1,3 @@ +module Module + +let a, (b: int){caret} = 1, 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs new file mode 100644 index 0000000000..bec6d0e280 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs @@ -0,0 +1,3 @@ +module Module + +let f (x{caret}, y as z) = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs.gold new file mode 100644 index 0000000000..d32dbe9277 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Tuple 03 - As.fs.gold @@ -0,0 +1,3 @@ +module Module + +let f (x: 'a{caret}, y as z) = () diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs new file mode 100644 index 0000000000..c1898bf92a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs @@ -0,0 +1,3 @@ +module Module + +let f (Some(x{caret})) = x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs.gold new file mode 100644 index 0000000000..bb0f7ced84 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 01.fs.gold @@ -0,0 +1,3 @@ +module Module + +let f (Some(x: int{caret})) = x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs new file mode 100644 index 0000000000..562a2d56f9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs @@ -0,0 +1,3 @@ +module Module + +let f (Some(Value = x{caret})) = x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs.gold new file mode 100644 index 0000000000..b208f4576a --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 02 - Named.fs.gold @@ -0,0 +1,3 @@ +module Module + +let f (Some(Value = (x: int){caret})) = x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs new file mode 100644 index 0000000000..3a7ddf08d6 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs @@ -0,0 +1,3 @@ +module Module + +let f (Some x{caret}) = x + 1 diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs.gold b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs.gold new file mode 100644 index 0000000000..2bb53247ad --- /dev/null +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/patterns/Union case 03 - Parens.fs.gold @@ -0,0 +1,3 @@ +module Module + +let f (Some(x: int){caret}) = x + 1 diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs index 69ccb7f26f..fb54a70233 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs @@ -58,6 +58,31 @@ type SpecifyFunctionTypesActionTest() = [] member x.``Function - Recursive - Function 04`` () = x.DoNamedTest() +type SpecifyPatternTypeActionTest() = + inherit FSharpContextActionExecuteTestBase() + + override x.ExtraPath = "specifyTypes/patterns" + + [] member x.``Parameter 01``() = x.DoNamedTest() + [] member x.``Parameter 02 - Optional``() = x.DoNamedTest() + + [] member x.``Lambda 01``() = x.DoNamedTest() + + [] member x.``Tuple 01``() = x.DoNamedTest() + [] member x.``Tuple 02 - Top level``() = x.DoNamedTest() + [] member x.``Tuple 03 - As``() = x.DoNamedTest() + + [] member x.``Record field 01``() = x.DoNamedTest() + + [] member x.``Union case 01``() = x.DoNamedTest() + [] member x.``Union case 02 - Named``() = x.DoNamedTest() + [] member x.``Union case 03 - Parens``() = x.DoNamedTest() + + [] member x.``As pat 01``() = x.DoNamedTest() + + [] member x.``Ands pat 01``() = x.DoNamedTest() + + type SpecifyTypesActionAvailabilityTest() = inherit FSharpContextActionAvailabilityTestBase() From b65cc6c6fe41bb377fb155dabab7c7be8306a0fa Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Thu, 13 Feb 2025 00:08:17 +0300 Subject: [PATCH 7/8] wip --- .../src/Intentions/AnnotationActions.fs | 7 ++++++- .../features/daemon/redundantParens/pat/Typed 08 - As.fs | 3 +++ .../daemon/redundantParens/pat/Typed 08 - As.fs.gold | 5 +++++ .../daemon/redundantParens/pat/Typed 09 - Named field.fs | 4 ++++ .../redundantParens/pat/Typed 09 - Named field.fs.gold | 6 ++++++ .../intentions/specifyTypes/availability/Patterns 01.fs | 3 +++ .../src/Daemon/RedundantParenPatTest.fs | 4 ++++ .../src/Intentions/SpecifyTypesTest.fs | 2 ++ 8 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs create mode 100644 ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs create mode 100644 ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs.gold diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs index 2ab8b3fc4b..89b6e26c33 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs @@ -159,13 +159,18 @@ type FunctionAnnotationAction(dataProvider: FSharpContextActionDataProvider) = [, - Description = "Annotate named pattern")>] + Description = "Annotate named parameter/pattern with it is type")>] type PatternAnnotationAction(dataProvider: FSharpContextActionDataProvider) = inherit FSharpContextActionBase(dataProvider) override x.Text = "Add type annotation" override x.IsAvailable _ = let pattern = dataProvider.GetSelectedElement().IgnoreParentParens() + let pattern = + match OptionalValPatNavigator.GetByPattern(pattern) with + | null -> pattern + | x -> x + isNotNull pattern && isNull (TypedPatNavigator.GetByPattern(pattern)) && isNull (BindingNavigator.GetByHeadPattern(pattern)) diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs new file mode 100644 index 0000000000..1258536098 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs @@ -0,0 +1,3 @@ +module Module + +let a as (b: int) = 1 diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs.gold new file mode 100644 index 0000000000..3b47ca1852 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 08 - As.fs.gold @@ -0,0 +1,5 @@ +module Module + +let a as (b: int) = 1 + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs new file mode 100644 index 0000000000..ea086cb3d9 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs @@ -0,0 +1,4 @@ +module Module + +type R = { A: int } +let { A = (a: int) } = failwith "" diff --git a/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs.gold b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs.gold new file mode 100644 index 0000000000..5e6fbc4f40 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/redundantParens/pat/Typed 09 - Named field.fs.gold @@ -0,0 +1,6 @@ +module Module + +type R = { A: int } +let { A = (a: int) } = failwith "" + +--------------------------------------------------------- diff --git a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs index cd8cc6765b..cdc91ac33e 100644 --- a/ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs +++ b/ReSharper.FSharp/test/data/features/intentions/specifyTypes/availability/Patterns 01.fs @@ -4,3 +4,6 @@ let x{off} = 1 let a, b{on} = 1, 1 let f{off} x{on} (So{off}me(y{on})) (z{off}: int) = () + +type A() = + member _.M(?x{on}, ?y{off}: int) = x + y diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/RedundantParenPatTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/RedundantParenPatTest.fs index b83c6c2f2f..06e77d5ae0 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/RedundantParenPatTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/RedundantParenPatTest.fs @@ -56,6 +56,10 @@ type RedundantParenPatTest() = [] member x.``Typed 05 - Members param decl``() = x.DoNamedTest() [] member x.``Typed 06 - Tuple``() = x.DoNamedTest() [] member x.``Typed 07 - Match clause``() = x.DoNamedTest() + //TODO: remove parens + [] member x.``Typed 08 - As``() = x.DoNamedTest() + //TODO: remove parens + [] member x.``Typed 09 - Named field``() = x.DoNamedTest() [] member x.``Wild - Function param 01``() = x.DoNamedTest() [] member x.``Wild - Pattern param 01``() = x.DoNamedTest() diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs index fb54a70233..cfc2401f6e 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Intentions/SpecifyTypesTest.fs @@ -72,9 +72,11 @@ type SpecifyPatternTypeActionTest() = [] member x.``Tuple 02 - Top level``() = x.DoNamedTest() [] member x.``Tuple 03 - As``() = x.DoNamedTest() + //TODO: remove parens [] member x.``Record field 01``() = x.DoNamedTest() [] member x.``Union case 01``() = x.DoNamedTest() + //TODO: remove parens [] member x.``Union case 02 - Named``() = x.DoNamedTest() [] member x.``Union case 03 - Parens``() = x.DoNamedTest() From cc0e5ef134346907edd3a73873e582d56bf28fdc Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Thu, 13 Feb 2025 19:41:30 +0300 Subject: [PATCH 8/8] wip --- .../FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs | 2 +- .../src/Intentions/AnnotationActions.fs | 8 ++++---- .../src/QuickFixes/SpecifyParameterBaseTypeFix.fs | 2 +- .../src/QuickFixes/SpecifyParameterTypeFix.fs | 2 +- .../FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs index 67f69561de..e41b415e0a 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Stages/PatternTypeHintsStage.fs @@ -202,7 +202,7 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet if isNull symbol then ValueNone else let fcsType = symbol.FullType - let pattern, fcsType = fixIfOptionalParameter refPat fcsType + let pattern, fcsType = tryGetOuterOptionalParameterAndItsType refPat fcsType let range = pattern.GetNavigationRange().EndOffsetRange() createTypeHintHighlighting fcsType defaultDisplayContext range pushToHintMode actionsProvider false diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs index 89b6e26c33..797ee4908f 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/Intentions/AnnotationActions.fs @@ -50,10 +50,10 @@ module SpecifyTypes = parenPat.SetPattern(pattern) |> ignore parenPat :> IFSharpPattern - let specifyPattern displayContext (fcsType: FSharpType) (pattern: IFSharpPattern) = + let specifyPatternType displayContext (fcsType: FSharpType) (pattern: IFSharpPattern) = let pattern, fcsType = match pattern with - | :? IReferencePat as pattern -> FcsTypeUtil.fixIfOptionalParameter pattern fcsType + | :? IReferencePat as pattern -> FcsTypeUtil.tryGetOuterOptionalParameterAndItsType pattern fcsType | _ -> pattern, fcsType let pattern = pattern.IgnoreParentParens() @@ -107,7 +107,7 @@ type FunctionAnnotationAction(dataProvider: FSharpContextActionDataProvider) = | TupleLikePattern pat when isTopLevel -> specifyParameterTypes fcsType.GenericArguments pat.Patterns false | pattern -> - SpecifyTypes.specifyPattern displayContext fcsType pattern + SpecifyTypes.specifyPatternType displayContext fcsType pattern specifyParameterTypes types parameters true @@ -186,4 +186,4 @@ type PatternAnnotationAction(dataProvider: FSharpContextActionDataProvider) = let mfv = symbolUse.Symbol :?> FSharpMemberOrFunctionOrValue let displayContext = symbolUse.DisplayContext - SpecifyTypes.specifyPattern displayContext mfv.FullType pattern + SpecifyTypes.specifyPatternType displayContext mfv.FullType pattern diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs index f2032b8f24..01e4d08b7b 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterBaseTypeFix.fs @@ -122,7 +122,7 @@ type SpecifyParameterBaseTypeFix(refExpr: IReferenceExpr, typeUsage: ITypeUsage) use writeCookie = WriteLockCookie.Create(pat.IsPhysical()) let baseType, displayContext = baseType.Value - SpecifyTypes.specifyPattern displayContext baseType pat + SpecifyTypes.specifyPatternType displayContext baseType pat override this.Execute(solution, textControl) = let fcsEntity, displayContext = getFcsEntity typeUsage |> Option.get diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs index a3495a5f52..9af139d3f7 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs @@ -81,7 +81,7 @@ type SpecifyParameterTypeFix(qualifiedExpr: IQualifiedExpr) = override this.SpecifyType(decl, mfv, d) = let decl = decl :?> ILocalReferencePat - SpecifyTypes.specifyPattern d mfv.FullType decl + SpecifyTypes.specifyPatternType d mfv.FullType decl type SpecifyPropertyTypeFix(qualifiedExpr: IQualifiedExpr) = diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs index b5ceddcbb6..a34bc69e2f 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/FcsTypeUtil.fs @@ -22,7 +22,7 @@ let getFunctionTypeArgs includeReturnType fcsType = loop fcsType [] |> List.rev -let fixIfOptionalParameter (pattern: IReferencePat) fcsType = +let tryGetOuterOptionalParameterAndItsType (pattern: IReferencePat) fcsType = let optionalValPat = OptionalValPatNavigator.GetByPattern(pattern) if isNotNull optionalValPat && isOption fcsType then (optionalValPat : IFSharpPattern), fcsType.GenericArguments[0] else pattern, fcsType