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 @@ +