From 098f0f58c6febf16d38aa94c4890163470d13e0a Mon Sep 17 00:00:00 2001 From: "Alexey.Berezhnykh" Date: Wed, 12 Feb 2025 17:17:24 +0300 Subject: [PATCH] fixes --- .../Resources/Strings.Designer.fs | 4 +- .../FSharp.Common/Resources/Strings.resx | 6 ++ .../src/Settings/FSharpOptions.fs | 7 +- .../Resources/Strings.Designer.fs | 3 +- .../FSharp.Psi.Daemon/Resources/Strings.resx | 3 + .../FSharpTypeHintBulbActionsProvider.fs | 4 + .../src/Options/FSharpTypeHintOptionsPage.fs | 3 + .../src/Stages/PatternTypeHintsStage.fs | 70 ++++++++++++---- .../src/Util/TypeAnnotationsUtil.fs | 11 +++ .../daemon/typeHints/Patterns 02 - Other.fs | 47 +++++++++++ .../typeHints/Patterns 02 - Other.fs.gold | 83 +++++++++++++++++++ .../typeHints/Settings 01 - Show all.fs.gold | 72 +++++++++------- .../typeHints/Settings 02 - Top level.fs.gold | 52 ++++++------ .../typeHints/Settings 03 - Locals.fs.gold | 27 +++--- .../Settings 04 - Disabled 01.fs.gold | 6 ++ ...ettings 05 - Disabled 02 - By mode.fs.gold | 6 ++ .../Settings 06 - Other patterns.fs.gold | 51 ++++++++++++ ...inished declarations and expressions 01.fs | 4 + ...ed declarations and expressions 01.fs.gold | 18 ++-- .../daemon/typeHints/_SettingsTestSource.fs | 6 ++ .../src/Daemon/TypeHintStageTest.fs | 9 ++ 21 files changed, 403 insertions(+), 89 deletions(-) create mode 100644 ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs create mode 100644 ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs.gold create mode 100644 ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 06 - Other patterns.fs.gold diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.Designer.fs b/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.Designer.fs index 8087a369b9..2eaa7307a8 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.Designer.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.Designer.fs @@ -41,4 +41,6 @@ type public Strings() = static member FSharpTypeHints_TopLevelMembers_Description = Strings.ResourceManager.GetString("FSharpTypeHints_TopLevelMembers_Description") static member FSharpTypeHints_LocalBindings_Description = Strings.ResourceManager.GetString("FSharpTypeHints_LocalBindings_Description") static member FSharpTypeHints_ShowPipeReturnTypes_Description = Strings.ResourceManager.GetString("FSharpTypeHints_ShowPipeReturnTypes_Description") - static member FSharpTypeHints_HideSameLinePipe_Description = Strings.ResourceManager.GetString("FSharpTypeHints_HideSameLinePipe_Description") \ No newline at end of file + static member FSharpTypeHints_HideSameLinePipe_Description = Strings.ResourceManager.GetString("FSharpTypeHints_HideSameLinePipe_Description") + static member FSharpTypeHints_OtherPatterns_Description = Strings.ResourceManager.GetString("FSharpTypeHints_OtherPatterns_Description") + static member FSharpTypeHints_OtherPatternsSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_OtherPatternsSettings_Header") \ No newline at end of file diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.resx b/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.resx index 7f3181fb1e..d108dcfb31 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.resx +++ b/ReSharper.FSharp/src/FSharp/FSharp.Common/Resources/Strings.resx @@ -28,4 +28,10 @@ Hide when |> is on same line as argument + + Type hints for other patterns + + + Other patterns + diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Common/src/Settings/FSharpOptions.fs b/ReSharper.FSharp/src/FSharp/FSharp.Common/src/Settings/FSharpOptions.fs index 6060d8735f..35ebf81cd8 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Common/src/Settings/FSharpOptions.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Common/src/Settings/FSharpOptions.fs @@ -191,7 +191,12 @@ type FSharpTypeHintOptions = [, DescriptionResourceName = nameof(Strings.FSharpTypeHints_LocalBindings_Description))>] - mutable ShowTypeHintsForLocalBindings: PushToHintMode } + mutable ShowTypeHintsForLocalBindings: PushToHintMode + + [, + DescriptionResourceName = nameof(Strings.FSharpTypeHints_OtherPatterns_Description))>] + mutable ShowTypeHintsForOtherPatterns: PushToHintMode } [)>] diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.Designer.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.Designer.fs index 3c96fdf5c1..25b54f92ab 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.Designer.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.Designer.fs @@ -48,4 +48,5 @@ type public Strings() = static member FSharpTypeHints_TopLevelMembersSettings_Comment = Strings.ResourceManager.GetString("FSharpTypeHints_TopLevelMembersSettings_Comment") static member FSharpTypeHints_ShowPipeReturnTypes_Description = Strings.ResourceManager.GetString("FSharpTypeHints_ShowPipeReturnTypes_Description") static member FSharpTypeHints_HideSameLinePipe_Description = Strings.ResourceManager.GetString("FSharpTypeHints_HideSameLinePipe_Description") - static member FSharpTypeHints_PipesSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_PipesSettings_Header") \ No newline at end of file + static member FSharpTypeHints_PipesSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_PipesSettings_Header") + static member FSharpTypeHints_PatternsSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_PatternsSettings_Header") \ No newline at end of file diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.resx b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.resx index 654cc0d29d..223749ddfe 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.resx +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/Resources/Strings.resx @@ -49,4 +49,7 @@ Pipe operators + + Patterns + diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Highlightings/FSharpTypeHintBulbActionsProvider.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Highlightings/FSharpTypeHintBulbActionsProvider.fs index cd1e662636..d9c2c0e83f 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Highlightings/FSharpTypeHintBulbActionsProvider.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Highlightings/FSharpTypeHintBulbActionsProvider.fs @@ -37,3 +37,7 @@ type FSharpTopLevelMembersTypeHintBulbActionsProvider private () = type FSharpLocalBindingTypeHintBulbActionsProvider private () = inherit FSharpTypeHintBulbActionsProvider((fun x -> x.ShowTypeHintsForLocalBindings), Strings.FSharpTypeHints_LocalBindingsSettings_Header) static member val Instance = FSharpLocalBindingTypeHintBulbActionsProvider() + +type FSharpOtherPatternsTypeHintBulbActionsProvider private () = + inherit FSharpTypeHintBulbActionsProvider((fun x -> x.ShowTypeHintsForOtherPatterns), Strings.FSharpTypeHints_OtherPatternsSettings_Header) + static member val Instance = FSharpOtherPatternsTypeHintBulbActionsProvider() diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Options/FSharpTypeHintOptionsPage.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Options/FSharpTypeHintOptionsPage.fs index 67473f2c58..cf105a401e 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Options/FSharpTypeHintOptionsPage.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Daemon/src/Options/FSharpTypeHintOptionsPage.fs @@ -43,6 +43,9 @@ type FSharpTypeHintsOptionsPage(lifetime: Lifetime, optionsPageContext: OptionsP this.AddHeader(Strings.FSharpTypeHints_LocalBindingsSettings_Header) |> ignore this.AddVisibilityOption(fun (s: FSharpTypeHintOptions) -> s.ShowTypeHintsForLocalBindings) + this.AddHeader(Strings.FSharpTypeHints_OtherPatternsSettings_Header) |> ignore + this.AddVisibilityOption(fun (s: FSharpTypeHintOptions) -> s.ShowTypeHintsForOtherPatterns) + this.AddHeader(Strings.FSharpTypeHints_PipesSettings_Header) |> ignore this.AddBoolOption((fun (s: FSharpTypeHintOptions) -> s.ShowPipeReturnTypes), 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 9cd8313f2c..bb92f98fd5 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 @@ -13,6 +13,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Stages open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree +open JetBrains.ReSharper.Plugins.FSharp.Psi.Util open JetBrains.ReSharper.Plugins.FSharp.Settings open JetBrains.ReSharper.Plugins.FSharp.Util open JetBrains.ReSharper.Psi.Tree @@ -21,28 +22,39 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Services.Util.TypeAnnotationsUtil open JetBrains.TextControl.DocumentMarkup.Adornments.IntraTextAdornments type private NodesRequiringHints = - { TopLevelNodes: VisibilityConsumer; LocalNodes: VisibilityConsumer } with + { TopLevelNodes: VisibilityConsumer + LocalNodes: VisibilityConsumer + OtherPatterns: VisibilityConsumer } with member x.HasVisibleItems = x.TopLevelNodes.HasVisibleItems || - x.LocalNodes.HasVisibleItems + x.LocalNodes.HasVisibleItems || + x.OtherPatterns.HasVisibleItems type private FSharpTypeHintSettings = - { TopLevelMembers: PushToHintMode; LocalBindings: PushToHintMode } with + { TopLevelMembers: PushToHintMode + LocalBindings: PushToHintMode + OtherPatterns: PushToHintMode } with static member Create(settingsStore: IContextBoundSettingsStore) = { TopLevelMembers = settingsStore.GetValue(fun (key: FSharpTypeHintOptions) -> key.ShowTypeHintsForTopLevelMembers) .EnsureInlayHintsDefault(settingsStore) LocalBindings = settingsStore.GetValue(fun (key: FSharpTypeHintOptions) -> key.ShowTypeHintsForLocalBindings) - .EnsureInlayHintsDefault(settingsStore) } + .EnsureInlayHintsDefault(settingsStore) + OtherPatterns = settingsStore.GetValue(fun (key: FSharpTypeHintOptions) -> key.ShowTypeHintsForOtherPatterns) + .EnsureInlayHintsDefault(settingsStore)} member x.IsDisabled = x.TopLevelMembers = PushToHintMode.Never && - x.LocalBindings = PushToHintMode.Never + x.LocalBindings = PushToHintMode.Never && + x.OtherPatterns = PushToHintMode.Never type private MembersVisitor(settings) = inherit TreeNodeVisitor() + let disabledForTopBindings = settings.TopLevelMembers = PushToHintMode.Never + let disabledForLocalBindings = settings.LocalBindings = PushToHintMode.Never + let disabledForOtherPatterns = settings.OtherPatterns = PushToHintMode.Never let isTopLevelMember (node: ITreeNode) = match node with @@ -51,12 +63,18 @@ type private MembersVisitor(settings) = | :? IConstructorDeclaration -> true | _ -> false + let isLocalBinding (node: ITreeNode) = + match node with + | :? ILocalBinding + | :? ILambdaExpr -> true + | _ -> false + override x.VisitNode(node, context) = - if settings.LocalBindings = PushToHintMode.Never && isTopLevelMember node then () else + if disabledForLocalBindings && disabledForOtherPatterns && isTopLevelMember node then () else for child in node.Children() do - if settings.TopLevelMembers = PushToHintMode.Never && - isTopLevelMember child then x.VisitNode(child, context) else + if disabledForTopBindings && isTopLevelMember child || disabledForLocalBindings && isLocalBinding child + then x.VisitNode(child, context) else match child with | :? IFSharpTreeNode as treeNode -> treeNode.Accept(x, context) @@ -99,11 +117,20 @@ type private MembersVisitor(settings) = x.VisitNode(constructor, context) override x.VisitForEachExpr(forEachExpr, context) = - let result = collectTypeHintAnchorsForEachExpr forEachExpr - context.LocalNodes.AddRange(result) + if not disabledForOtherPatterns then + let result = collectTypeHintAnchorsForEachExpr forEachExpr + context.OtherPatterns.AddRange(result) x.VisitNode(forEachExpr, context) + override x.VisitMatchClause(matchClause, context) = + if not disabledForOtherPatterns then + let result = collectTypeHintAnchorsForMatchClause matchClause + context.OtherPatterns.AddRange(result) + + x.VisitNode(matchClause, context) + + type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSettingsStore, daemonProcess: IDaemonProcess, settings) = inherit FSharpDaemonStageProcessBase(fsFile, daemonProcess) static let defaultDisplayContext = FSharpDisplayContext.Empty.WithShortTypeNames(true) @@ -182,7 +209,13 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet createTypeHintHighlighting fcsType defaultDisplayContext range pushToHintMode actionsProvider false |> ValueSome - | _ -> ValueNone + | pattern -> + let fcsType = pattern.TryGetFcsType() + if isNull fcsType then ValueNone else + + let range = pattern.GetDocumentRange().EndOffsetRange() + createTypeHintHighlighting fcsType defaultDisplayContext range pushToHintMode actionsProvider false + |> ValueSome let rec getHighlighting (node: ITreeNode) pushToHintMode actionsProvider = match node with @@ -194,7 +227,10 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet | _ -> ValueNone - let adornNodes (topLevelNodes : ITreeNode ICollection) (localNodes : ITreeNode ICollection) = + let adornNodes + (topLevelNodes: ITreeNode ICollection) + (localNodes: ITreeNode ICollection) + (matchClauses: ITreeNode ICollection) = let highlightingConsumer = FilteringHighlightingConsumer(daemonProcess.SourceFile, fsFile, settingsStore) let inline adornNodes nodes pushToHintMode actionsProvider = @@ -207,6 +243,7 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet adornNodes topLevelNodes settings.TopLevelMembers FSharpTopLevelMembersTypeHintBulbActionsProvider.Instance adornNodes localNodes settings.LocalBindings FSharpLocalBindingTypeHintBulbActionsProvider.Instance + adornNodes matchClauses settings.OtherPatterns FSharpOtherPatternsTypeHintBulbActionsProvider.Instance highlightingConsumer.CollectHighlightings() @@ -216,21 +253,24 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet let documentRange = daemonProcess.Document.GetDocumentRange() let visibleRange = daemonProcess.VisibleRange.Intersect(&documentRange) let consumer = { TopLevelNodes = VisibilityConsumer(visibleRange, _.GetNavigationRange()) - LocalNodes = VisibilityConsumer(visibleRange, _.GetNavigationRange()) } + LocalNodes = VisibilityConsumer(visibleRange, _.GetNavigationRange()) + OtherPatterns = VisibilityConsumer(visibleRange, _.GetNavigationRange()) } fsFile.Accept(MembersVisitor(settings), consumer) let topLevelNodes = consumer.TopLevelNodes let localNodes = consumer.LocalNodes + let matchNodes = consumer.OtherPatterns // Partition the expressions to adorn by whether they're visible in the viewport or not let remainingHighlightings = if consumer.HasVisibleItems then // Adorn visible expressions first - let visibleHighlightings = adornNodes topLevelNodes.VisibleItems localNodes.VisibleItems + let visibleHighlightings = + adornNodes topLevelNodes.VisibleItems localNodes.VisibleItems matchNodes.VisibleItems committer.Invoke(DaemonStageResult(visibleHighlightings, visibleRange)) // Finally adorn expressions that aren't visible in the viewport - adornNodes topLevelNodes.NonVisibleItems localNodes.NonVisibleItems + adornNodes topLevelNodes.NonVisibleItems localNodes.NonVisibleItems matchNodes.NonVisibleItems committer.Invoke(DaemonStageResult remainingHighlightings) diff --git a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/TypeAnnotationsUtil.fs b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/TypeAnnotationsUtil.fs index 99b8571dcb..97a43c0875 100644 --- a/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/TypeAnnotationsUtil.fs +++ b/ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Util/TypeAnnotationsUtil.fs @@ -41,6 +41,13 @@ let rec private visitPattern (acc: ITreeNode list) (pattern: IFSharpPattern) = andPat.PatternsEnumerable |> Seq.fold visitPattern acc + | :? IOrPat as orPat -> + visitPattern acc orPat.Pattern1 + + | :? IListConsPat + | :? IArrayOrListPat as collectionPat -> + collectionPat :: acc + | _ -> acc let private collectPatternsRequiringAnnotations acc (parametersOwner: IParameterOwnerMemberDeclaration) = @@ -84,3 +91,7 @@ let collectTypeHintAnchorsForConstructor (ctor: IConstructorDeclaration) = let collectTypeHintAnchorsForEachExpr (forEachExpr: IForEachExpr) = if isNull forEachExpr.InExpression then [] else visitPattern [] forEachExpr.Pattern + +let collectTypeHintAnchorsForMatchClause (matchClause: IMatchClause) = + if isNull matchClause.RArrow then [] + else visitPattern [] matchClause.Pattern diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs b/ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs new file mode 100644 index 0000000000..3e8ffaca16 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs @@ -0,0 +1,47 @@ +module Test + +let _ = + for i = 0 to 10 do () + for i in Seq.empty do () + function x -> () + +match [Some 5] with +| [] -> () +| [x] -> () +| [x: int option] -> () +| [x; y] -> () +| [x; y: int option] -> () +| [_; x] -> () +| [_; _] -> () +| [x; _; _] -> () +| [x; _; Some 5] -> () +| x :: tail -> () +| _ :: (tail: int option list) -> () +| x: int option :: tail -> () +| x: int option :: _ -> () +| x :: (tail: int option list) -> () +| ((x :: tail): int option list) -> () +| _ :: _ -> () +| x :: _ -> () +| _ :: x :: _ -> () +| x :: _ :: _ -> () +| x :: Some y :: _ -> () +| x :: (y :: _) -> () +| x :: y :: [] -> () +| x :: [y] -> () +| Some(x) :: tail -> () +| [Some(x)] +| [_; Some(x)] when let x = 5 in true -> + let y = 5 in () + +match [[5]] with +| [[]] -> () +| [[]; x] -> () + +match [|5|] with +| [||] -> () +| [|x|] -> () +| [|x; y|] -> () + +exception MyException of string +try () with | MyException(x) -> () diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs.gold new file mode 100644 index 0000000000..70ad2fdece --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Patterns 02 - Other.fs.gold @@ -0,0 +1,83 @@ +module Test + +let _ = + for i = 0 to 10 do () + for i||(0) in Seq.empty do () + function x||(1) -> () + +match [Some 5] with +| []||(2) -> () +| [x]||(3) -> () +| [x: int option]||(4) -> () +| [x; y]||(5) -> () +| [x; y: int option]||(6) -> () +| [_; x]||(7) -> () +| [_; _]||(8) -> () +| [x; _; _]||(9) -> () +| [x; _; Some 5]||(10) -> () +| x :: tail||(11) -> () +| _ :: (tail: int option list)||(12) -> () +| x: int option :: tail||(13) -> () +| x: int option :: _||(14) -> () +| x :: (tail: int option list)||(15) -> () +| ((x :: tail): int option list) -> () +| _ :: _||(16) -> () +| x :: _||(17) -> () +| _ :: x :: _||(18) -> () +| x :: _ :: _||(19) -> () +| x :: Some y :: _||(20) -> () +| x :: (y :: _)||(21) -> () +| x :: y :: []||(22) -> () +| x :: [y]||(23) -> () +| Some(x) :: tail||(24) -> () +| [Some(x)]||(25) +| [_; Some(x)] when let x||(26) = 5 in true -> + let y||(27) = 5 in () + +match [[5]] with +| [[]]||(28) -> () +| [[]; x]||(29) -> () + +match [|5|] with +| [||]||(30) -> () +| [|x|]||(31) -> () +| [|x; y|]||(32) -> () + +exception MyException of string +try () with | MyException(x||(33)) -> () + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : obj +(1): ReSharper Parameter Name Hint: : obj +(2): ReSharper Parameter Name Hint: : int option list +(3): ReSharper Parameter Name Hint: : int option list +(4): ReSharper Parameter Name Hint: : int option list +(5): ReSharper Parameter Name Hint: : int option list +(6): ReSharper Parameter Name Hint: : int option list +(7): ReSharper Parameter Name Hint: : int option list +(8): ReSharper Parameter Name Hint: : int option list +(9): ReSharper Parameter Name Hint: : int option list +(10): ReSharper Parameter Name Hint: : int option list +(11): ReSharper Parameter Name Hint: : int option list +(12): ReSharper Parameter Name Hint: : int option list +(13): ReSharper Parameter Name Hint: : int option list +(14): ReSharper Parameter Name Hint: : int option list +(15): ReSharper Parameter Name Hint: : int option list +(16): ReSharper Parameter Name Hint: : int option list +(17): ReSharper Parameter Name Hint: : int option list +(18): ReSharper Parameter Name Hint: : int option list +(19): ReSharper Parameter Name Hint: : int option list +(20): ReSharper Parameter Name Hint: : int option list +(21): ReSharper Parameter Name Hint: : int option list +(22): ReSharper Parameter Name Hint: : int option list +(23): ReSharper Parameter Name Hint: : int option list +(24): ReSharper Parameter Name Hint: : int option list +(25): ReSharper Parameter Name Hint: : int option list +(26): ReSharper Parameter Name Hint: : int +(27): ReSharper Parameter Name Hint: : int +(28): ReSharper Parameter Name Hint: : int list list +(29): ReSharper Parameter Name Hint: : int list list +(30): ReSharper Parameter Name Hint: : int array +(31): ReSharper Parameter Name Hint: : int array +(32): ReSharper Parameter Name Hint: : int array +(33): ReSharper Parameter Name Hint: : string diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 01 - Show all.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 01 - Show all.fs.gold index e3ed22f523..b0d52fcd77 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 01 - Show all.fs.gold +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 01 - Show all.fs.gold @@ -6,37 +6,43 @@ let f x||(0) ||(1)= let g x||(2) ||(3)= () let x||(4) = fun y||(5) -> () for x||(6) in [""] do () + match 5 with x||(7) -> () { new IFormattable with - member x.ToString(format||(7), provider||(8)) ||(9)= "" } + member x.ToString(format||(8), provider||(9)) ||(10)= "" } -fun x||(10) -> () +fun x||(11) -> () -type A(x||(11)) = +match 5 with +| x||(12) when let y||(13) = 5 in true -> + let z||(14) = 3 + () + +type A(x||(15)) = do - let x||(12) = 3 + let x||(16) = 3 () - let array||(13) = [|""|] + let array||(17) = [|""|] - new(x||(14), y||(15)) = A(x + y) + new(x||(18), y||(19)) = A(x + y) - member _.P1||(16) = - let x||(17) = 1 + member _.P1||(20) = + let x||(21) = 1 x - member _.P2||(18) = id + member _.P2||(22) = id member val P3 = 3 with get, set - member x.P4||(19) - with get index||(20) = - let x||(21) = array[index] + member x.P4||(23) + with get index||(24) = + let x||(25) = array[index] x - and set index||(22) value||(23) = + and set index||(26) value||(27) = array[index] <- value - member _.M(x||(24)) (y||(25), z||(26)) ||(27)= - let res||(28) = x + y + z + member _.M(x||(28)) (y||(29), z||(30)) ||(31)= + let res||(32) = x + y + z res --------------------------------------------------------- @@ -47,25 +53,29 @@ type A(x||(11)) = (4): ReSharper Parameter Name Hint: : 'b -> unit (5): ReSharper Parameter Name Hint: : 'b (6): ReSharper Parameter Name Hint: : string -(7): ReSharper Parameter Name Hint: : string -(8): ReSharper Parameter Name Hint: : IFormatProvider -(9): ReSharper Parameter Name Hint: : string -(10): ReSharper Parameter Name Hint: : 'a -(11): ReSharper Parameter Name Hint: : int +(7): ReSharper Parameter Name Hint: : int +(8): ReSharper Parameter Name Hint: : string +(9): ReSharper Parameter Name Hint: : IFormatProvider +(10): ReSharper Parameter Name Hint: : string +(11): ReSharper Parameter Name Hint: : 'a (12): ReSharper Parameter Name Hint: : int -(13): ReSharper Parameter Name Hint: : string array +(13): ReSharper Parameter Name Hint: : int (14): ReSharper Parameter Name Hint: : int (15): ReSharper Parameter Name Hint: : int -(16): ReSharper Parameter Name Hint: : int -(17): ReSharper Parameter Name Hint: : int -(18): ReSharper Parameter Name Hint: : obj -> obj -(19): ReSharper Parameter Name Hint: : string -(20): ReSharper Parameter Name Hint: : int -(21): ReSharper Parameter Name Hint: : string -(22): ReSharper Parameter Name Hint: : int -(23): ReSharper Parameter Name Hint: : string +(16): ReSharper Parameter Name Hint: : int +(17): ReSharper Parameter Name Hint: : string array +(18): ReSharper Parameter Name Hint: : int +(19): ReSharper Parameter Name Hint: : int +(20): ReSharper Parameter Name Hint: : int +(21): ReSharper Parameter Name Hint: : int +(22): ReSharper Parameter Name Hint: : obj -> obj +(23): ReSharper Parameter Name Hint: : string (24): ReSharper Parameter Name Hint: : int -(25): ReSharper Parameter Name Hint: : int +(25): ReSharper Parameter Name Hint: : string (26): ReSharper Parameter Name Hint: : int -(27): ReSharper Parameter Name Hint: : int +(27): ReSharper Parameter Name Hint: : string (28): ReSharper Parameter Name Hint: : int +(29): ReSharper Parameter Name Hint: : int +(30): ReSharper Parameter Name Hint: : int +(31): ReSharper Parameter Name Hint: : int +(32): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 02 - Top level.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 02 - Top level.fs.gold index 3f2eaee2ab..8879432e40 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 02 - Top level.fs.gold +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 02 - Top level.fs.gold @@ -6,55 +6,59 @@ let f x||(0) ||(1)= let g x = () let x = fun y -> () for x in [""] do () + match 5 with x -> () { new IFormattable with member x.ToString(format, provider) = "" } -fun x||(2) -> () +fun x -> () -type A(x||(3)) = +match 5 with +| x when let y = 5 in true -> + let z = 3 + () + +type A(x||(2)) = do - let x||(4) = 3 + let x = 3 () - let array||(5) = [|""|] + let array||(3) = [|""|] - new(x||(6), y||(7)) = A(x + y) + new(x||(4), y||(5)) = A(x + y) - member _.P1||(8) = + member _.P1||(6) = let x = 1 x - member _.P2||(9) = id + member _.P2||(7) = id member val P3 = 3 with get, set - member x.P4||(10) - with get index||(11) = + member x.P4||(8) + with get index||(9) = let x = array[index] x - and set index||(12) value||(13) = + and set index||(10) value||(11) = array[index] <- value - member _.M(x||(14)) (y||(15), z||(16)) ||(17)= + member _.M(x||(12)) (y||(13), z||(14)) ||(15)= let res = x + y + z res --------------------------------------------------------- (0): ReSharper Parameter Name Hint: : 'a (1): ReSharper Parameter Name Hint: : IFormattable -(2): ReSharper Parameter Name Hint: : 'a -(3): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : int +(3): ReSharper Parameter Name Hint: : string array (4): ReSharper Parameter Name Hint: : int -(5): ReSharper Parameter Name Hint: : string array -(6): ReSharper Parameter Name Hint: : int -(7): ReSharper Parameter Name Hint: : int -(8): ReSharper Parameter Name Hint: : int -(9): ReSharper Parameter Name Hint: : obj -> obj -(10): ReSharper Parameter Name Hint: : string -(11): ReSharper Parameter Name Hint: : int +(5): ReSharper Parameter Name Hint: : int +(6): ReSharper Parameter Name Hint: : int +(7): ReSharper Parameter Name Hint: : obj -> obj +(8): ReSharper Parameter Name Hint: : string +(9): ReSharper Parameter Name Hint: : int +(10): ReSharper Parameter Name Hint: : int +(11): ReSharper Parameter Name Hint: : string (12): ReSharper Parameter Name Hint: : int -(13): ReSharper Parameter Name Hint: : string +(13): ReSharper Parameter Name Hint: : int (14): ReSharper Parameter Name Hint: : int -(15): ReSharper Parameter Name Hint: : int -(16): ReSharper Parameter Name Hint: : int -(17): ReSharper Parameter Name Hint: : int +(15): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 03 - Locals.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 03 - Locals.fs.gold index 29cbcac612..1a9dd8d656 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 03 - Locals.fs.gold +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 03 - Locals.fs.gold @@ -5,15 +5,21 @@ open System let f x = let g x||(0) ||(1)= () let x||(2) = fun y||(3) -> () - for x||(4) in [""] do () + for x in [""] do () + match 5 with x -> () { new IFormattable with member x.ToString(format, provider) = "" } -fun x||(5) -> () +fun x||(4) -> () + +match 5 with +| x when let y||(5) = 5 in true -> + let z||(6) = 3 + () type A(x) = do - let x||(6) = 3 + let x||(7) = 3 () let array = [|""|] @@ -21,7 +27,7 @@ type A(x) = new(x, y) = A(x + y) member _.P1 = - let x||(7) = 1 + let x||(8) = 1 x member _.P2 = id @@ -30,13 +36,13 @@ type A(x) = member x.P4 with get index = - let x||(8) = array[index] + let x||(9) = array[index] x and set index value = array[index] <- value member _.M(x) (y, z) = - let res||(9) = x + y + z + let res||(10) = x + y + z res --------------------------------------------------------- @@ -44,9 +50,10 @@ type A(x) = (1): ReSharper Parameter Name Hint: : unit (2): ReSharper Parameter Name Hint: : 'b -> unit (3): ReSharper Parameter Name Hint: : 'b -(4): ReSharper Parameter Name Hint: : string -(5): ReSharper Parameter Name Hint: : 'a +(4): ReSharper Parameter Name Hint: : 'a +(5): ReSharper Parameter Name Hint: : int (6): ReSharper Parameter Name Hint: : int (7): ReSharper Parameter Name Hint: : int -(8): ReSharper Parameter Name Hint: : string -(9): ReSharper Parameter Name Hint: : int +(8): ReSharper Parameter Name Hint: : int +(9): ReSharper Parameter Name Hint: : string +(10): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 04 - Disabled 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 04 - Disabled 01.fs.gold index 7e3afce4dd..397ba1d7fc 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 04 - Disabled 01.fs.gold +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 04 - Disabled 01.fs.gold @@ -6,11 +6,17 @@ let f x = let g x = () let x = fun y -> () for x in [""] do () + match 5 with x -> () { new IFormattable with member x.ToString(format, provider) = "" } fun x -> () +match 5 with +| x when let y = 5 in true -> + let z = 3 + () + type A(x) = do let x = 3 diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 05 - Disabled 02 - By mode.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 05 - Disabled 02 - By mode.fs.gold index 7e3afce4dd..397ba1d7fc 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 05 - Disabled 02 - By mode.fs.gold +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 05 - Disabled 02 - By mode.fs.gold @@ -6,11 +6,17 @@ let f x = let g x = () let x = fun y -> () for x in [""] do () + match 5 with x -> () { new IFormattable with member x.ToString(format, provider) = "" } fun x -> () +match 5 with +| x when let y = 5 in true -> + let z = 3 + () + type A(x) = do let x = 3 diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 06 - Other patterns.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 06 - Other patterns.fs.gold new file mode 100644 index 0000000000..e7bddfa7c0 --- /dev/null +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Settings 06 - Other patterns.fs.gold @@ -0,0 +1,51 @@ +module Test + +open System + +let f x = + let g x = () + let x = fun y -> () + for x||(0) in [""] do () + match 5 with x||(1) -> () + { new IFormattable with + member x.ToString(format, provider) = "" } + +fun x -> () + +match 5 with +| x||(2) when let y = 5 in true -> + let z = 3 + () + +type A(x) = + do + let x = 3 + () + + let array = [|""|] + + new(x, y) = A(x + y) + + member _.P1 = + let x = 1 + x + + member _.P2 = id + + member val P3 = 3 with get, set + + member x.P4 + with get index = + let x = array[index] + x + and set index value = + array[index] <- value + + member _.M(x) (y, z) = + let res = x + y + z + res + +--------------------------------------------------------- +(0): ReSharper Parameter Name Hint: : string +(1): ReSharper Parameter Name Hint: : int +(2): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs b/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs index 65c0eddf8f..37e154c371 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs @@ -10,6 +10,10 @@ module M1 = () let _ = fun x let _ = fun x -> () + function | x + function | x -> () + match 5 with x + match 5 with x -> () module M2 = type A1(obj) diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs.gold index ef71f5d03c..0bd7b6086f 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs.gold +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/Unfinished declarations and expressions 01.fs.gold @@ -10,17 +10,21 @@ module M1 = () let _ = fun x let _ = fun x||(4) -> () + function | x + function | x||(5) -> () + match 5 with x + match 5 with x||(6) -> () module M2 = type A1(obj) - type A2(obj||(5)) = class end + type A2(obj||(7)) = class end module M3 = type A() = new (x) - new (x||(6), y||(7)) = A() + new (x||(8), y||(9)) = A() member _.P1 - member _.P2||(8) = 3 + member _.P2||(10) = 3 --------------------------------------------------------- (0): ReSharper Parameter Name Hint: : 'a @@ -28,7 +32,9 @@ module M3 = (2): ReSharper Parameter Name Hint: : int (3): ReSharper Parameter Name Hint: : char (4): ReSharper Parameter Name Hint: : 'a -(5): ReSharper Parameter Name Hint: : obj -(6): ReSharper Parameter Name Hint: : obj +(5): ReSharper Parameter Name Hint: : 'a +(6): ReSharper Parameter Name Hint: : int (7): ReSharper Parameter Name Hint: : obj -(8): ReSharper Parameter Name Hint: : int +(8): ReSharper Parameter Name Hint: : obj +(9): ReSharper Parameter Name Hint: : obj +(10): ReSharper Parameter Name Hint: : int diff --git a/ReSharper.FSharp/test/data/features/daemon/typeHints/_SettingsTestSource.fs b/ReSharper.FSharp/test/data/features/daemon/typeHints/_SettingsTestSource.fs index 9c608a6910..4207cec5bc 100644 --- a/ReSharper.FSharp/test/data/features/daemon/typeHints/_SettingsTestSource.fs +++ b/ReSharper.FSharp/test/data/features/daemon/typeHints/_SettingsTestSource.fs @@ -6,11 +6,17 @@ let f x = let g x = () let x = fun y -> () for x in [""] do () + match 5 with x -> () { new IFormattable with member x.ToString(format, provider) = "" } fun x -> () +match 5 with +| x when let y = 5 in true -> + let z = 3 + () + type A(x) = do let x = 3 diff --git a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/TypeHintStageTest.fs b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/TypeHintStageTest.fs index 673ccaa274..cd7bfed230 100644 --- a/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/TypeHintStageTest.fs +++ b/ReSharper.FSharp/test/src/FSharp.Intentions.Tests/src/Daemon/TypeHintStageTest.fs @@ -12,6 +12,7 @@ open NUnit.Framework [)>] [, "ShowTypeHintsForTopLevelMembers", PushToHintMode.Always)>] [, "ShowTypeHintsForLocalBindings", PushToHintMode.Always)>] +[, "ShowTypeHintsForOtherPatterns", PushToHintMode.Always)>] type TypeHintStageTest() = inherit FSharpHighlightingTestBase() @@ -21,9 +22,11 @@ type TypeHintStageTest() = [] member x.``Settings 01 - Show all``() = x.DoSettingsTest() [, "ShowTypeHintsForLocalBindings", PushToHintMode.Never)>] + [, "ShowTypeHintsForOtherPatterns", PushToHintMode.Never)>] [] member x.``Settings 02 - Top level``() = x.DoSettingsTest() [, "ShowTypeHintsForTopLevelMembers", PushToHintMode.Never)>] + [, "ShowTypeHintsForOtherPatterns", PushToHintMode.Never)>] [] member x.``Settings 03 - Locals``() = x.DoSettingsTest() [, "EnableInlayHints", false)>] @@ -32,9 +35,15 @@ type TypeHintStageTest() = [, "DefaultMode", PushToHintMode.Never)>] [, "ShowTypeHintsForTopLevelMembers", PushToHintMode.Default)>] [, "ShowTypeHintsForLocalBindings", PushToHintMode.Default)>] + [, "ShowTypeHintsForOtherPatterns", PushToHintMode.Default)>] [] member x.``Settings 05 - Disabled 02 - By mode``() = x.DoSettingsTest() + [, "ShowTypeHintsForTopLevelMembers", PushToHintMode.Never)>] + [, "ShowTypeHintsForLocalBindings", PushToHintMode.Never)>] + [] member x.``Settings 06 - Other patterns``() = x.DoSettingsTest() + [] member x.``Patterns 01``() = x.DoNamedTest() + [] member x.``Patterns 02 - Other``() = x.DoNamedTest() [] member x.``Unfinished declarations and expressions 01``() = x.DoNamedTest()