diff --git a/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs b/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs
index b3a1da56f3..3da84a1a1f 100644
--- a/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs
+++ b/ReSharper.FSharp/src/FSharp.Common/src/Settings/FSharpOptions.fs
@@ -147,7 +147,7 @@ type FSharpOptionsPage
this.AddBoolOption((fun key -> key.FsiInteractiveEditor), RichText(FSharpExperimentalFeatures.fsiInteractiveEditor)) |> ignore
this.AddHeader("Type hints")
- let showPipeReturnTypes = this.AddBoolOption((fun key -> key.ShowPipeReturnTypes), RichText(FSharpTypeHintOptions.pipeReturnTypes), null)
+ this.AddBoolOption((fun key -> key.ShowPipeReturnTypes), RichText(FSharpTypeHintOptions.pipeReturnTypes), null) |> ignore
do
use _x = this.Indent()
[
@@ -156,7 +156,7 @@ type FSharpOptionsPage
|> Seq.iter (fun checkbox ->
this.AddBinding(checkbox, BindingStyle.IsEnabledProperty, (fun key -> key.ShowPipeReturnTypes), id)
)
-
+
this.AddHeader("FSharp.Compiler.Service options")
this.AddBoolOption((fun key -> key.EnableReactorMonitor), RichText(enableFcsReactorMonitor), null) |> ignore
this.AddBoolOption((fun key -> key.BackgroundTypeCheck), RichText(backgroundTypeCheck), null) |> ignore
diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj b/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj
index 93e088e0d6..fa8cf1704a 100644
--- a/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj
+++ b/ReSharper.FSharp/src/FSharp.Psi.Features/FSharp.Psi.Features.fsproj
@@ -62,6 +62,7 @@
+
diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs
index 32b82206a6..ddd4758439 100644
--- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs
+++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Highlightings/TypeHintHighlighting.fs
@@ -9,13 +9,8 @@ open JetBrains.ReSharper.Feature.Services.Daemon
open JetBrains.TextControl.DocumentMarkup
open JetBrains.UI.RichText
-[)>]
-[,
- AttributeId = AnalysisHighlightingAttributeIds.PARAMETER_NAME_HINT,
- OverlapResolve = OverlapResolveKind.NONE,
- ShowToolTipInStatusBar = false)>]
-type TypeHintHighlighting(typeNameString: string, range: DocumentRange) =
+[]
+type TypeHintHighlightingBase(typeNameString: string, range: DocumentRange, mode) =
let text = RichText(": " + typeNameString)
interface IHighlighting with
@@ -28,18 +23,19 @@ type TypeHintHighlighting(typeNameString: string, range: DocumentRange) =
member x.TestOutput = text.Text
member x.Text = text
+ member x.Mode = mode
member x.IsValid() = not text.IsEmpty && not range.IsEmpty
and [] TypeHintAdornmentProvider() =
interface IHighlighterIntraTextAdornmentProvider with
member x.IsValid(highlighter) =
match highlighter.UserData with
- | :? TypeHintHighlighting as dm -> dm.IsValid()
+ | :? TypeHintHighlightingBase as dm -> dm.IsValid()
| _ -> false
member x.CreateDataModel(highlighter) =
match highlighter.UserData with
- | :? TypeHintHighlighting as thh ->
+ | :? TypeHintHighlightingBase as thh ->
{ new IIntraTextAdornmentDataModel with
override x.Text = thh.Text
override x.HasContextMenu = false
@@ -51,6 +47,26 @@ and [] TypeHintAdornmentProvider() =
override x.IconId = null
override x.IsPreceding = false
override x.Order = 0
- override x.InlayHintsMode = InlayHintsMode.Default
+ override x.InlayHintsMode = thh.Mode
}
| _ -> null
+
+
+[)>]
+[,
+ AttributeId = AnalysisHighlightingAttributeIds.PARAMETER_NAME_HINT,
+ OverlapResolve = OverlapResolveKind.NONE,
+ ShowToolTipInStatusBar = false)>]
+type TypeHintHighlighting(typeNameString: string, range: DocumentRange, mode) =
+ inherit TypeHintHighlightingBase(typeNameString, range, mode)
+
+
+[)>]
+[,
+ AttributeId = AnalysisHighlightingAttributeIds.PARAMETER_NAME_HINT,
+ OverlapResolve = OverlapResolveKind.NONE,
+ ShowToolTipInStatusBar = false)>]
+type PipeTypeHintHighlighting(typeNameString: string, range: DocumentRange) =
+ inherit TypeHintHighlightingBase(typeNameString, range, InlayHintsMode.Default)
diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs
index 08faed8630..8a978f7b36 100644
--- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs
+++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeCodeVisionProvider.fs
@@ -59,7 +59,7 @@ type InferredTypeCodeVisionProvider() =
member x.OnExtraActionClick(_, _, _) = ()
-[]
+[ |])>]
type InferredTypeCodeVisionStage(provider: InferredTypeCodeVisionProvider) =
inherit FSharpDaemonStageBase()
diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeHintStage.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeHintStage.fs
new file mode 100644
index 0000000000..439292a73c
--- /dev/null
+++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/InferredTypeHintStage.fs
@@ -0,0 +1,201 @@
+namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Stages
+
+open FSharp.Compiler.SourceCodeServices
+open JetBrains.Application.InlayHints
+open JetBrains.Application.Settings
+open JetBrains.Application.Settings.WellKnownRootKeys
+open JetBrains.ProjectModel
+open JetBrains.ReSharper.Feature.Services.InlayHints
+open JetBrains.ReSharper.Feature.Services.TypeNameHints
+open JetBrains.ReSharper.Plugins.FSharp
+open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util
+open JetBrains.ReSharper.Plugins.FSharp.Psi.Util
+open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings
+open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl
+open JetBrains.ReSharper.Plugins.FSharp.Util
+open JetBrains.ReSharper.Psi
+open JetBrains.ReSharper.Psi.ExtensionsAPI
+open JetBrains.ReSharper.Psi.Naming
+open JetBrains.ReSharper.Psi.Naming.Impl
+open JetBrains.ReSharper.Psi.Tree
+open JetBrains.ReSharper.Feature.Services.Daemon
+open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
+open JetBrains.Util
+
+[, "ReSharper F# Type Name Hints settings")>]
+type FSharpTypeNameHintsOptions() =
+ inherit TypeNameHintsOptionsBase()
+
+ []
+ val mutable ShowTypeNameHintsForLambdaExpressionParameters: InlayHintsMode
+
+ []
+ val mutable ShowTypeNameHintsForVarDeclarationsInPatternMatchingExpressions: InlayHintsMode
+
+
+type FSharpTypeNameHintHighlightingContext(settingsStore: IContextBoundSettingsStore) =
+ inherit TypeNameHintHighlightingContext(settingsStore)
+
+ member val ShowTypeNameHintsForLambdaExpressionParameters =
+ settingsStore.GetValue(fun (options: FSharpTypeNameHintsOptions) ->
+ options.ShowTypeNameHintsForLambdaExpressionParameters)
+
+ member val ShowTypeNameHintsForVarDeclarationsInPatternMatchingExpressions =
+ settingsStore.GetValue(fun (options: FSharpTypeNameHintsOptions) ->
+ options.ShowTypeNameHintsForVarDeclarationsInPatternMatchingExpressions)
+
+
+type LocalReferencePatternVisitor
+ (fsFile: IFSharpFile, context: FSharpTypeNameHintHighlightingContext, namingPolicyProvider, nameParser) =
+ inherit TreeNodeVisitor()
+
+ let isTypeEvidentFromVariableNamePrefix (fcsType: FSharpType) (variableNameParts: string[]) =
+ variableNameParts.Length > 0 &&
+
+ match variableNameParts.[0] with
+ | IgnoreCase "has" | IgnoreCase "is" -> fcsType.MapType(EmptyList.InstanceList, fsFile.GetPsiModule()).IsBool()
+ | _ -> false
+
+ let isEvidentFromVariableName (fcsType: FSharpType) variableName =
+ if not context.HideTypeNameHintsWhenTypeNameIsEvidentFromVariableName then false else
+ if not fcsType.HasTypeDefinition then false else
+
+ let nameParts = NamesHelper.GetParts(nameParser, namingPolicyProvider, variableName)
+
+ let fcsEntity = fcsType.TypeDefinition
+ if isTypeEvidentFromVariableNamePrefix fcsType nameParts then true else
+
+ match fcsEntity.LogicalName with
+ | IgnoreCase variableName -> true
+ | typeName -> NamesHelper.IsLike(nameParts, NamesHelper.GetParts(nameParser, namingPolicyProvider, typeName))
+
+ let isTypeOfPatternEvident (pattern: IFSharpPattern) =
+
+ // v-- not evident
+ // x::y::z
+ // ^-- evident
+ let listConsPat = ListConsPatNavigator.GetByHeadPattern pattern
+ if isNotNull listConsPat then
+ isNotNull (ListConsPatNavigator.GetByTailPattern(listConsPat))
+
+ // x::y::z
+ // ^-- evident
+ elif isNotNull (ListConsPatNavigator.GetByTailPattern(pattern)) then
+ true else
+
+ // v-- not evident
+ // [x; y; z]
+ // ^--^-- evident
+ let listOrListPat = ArrayOrListPatNavigator.GetByPattern(pattern)
+ if isNotNull listOrListPat then
+ match Seq.tryHead listOrListPat.PatternsEnumerable with
+ | None -> false
+ | Some head -> head <> pattern
+ else
+ false
+
+ override x.VisitNode(node, context) =
+ for child in node.Children() do
+ match child with
+ | :? IFSharpTreeNode as treeNode -> treeNode.Accept(x, (context))
+ | _ -> ()
+
+ override x.VisitLocalReferencePat(localRefPat, (consumer, inlayHintsMode)) =
+ let pat = localRefPat.IgnoreParentParens()
+ if isNotNull (TypedPatNavigator.GetByPattern(pat)) then () else
+
+ let binding = BindingNavigator.GetByHeadPattern(pat)
+ if isNotNull binding && isNotNull binding.ReturnTypeInfo then () else
+
+ let variableName = localRefPat.SourceName
+ if variableName = SharedImplUtil.MISSING_DECLARATION_NAME then () else
+
+ if isTypeOfPatternEvident pat then () else
+
+ let symbolUse = localRefPat.GetFSharpSymbolUse()
+ if isNull symbolUse then () else
+
+ match symbolUse.Symbol with
+ | :? FSharpMemberOrFunctionOrValue as mfv when not (isEvidentFromVariableName mfv.FullType variableName) ->
+ let typeNameStr = symbolUse.DisplayContext.WithShortTypeNames(true) |> mfv.FullType.Format
+ let range = localRefPat.GetNavigationRange().EndOffsetRange()
+
+ // todo: TypeNameHintHighlighting can be used when RIDER-39605 is resolved
+ consumer.AddHighlighting(TypeHintHighlighting(typeNameStr, range, inlayHintsMode))
+ | _ -> ()
+
+type InferredTypeHintHighlightingProcess
+ (fsFile, settings: IContextBoundSettingsStore, highlightingContext: FSharpTypeNameHintHighlightingContext,
+ namingManager: NamingManager, nameParser: NameParser, daemonProcess, isEnabled) =
+ inherit FSharpDaemonStageProcessBase(fsFile, daemonProcess)
+
+ let namingPolicyProvider = namingManager.Policy.GetPolicyProvider(fsFile.Language, fsFile.GetSourceFile())
+ let hideHintsForEvidentTypes = highlightingContext.HideTypeNameHintsForImplicitlyTypedVariablesWhenTypeIsEvident
+
+ let visitor = LocalReferencePatternVisitor(fsFile, highlightingContext, namingPolicyProvider, nameParser)
+
+ let visitLetBindings (letBindings: ILetBindings) consumer =
+ if highlightingContext.ShowTypeNameHintsForImplicitlyTypedVariables = InlayHintsMode.Never then () else
+
+ for binding in letBindings.Bindings do
+ if hideHintsForEvidentTypes && isTypeEvident binding.Expression then () else
+
+ match binding.HeadPattern with
+ | null -> ()
+ | headPat -> headPat.Accept(visitor, consumer)
+
+ override x.Execute(committer) =
+ if not isEnabled then
+ committer.Invoke(DaemonStageResult(EmptyArray.Instance, 0))
+ committer.Invoke(DaemonStageResult(EmptyArray.Instance, 1))
+ else
+ let consumer = FilteringHighlightingConsumer(daemonProcess.SourceFile, fsFile, settings)
+ fsFile.ProcessThisAndDescendants(Processor(x, consumer))
+ committer.Invoke(DaemonStageResult(consumer.Highlightings))
+
+ override x.VisitLetBindingsDeclaration(moduleDecl, consumer) =
+ visitLetBindings moduleDecl (consumer, InlayHintsMode.Default)
+
+ override x.VisitLetOrUseExpr(letOrUseExpr, consumer) =
+ visitLetBindings letOrUseExpr (consumer, InlayHintsMode.Default)
+
+ override x.VisitParametersPatternDeclaration(paramDecl, consumer) =
+ let inlayHintsMode = highlightingContext.ShowTypeNameHintsForImplicitlyTypedVariables
+ if inlayHintsMode <> InlayHintsMode.Never then
+ match paramDecl.Pattern with
+ | null -> ()
+ | pattern -> pattern.Accept(visitor, (consumer, inlayHintsMode))
+
+ override x.VisitMatchClause(matchClause, consumer) =
+ let inlayHintsMode = highlightingContext.ShowTypeNameHintsForVarDeclarationsInPatternMatchingExpressions
+ if inlayHintsMode <> InlayHintsMode.Never then
+ match matchClause.Pattern with
+ | null -> ()
+ | pattern -> pattern.Accept(visitor, (consumer, inlayHintsMode))
+
+ override x.VisitLambdaExpr(lambdaExpr, consumer) =
+ let inlayHintsMode = highlightingContext.ShowTypeNameHintsForLambdaExpressionParameters
+ if inlayHintsMode <> InlayHintsMode.Never then
+ for pattern in lambdaExpr.Patterns do
+ if isNotNull pattern then
+ pattern.Accept(visitor, (consumer, inlayHintsMode))
+
+
+[ |])>]
+type InferredTypeHintStage(namingManager: NamingManager, nameParser: NameParser) =
+ inherit FSharpDaemonStageBase()
+
+ override x.IsSupported(sourceFile, processKind) =
+ processKind = DaemonProcessKind.VISIBLE_DOCUMENT &&
+ base.IsSupported(sourceFile, processKind) &&
+ not (sourceFile.LanguageType.Is())
+
+ override x.CreateStageProcess(fsFile, settings, daemonProcess) =
+ let context = FSharpTypeNameHintHighlightingContext(settings)
+
+ let isEnabled =
+ context.ShowTypeNameHintsForImplicitlyTypedVariables <> InlayHintsMode.Never ||
+ context.ShowTypeNameHintsForLambdaExpressionParameters <> InlayHintsMode.Never ||
+ context.ShowTypeNameHintsForVarDeclarationsInPatternMatchingExpressions <> InlayHintsMode.Never
+
+ InferredTypeHintHighlightingProcess(fsFile, settings, context, namingManager, nameParser, daemonProcess, isEnabled) :> _
diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs
index 04a583196a..11581eacb7 100644
--- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs
+++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Daemon/Stages/PipeChainTypeHintStage.fs
@@ -92,7 +92,7 @@ type PipeChainHighlightingProcess(logger: ILogger, fsFile, settings: IContextBou
// Use EndOffsetRange to ensure the adornment appears at the end of multi-line expressions
let range = exprToAdorn.GetNavigationRange().EndOffsetRange()
- highlightingConsumer.AddHighlighting(TypeHintHighlighting(returnTypeStr, range))
+ highlightingConsumer.AddHighlighting(PipeTypeHintHighlighting(returnTypeStr, range))
| _ -> ()
highlightingConsumer.Highlightings
@@ -137,7 +137,7 @@ type PipeChainHighlightingProcess(logger: ILogger, fsFile, settings: IContextBou
committer.Invoke(DaemonStageResult remainingHighlightings)
-[ |])>]
+[ |])>]
type PipeChainTypeHintStage(logger: ILogger) =
inherit FSharpDaemonStageBase()
diff --git a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs
index 471fb1e431..2f9125c151 100644
--- a/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs
+++ b/ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpExpressionUtil.fs
@@ -130,3 +130,21 @@ let setBindingExpression (expr: IFSharpExpression) contextIndent (letBindings: #
ModificationUtil.AddChildBefore(newExpr, NewLine(expr.GetLineEnding())) |> ignore
ModificationUtil.AddChildBefore(newExpr, Whitespace(contextIndent + indentSize)) |> ignore
shiftNode indentSize newExpr
+
+let rec isTypeEvident (expr: IFSharpExpression) =
+ match expr.IgnoreInnerParens() with
+ | :? IObjExpr
+ | :? ICastExpr
+ | :? ILambdaExpr
+ | :? ILiteralExpr -> true
+
+ | :? ITupleExpr as tupleExpr ->
+ tupleExpr.Expressions |> Seq.forall isTypeEvident
+
+ | :? IArrayOrListExpr as arrayOrListExpr ->
+ match arrayOrListExpr.Expression with
+ | :? ISequentialExpr as seqExpr ->
+ isTypeEvident (seqExpr.ExpressionsEnumerable.FirstOrDefault())
+ | _ -> false
+
+ | _ -> false
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs
new file mode 100644
index 0000000000..1b62bcc3e0
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs
@@ -0,0 +1,4 @@
+let add () =
+ "hello there"
+
+let l = fun () -> "hello there"
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs.gold
new file mode 100644
index 0000000000..1cb0ef0663
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 01 - No arguments.fs.gold
@@ -0,0 +1,6 @@
+let add () =
+ "hello there"
+
+let l = fun () -> "hello there"
+
+---------------------------------------------------------
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs
new file mode 100644
index 0000000000..5bbe44c611
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs
@@ -0,0 +1,4 @@
+let add x y =
+ x + y
+
+let x = fun x y -> x + y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs.gold
new file mode 100644
index 0000000000..83254c5e10
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 02 - Curried arguments.fs.gold
@@ -0,0 +1,22 @@
+ShowTypeNameHintsForLambdaExpressionParameters = True
+let add x||(0) y||(1) =
+ x + y
+
+let x = fun x||(2) y||(3) -> x + y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+(2): ReSharper Parameter Name Hint: : int
+(3): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForLambdaExpressionParameters = False
+let add x||(0) y||(1) =
+ x + y
+
+let x = fun x y -> x + y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs
new file mode 100644
index 0000000000..bb3941e5c6
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs
@@ -0,0 +1,4 @@
+let add x y =
+ 15 + y
+
+let l = fun x y -> 15 + y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs.gold
new file mode 100644
index 0000000000..eb77a6f698
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 03 - Generic arguments.fs.gold
@@ -0,0 +1,10 @@
+let add x||(0) y||(1) =
+ 15 + y
+
+let l = fun x||(2) y||(3) -> 15 + y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : 'a
+(1): ReSharper Parameter Name Hint: : int
+(2): ReSharper Parameter Name Hint: : 'a
+(3): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs
new file mode 100644
index 0000000000..81ac6f5c66
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs
@@ -0,0 +1,4 @@
+let add (x, y) =
+ x + y
+
+let l = fun (x, y) -> x + y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs.gold
new file mode 100644
index 0000000000..3e8d30f3e7
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 04 - Tupled arguments.fs.gold
@@ -0,0 +1,10 @@
+let add (x||(0), y||(1)) =
+ x + y
+
+let l = fun (x||(2), y||(3)) -> x + y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+(2): ReSharper Parameter Name Hint: : int
+(3): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs
new file mode 100644
index 0000000000..ca61b6d20e
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs
@@ -0,0 +1,4 @@
+let subtract x (y : int) =
+ x - y
+
+let l = fun x (y: int) -> x - y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs.gold
new file mode 100644
index 0000000000..2e09680225
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 05 - Type annotated - Curried.fs.gold
@@ -0,0 +1,19 @@
+ShowTypeNameHintsForImplicitlyTypedVariables = True
+let subtract x||(0) (y : int) =
+ x - y
+
+let l = fun x||(1) (y: int) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForImplicitlyTypedVariables = False
+let subtract x (y : int) =
+ x - y
+
+let l = fun x||(0) (y: int) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs
new file mode 100644
index 0000000000..f658346e40
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs
@@ -0,0 +1,4 @@
+let subtract (x: int, y) =
+ x - y
+
+let l = fun (x: int, y) -> x - y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs.gold
new file mode 100644
index 0000000000..e290581470
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 06 - Type annotated - Tupled.fs.gold
@@ -0,0 +1,19 @@
+ShowTypeNameHintsForImplicitlyTypedVariables = True
+let subtract (x: int, y||(0)) =
+ x - y
+
+let l = fun (x: int, y||(1)) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForImplicitlyTypedVariables = False
+let subtract (x: int, y) =
+ x - y
+
+let l = fun (x: int, y||(0)) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs
new file mode 100644
index 0000000000..e76334a2f1
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs
@@ -0,0 +1,4 @@
+let hello () =
+ let localFunc x y = x + y
+ let l = fun x y -> x + y
+ ()
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs.gold
new file mode 100644
index 0000000000..48d5d33dc3
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 07 - Local function.fs.gold
@@ -0,0 +1,10 @@
+let hello () =
+ let localFunc x||(0) y||(1) = x + y
+ let l = fun x||(2) y||(3) -> x + y
+ ()
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+(2): ReSharper Parameter Name Hint: : int
+(3): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs
new file mode 100644
index 0000000000..dc690227f8
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs
@@ -0,0 +1,3 @@
+let call f x =
+ let y = f (12, (15, [1; 2; 3])) * 15.
+ x f
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs.gold
new file mode 100644
index 0000000000..869389b868
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 08 - Function arguments.fs.gold
@@ -0,0 +1,7 @@
+let call f x||(0) =
+ let y||(1) = f (12, (15, [1; 2; 3])) * 15.
+ x f
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : (int * (int * int list) -> float) -> 'a
+(1): ReSharper Parameter Name Hint: : float
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs
new file mode 100644
index 0000000000..9c09bec7ae
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs
@@ -0,0 +1,3 @@
+type MySingleCaseDu = MySingleCaseDu of int
+let addFive (MySingleCaseDu value) =
+ value + 5
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs.gold
new file mode 100644
index 0000000000..66f828647a
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 09 - Pattern match argument.fs.gold
@@ -0,0 +1,6 @@
+type MySingleCaseDu = MySingleCaseDu of int
+let addFive (MySingleCaseDu value||(0)) =
+ value + 5
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs
new file mode 100644
index 0000000000..bab1e26f26
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs
@@ -0,0 +1,2 @@
+let addFive (hi) =
+ hi + 5
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs.gold
new file mode 100644
index 0000000000..f2ec91cc55
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Function 10 - Arguments in parentheses.fs.gold
@@ -0,0 +1,5 @@
+let addFive (hi||(0)) =
+ hi + 5
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs
new file mode 100644
index 0000000000..4a4b01b354
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs
@@ -0,0 +1,5 @@
+type C () =
+ member __.Add () =
+ "hello there"
+
+ member __.LambdaProp = fun () -> "hello there"
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs.gold
new file mode 100644
index 0000000000..f09843bd5a
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 01 - No arguments.fs.gold
@@ -0,0 +1,7 @@
+type C () =
+ member __.Add () =
+ "hello there"
+
+ member __.LambdaProp = fun () -> "hello there"
+
+---------------------------------------------------------
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs
new file mode 100644
index 0000000000..a09e8c1b6f
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs
@@ -0,0 +1,5 @@
+type C () =
+ member __.Add x y =
+ x + y
+
+ member __.LambdaProp = fun x y -> x + y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs.gold
new file mode 100644
index 0000000000..c090053fe5
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 02 - Curried arguments.fs.gold
@@ -0,0 +1,24 @@
+ShowTypeNameHintsForLambdaExpressionParameters = True
+type C () =
+ member __.Add x||(0) y||(1) =
+ x + y
+
+ member __.LambdaProp = fun x||(2) y||(3) -> x + y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+(2): ReSharper Parameter Name Hint: : int
+(3): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForLambdaExpressionParameters = False
+type C () =
+ member __.Add x||(0) y||(1) =
+ x + y
+
+ member __.LambdaProp = fun x y -> x + y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs
new file mode 100644
index 0000000000..c6c4cf155b
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs
@@ -0,0 +1,5 @@
+type C () =
+ member __.Subtract x (y : int) =
+ x - y
+
+ member __.LambdaProp = fun x (y: int) -> x - y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs.gold
new file mode 100644
index 0000000000..192b8e313c
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 03 - Type annotated - Curried.fs.gold
@@ -0,0 +1,21 @@
+ShowTypeNameHintsForImplicitlyTypedVariables = True
+type C () =
+ member __.Subtract x||(0) (y : int) =
+ x - y
+
+ member __.LambdaProp = fun x||(1) (y: int) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForImplicitlyTypedVariables = False
+type C () =
+ member __.Subtract x (y : int) =
+ x - y
+
+ member __.LambdaProp = fun x||(0) (y: int) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs
new file mode 100644
index 0000000000..916a6e43c3
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs
@@ -0,0 +1,5 @@
+type C () =
+ member __.Subtract (x: int, y) =
+ x - y
+
+ member __.LambdaProp = fun (x: int, y) -> x - y
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs.gold
new file mode 100644
index 0000000000..46bb7de85c
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Method 04 - Type annotated - Tupled.fs.gold
@@ -0,0 +1,21 @@
+ShowTypeNameHintsForImplicitlyTypedVariables = True
+type C () =
+ member __.Subtract (x: int, y||(0)) =
+ x - y
+
+ member __.LambdaProp = fun (x: int, y||(1)) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForImplicitlyTypedVariables = False
+type C () =
+ member __.Subtract (x: int, y) =
+ x - y
+
+ member __.LambdaProp = fun (x: int, y||(0)) -> x - y
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs
new file mode 100644
index 0000000000..769eaed874
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs
@@ -0,0 +1,11 @@
+let outerLet =
+ let myFunc (o: obj) =
+ match o with
+ | :? int as i ->
+ let x =
+ let myLambda = fun x (y: int) -> x + y
+ let myValue = 123
+ myLambda myValue i
+ | _ -> 0
+
+ myFunc 10
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs.gold
new file mode 100644
index 0000000000..5de7195f34
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Nested 01.fs.gold
@@ -0,0 +1,15 @@
+let outerLet =
+ let myFunc (o: obj) =
+ match o with
+ | :? int as i ->
+ let x||(0) =
+ let myLambda = fun x||(1) (y: int) -> x + y
+ let myValue = 123
+ myLambda myValue i
+ | _ -> 0
+
+ myFunc 10
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs
new file mode 100644
index 0000000000..927e205854
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs
@@ -0,0 +1,4 @@
+let sayHello nameOpt =
+ match nameOpt with
+ | None -> "Hi there"
+ | Some name -> "Hi, " + name
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs.gold
new file mode 100644
index 0000000000..fa46484b30
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 01 - Option.fs.gold
@@ -0,0 +1,19 @@
+ShowTypeNameHintsForPatternMatchingExpressions = True
+let sayHello nameOpt||(0) =
+ match nameOpt with
+ | None -> "Hi there"
+ | Some name||(1) -> "Hi, " + name
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : string option
+(1): ReSharper Parameter Name Hint: : string
+
+================
+ShowTypeNameHintsForPatternMatchingExpressions = False
+let sayHello nameOpt||(0) =
+ match nameOpt with
+ | None -> "Hi there"
+ | Some name -> "Hi, " + name
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : string option
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs
new file mode 100644
index 0000000000..513e3148a6
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs
@@ -0,0 +1,7 @@
+type 'a MyRecord = { MyOption : 'a option }
+
+let run () =
+ let x = { MyOption = Some 15. }
+ match x with
+ | { MyOption = None } -> ()
+ | { MyOption = Some x } -> ()
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs.gold
new file mode 100644
index 0000000000..6098e899f3
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 02 - Record.fs.gold
@@ -0,0 +1,25 @@
+ShowTypeNameHintsForPatternMatchingExpressions = True
+type 'a MyRecord = { MyOption : 'a option }
+
+let run () =
+ let x||(0) = { MyOption = Some 15. }
+ match x with
+ | { MyOption = None } -> ()
+ | { MyOption = Some x||(1) } -> ()
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : float MyRecord
+(1): ReSharper Parameter Name Hint: : float
+
+================
+ShowTypeNameHintsForPatternMatchingExpressions = False
+type 'a MyRecord = { MyOption : 'a option }
+
+let run () =
+ let x||(0) = { MyOption = Some 15. }
+ match x with
+ | { MyOption = None } -> ()
+ | { MyOption = Some x } -> ()
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : float MyRecord
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs
new file mode 100644
index 0000000000..2acaa5e3e3
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs
@@ -0,0 +1,4 @@
+let x = Some "hi there"
+match x with
+| None -> ()
+| Some _ -> ()
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs.gold
new file mode 100644
index 0000000000..a2701b8147
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 03 - Wildcard.fs.gold
@@ -0,0 +1,6 @@
+let x = Some "hi there"
+match x with
+| None -> ()
+| Some _ -> ()
+
+---------------------------------------------------------
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs
new file mode 100644
index 0000000000..c534a09be9
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs
@@ -0,0 +1,4 @@
+let sayHello =
+ function
+ | None -> "Hi there"
+ | Some n -> "Hi, " + n
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs.gold
new file mode 100644
index 0000000000..97b3139e70
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 04 - Function.fs.gold
@@ -0,0 +1,17 @@
+ShowTypeNameHintsForPatternMatchingExpressions = True
+let sayHello =
+ function
+ | None -> "Hi there"
+ | Some n||(0) -> "Hi, " + n
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : string
+
+================
+ShowTypeNameHintsForPatternMatchingExpressions = False
+let sayHello =
+ function
+ | None -> "Hi there"
+ | Some n -> "Hi, " + n
+
+---------------------------------------------------------
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs
new file mode 100644
index 0000000000..46731f76e9
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs
@@ -0,0 +1,8 @@
+let (|Parse|_|) pattern input =
+ if input = pattern then Some [1; 2; 3]
+ else None
+
+let parse =
+ function
+ | Parse "ints" (x::xs) -> x + List.sum xs
+ | _ -> 0
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs.gold
new file mode 100644
index 0000000000..2c4e895387
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 05 - Active pattern.fs.gold
@@ -0,0 +1,29 @@
+ShowTypeNameHintsForPatternMatchingExpressions = True
+let (|Parse|_|) pattern||(0) input||(1) =
+ if input = pattern then Some [1; 2; 3]
+ else None
+
+let parse =
+ function
+ | Parse "ints" (x||(2)::xs) -> x + List.sum xs
+ | _ -> 0
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : 'a
+(1): ReSharper Parameter Name Hint: : 'a
+(2): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForPatternMatchingExpressions = False
+let (|Parse|_|) pattern||(0) input||(1) =
+ if input = pattern then Some [1; 2; 3]
+ else None
+
+let parse =
+ function
+ | Parse "ints" (x::xs) -> x + List.sum xs
+ | _ -> 0
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : 'a
+(1): ReSharper Parameter Name Hint: : 'a
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs
new file mode 100644
index 0000000000..6aeb1f9ead
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs
@@ -0,0 +1,4 @@
+let parse (o: obj) =
+ match o with
+ | :? int as i -> i + 5
+ | _ -> 0
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs.gold
new file mode 100644
index 0000000000..3e80b6519b
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 06 - Type match.fs.gold
@@ -0,0 +1,6 @@
+let parse (o: obj) =
+ match o with
+ | :? int as i -> i + 5
+ | _ -> 0
+
+---------------------------------------------------------
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs
new file mode 100644
index 0000000000..42208fcbe3
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs
@@ -0,0 +1,8 @@
+let x =
+ match [1;2] with
+ | x -> ()
+ | [x] -> ()
+ | [x; y] -> ()
+ | x::y -> ()
+ | x::y::z -> ()
+ | _ -> ()
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs.gold
new file mode 100644
index 0000000000..bb301559e9
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Pattern match 07 - Lists and arrays.fs.gold
@@ -0,0 +1,29 @@
+ShowTypeNameHintsForPatternMatchingExpressions = True
+let x =
+ match [1;2] with
+ | x||(0) -> ()
+ | [x||(1)] -> ()
+ | [x||(2); y] -> ()
+ | x||(3)::y -> ()
+ | x||(4)::y::z -> ()
+ | _ -> ()
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int list
+(1): ReSharper Parameter Name Hint: : int
+(2): ReSharper Parameter Name Hint: : int
+(3): ReSharper Parameter Name Hint: : int
+(4): ReSharper Parameter Name Hint: : int
+
+================
+ShowTypeNameHintsForPatternMatchingExpressions = False
+let x =
+ match [1;2] with
+ | x -> ()
+ | [x] -> ()
+ | [x; y] -> ()
+ | x::y -> ()
+ | x::y::z -> ()
+ | _ -> ()
+
+---------------------------------------------------------
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs
new file mode 100644
index 0000000000..fa565952b1
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs
@@ -0,0 +1,9 @@
+let run () =
+ let x = 15
+ let y = failwith ""
+ let z = [1;2;3]
+ let u = [|1;2;3|]
+ let ts = 1, "hi", 10.
+ let disp = { new System.IDisposable with override __.Dispose () = () }
+ let dispB = disp :> obj
+ y + ""
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs.gold
new file mode 100644
index 0000000000..3067f58095
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 01 - Literals.fs.gold
@@ -0,0 +1,34 @@
+HideTypeNameHintsForImplicitlyTypedVariablesWhenTypeIsEvident = True
+let run () =
+ let x = 15
+ let y||(0) = failwith ""
+ let z = [1;2;3]
+ let u = [|1;2;3|]
+ let ts = 1, "hi", 10.
+ let disp = { new System.IDisposable with override __.Dispose () = () }
+ let dispB = disp :> obj
+ y + ""
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : string
+
+================
+HideTypeNameHintsForImplicitlyTypedVariablesWhenTypeIsEvident = False
+let run () =
+ let x||(0) = 15
+ let y||(1) = failwith ""
+ let z||(2) = [1;2;3]
+ let u||(3) = [|1;2;3|]
+ let ts||(4) = 1, "hi", 10.
+ let disp||(5) = { new System.IDisposable with override __.Dispose () = () }
+ let dispB||(6) = disp :> obj
+ y + ""
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : string
+(2): ReSharper Parameter Name Hint: : int list
+(3): ReSharper Parameter Name Hint: : int []
+(4): ReSharper Parameter Name Hint: : int * string * float
+(5): ReSharper Parameter Name Hint: : IDisposable
+(6): ReSharper Parameter Name Hint: : obj
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs
new file mode 100644
index 0000000000..f7a43e7616
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs
@@ -0,0 +1,6 @@
+let outer z =
+ let x = [y; y+2]
+ let y = [|z; z+1|]
+ let u = z + 1
+ let ts = 1, "hi", u
+ ()
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs.gold
new file mode 100644
index 0000000000..36ea7e4199
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 02 - Non literals.fs.gold
@@ -0,0 +1,13 @@
+let outer z||(0) =
+ let x||(1) = [y; y+2]
+ let y||(2) = [|z; z+1|]
+ let u||(3) = z + 1
+ let ts||(4) = 1, "hi", u
+ ()
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
+(1): ReSharper Parameter Name Hint: : int list
+(2): ReSharper Parameter Name Hint: : int []
+(3): ReSharper Parameter Name Hint: : int
+(4): ReSharper Parameter Name Hint: : int * string * int
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs
new file mode 100644
index 0000000000..16a3fe3eff
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs
@@ -0,0 +1,3 @@
+let run () =
+ let (Some x) = failwith ""
+ x + 15
diff --git a/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs.gold b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs.gold
new file mode 100644
index 0000000000..c7dcce5c1d
--- /dev/null
+++ b/ReSharper.FSharp/test/data/features/daemon/inferredTypeHints/Value 03 - Pattern match.fs.gold
@@ -0,0 +1,6 @@
+let run () =
+ let (Some x||(0)) = failwith ""
+ x + 15
+
+---------------------------------------------------------
+(0): ReSharper Parameter Name Hint: : int
diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/InferredTypeHintStageTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/InferredTypeHintStageTest.fs
new file mode 100644
index 0000000000..9d9e31702a
--- /dev/null
+++ b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/InferredTypeHintStageTest.fs
@@ -0,0 +1,84 @@
+namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Daemon
+
+open JetBrains.ReSharper.Feature.Services.TypeNameHints
+open JetBrains.ReSharper.FeaturesTestFramework.Daemon
+open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings
+open JetBrains.ReSharper.Plugins.FSharp.Settings
+open JetBrains.ReSharper.TestFramework
+open NUnit.Framework
+
+[)>]
+[]
+[)>]
+[, "ShowPipeReturnTypes", "false")>]
+type InferredTypeHintStageTest() =
+ inherit FSharpHighlightingTestBase()
+
+ override x.RelativeTestDataPath = "features/daemon/inferredTypeHints"
+
+ []
+ member x.``Function 01 - No arguments``() = x.DoNamedTest()
+
+ []
+ member x.``Function 02 - Curried arguments``() = x.DoNamedTest()
+
+ [] member x.``Function 03 - Generic arguments``() = x.DoNamedTest()
+ [] member x.``Function 04 - Tupled arguments``() = x.DoNamedTest()
+
+ []
+ member x.``Function 05 - Type annotated - Curried``() = x.DoNamedTest()
+
+ []
+ member x.``Function 06 - Type annotated - Tupled``() = x.DoNamedTest()
+
+ [] member x.``Function 07 - Local function``() = x.DoNamedTest()
+ [] member x.``Function 08 - Function arguments``() = x.DoNamedTest()
+
+ []
+ member x.``Function 09 - Pattern match argument``() = x.DoNamedTest()
+
+ [] member x.``Function 10 - Arguments in parentheses``() = x.DoNamedTest()
+
+ []
+ member x.``Method 01 - No arguments``() = x.DoNamedTest()
+
+ []
+ member x.``Method 02 - Curried arguments``() = x.DoNamedTest()
+
+ []
+ member x.``Method 03 - Type annotated - Curried``() = x.DoNamedTest()
+
+ []
+ member x.``Method 04 - Type annotated - Tupled``() = x.DoNamedTest()
+
+ []
+ member x.``Pattern match 01 - Option``() = x.DoNamedTest()
+
+ []
+ member x.``Pattern match 02 - Record``() = x.DoNamedTest()
+
+ []
+ member x.``Pattern match 03 - Wildcard``() = x.DoNamedTest()
+
+ []
+ member x.``Pattern match 04 - Function``() = x.DoNamedTest()
+
+ []
+ member x.``Pattern match 05 - Active pattern``() = x.DoNamedTest()
+
+ []
+ member x.``Pattern match 06 - Type match``() = x.DoNamedTest()
+
+ []
+ member x.``Pattern match 07 - Lists and arrays``() = x.DoNamedTest()
+
+ []
+ member x.``Value 01 - Literals``() = x.DoNamedTest()
+
+ []
+ member x.``Value 02 - Non literals``() = x.DoNamedTest()
+
+ []
+ member x.``Value 03 - Pattern match``() = x.DoNamedTest()
+
+ [] member x.``Nested 01``() = x.DoNamedTest()
diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/PipeChainTypeHintStageTest.fs b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/PipeChainTypeHintStageTest.fs
index c98e5dc615..7583ab08c6 100644
--- a/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/PipeChainTypeHintStageTest.fs
+++ b/ReSharper.FSharp/test/src/FSharp.Tests/Daemon/PipeChainTypeHintStageTest.fs
@@ -1,5 +1,6 @@
namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features.Daemon
+open JetBrains.ReSharper.Feature.Services.ParameterNameHints.ManagedLanguage
open JetBrains.ReSharper.FeaturesTestFramework.Daemon
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings
open JetBrains.ReSharper.Plugins.FSharp.Settings
@@ -7,10 +8,11 @@ open JetBrains.ReSharper.Plugins.FSharp.Tests
open JetBrains.ReSharper.TestFramework
open NUnit.Framework
-[)>]
+[)>]
[]
[)>]
[, "ShowPipeReturnTypes", "true")>]
+[, "ShowCodeAnnotationsHintsOnParameterDeclarations", "false")>]
type PipeChainTypeHintStageTest() =
inherit FSharpHighlightingTestBase()
diff --git a/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj b/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj
index 9577136ea9..e84953522f 100644
--- a/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj
+++ b/ReSharper.FSharp/test/src/FSharp.Tests/FSharp.Tests.fsproj
@@ -33,6 +33,7 @@
+