未验证 提交 d598a05c 编写于 作者: P Petr Pokorny 提交者: GitHub

Return type hints (#14998)

上级 18c79cff
......@@ -398,6 +398,35 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
SyntaxTraversal.Traverse(expressionPos, input, visitor)
member _.TryRangeOfReturnTypeHint(symbolUseStart: pos, ?skipLambdas) =
let skipLambdas = defaultArg skipLambdas true
SyntaxTraversal.Traverse(
symbolUseStart,
input,
{ new SyntaxVisitorBase<_>() with
member _.VisitExpr(_path, _traverseSynExpr, defaultTraverse, expr) = defaultTraverse expr
override _.VisitBinding(_path, defaultTraverse, binding) =
match binding with
| SynBinding(expr = SynExpr.Lambda _) when skipLambdas -> defaultTraverse binding
// Skip manually type-annotated bindings
| SynBinding(returnInfo = Some (SynBindingReturnInfo(typeName = SynType.LongIdent _))) -> defaultTraverse binding
// Let binding
| SynBinding (trivia = { EqualsRange = Some equalsRange }; range = range) when range.Start = symbolUseStart ->
Some equalsRange.StartRange
// Member binding
| SynBinding (headPat = SynPat.LongIdent(longDotId = SynLongIdent(id = _ :: ident :: _))
trivia = { EqualsRange = Some equalsRange }) when ident.idRange.Start = symbolUseStart ->
Some equalsRange.StartRange
| _ -> defaultTraverse binding
}
)
member _.FindParameterLocations pos = ParameterLocations.Find(pos, input)
member _.IsPositionContainedInACurriedParameter pos =
......
......@@ -52,6 +52,10 @@ type public FSharpParseFileResults =
/// Gets the range of an expression being dereferenced. For `!expr`, gives the range of `expr`
member TryRangeOfExpressionBeingDereferencedContainingPos: expressionPos: pos -> range option
/// Gets the range of where a return type hint could be placed for a function binding. This will be right in front of the equals sign.
/// Returns None if type annotation is present.
member TryRangeOfReturnTypeHint: symbolUseStart: pos * ?skipLambdas: bool -> range option
/// Notable parse info for ParameterInfo at a given location
member FindParameterLocations: pos: pos -> ParameterLocations option
......
......@@ -2331,24 +2331,20 @@ type FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) =
|> LayoutRender.toArray
member x.GetReturnTypeLayout (displayContext: FSharpDisplayContext) =
match x.IsMember, d with
| true, _ ->
None
| false, _ ->
checkIsResolved()
match d with
| E _
| P _
| C _ -> None
| M m ->
let retTy = m.GetFSharpReturnType(cenv.amap, range0, m.FormalMethodInst)
NicePrint.layoutType (displayContext.Contents cenv.g) retTy
|> LayoutRender.toArray
|> Some
| V v ->
NicePrint.layoutOfValReturnType (displayContext.Contents cenv.g) v
|> LayoutRender.toArray
|> Some
checkIsResolved()
match d with
| E _
| P _
| C _ -> None
| M m ->
let retTy = m.GetFSharpReturnType(cenv.amap, range0, m.FormalMethodInst)
NicePrint.layoutType (displayContext.Contents cenv.g) retTy
|> LayoutRender.toArray
|> Some
| V v ->
NicePrint.layoutOfValReturnType (displayContext.Contents cenv.g) v
|> LayoutRender.toArray
|> Some
member x.GetWitnessPassingInfo() =
let witnessInfos =
......
......@@ -2091,6 +2091,7 @@ FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FShar
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfNameOfNearestOuterBindingContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfRecordExpressionContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfRefCellDereferenceContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfReturnTypeHint(FSharp.Compiler.Text.Position, Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfStringInterpolationContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] ValidateBreakpointLocation(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Text.Range]] GetAllArgumentsForFunctionApplicationAtPosition(FSharp.Compiler.Text.Position)
......@@ -2091,6 +2091,7 @@ FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FShar
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfNameOfNearestOuterBindingContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfRecordExpressionContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfRefCellDereferenceContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfReturnTypeHint(FSharp.Compiler.Text.Position, Microsoft.FSharp.Core.FSharpOption`1[System.Boolean])
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] TryRangeOfStringInterpolationContainingPos(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] ValidateBreakpointLocation(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Text.Range]] GetAllArgumentsForFunctionApplicationAtPosition(FSharp.Compiler.Text.Position)
......@@ -137,6 +137,7 @@
<Compile Include="AutomaticCompletion\BraceCompletionSessionProvider.fs" />
<Compile Include="Hints\Hints.fs" />
<Compile Include="Hints\InlineTypeHints.fs" />
<Compile Include="hints\InlineReturnTypeHints.fs" />
<Compile Include="Hints\InlineParameterNameHints.fs" />
<Compile Include="Hints\HintService.fs" />
<Compile Include="Hints\NativeToRoslynHintConverter.fs" />
......
......@@ -224,6 +224,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</value>
......
......@@ -17,6 +17,9 @@ module HintService =
Seq.filter (InlineTypeHints.isValidForHint parseResults symbol)
>> Seq.collect (InlineTypeHints.getHints symbol)
let inline private getReturnTypeHints parseResults symbol =
Seq.collect (InlineReturnTypeHints(parseResults, symbol).getHints)
let inline private getHintsForMemberOrFunctionOrValue (sourceText: SourceText) parseResults symbol : NativeHintResolver =
Seq.filter (InlineParameterNameHints.isMemberOrFunctionOrValueValidForHint symbol)
>> Seq.collect (InlineParameterNameHints.getHintsForMemberOrFunctionOrValue sourceText parseResults symbol)
......@@ -35,6 +38,10 @@ module HintService =
match symbol with
| :? FSharpMemberOrFunctionOrValue as symbol -> getTypeHints parseResults symbol |> Some
| _ -> None
| HintKind.ReturnTypeHint ->
match symbol with
| :? FSharpMemberOrFunctionOrValue as symbol -> getReturnTypeHints parseResults symbol |> Some
| _ -> None
| HintKind.ParameterNameHint ->
match symbol with
| :? FSharpMemberOrFunctionOrValue as symbol ->
......@@ -45,7 +52,7 @@ module HintService =
:: resolvers
|> resolve hintKinds
in resolve hintKinds []
resolve hintKinds []
let private getHintsForSymbol (sourceText: SourceText) parseResults hintKinds (symbol: FSharpSymbol, symbolUses: FSharpSymbolUse seq) =
symbol
......
......@@ -9,6 +9,7 @@ module Hints =
type HintKind =
| TypeHint
| ParameterNameHint
| ReturnTypeHint
// Relatively convenient for testing
type NativeHint =
......@@ -22,3 +23,4 @@ module Hints =
match kind with
| TypeHint -> "type"
| ParameterNameHint -> "parameterName"
| ReturnTypeHint -> "returnType"
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
namespace Microsoft.VisualStudio.FSharp.Editor.Hints
open Microsoft.VisualStudio.FSharp.Editor
open FSharp.Compiler.CodeAnalysis
open FSharp.Compiler.Symbols
open FSharp.Compiler.Text
open Hints
type InlineReturnTypeHints(parseFileResults: FSharpParseFileResults, symbol: FSharpMemberOrFunctionOrValue) =
let getHintParts (symbolUse: FSharpSymbolUse) =
symbol.GetReturnTypeLayout symbolUse.DisplayContext
|> Option.map (fun typeInfo ->
[
TaggedText(TextTag.Text, ": ")
yield! typeInfo |> Array.toList
TaggedText(TextTag.Space, " ")
])
let getHint symbolUse range =
getHintParts symbolUse
|> Option.map (fun parts ->
{
Kind = HintKind.ReturnTypeHint
Range = range
Parts = parts
})
member _.getHints(symbolUse: FSharpSymbolUse) =
[
if symbol.IsFunction then
yield!
parseFileResults.TryRangeOfReturnTypeHint symbolUse.Range.Start
|> Option.bind (getHint symbolUse)
|> Option.toList
]
......@@ -15,4 +15,7 @@ module OptionParser =
if options.IsInlineParameterNameHintsEnabled then
HintKind.ParameterNameHint
if options.IsInlineReturnTypeHintsEnabled then
HintKind.ReturnTypeHint
]
......@@ -137,6 +137,9 @@ type internal FSharpWorkspaceServiceFactory [<System.Composition.ImportingConstr
let isInlineTypeHintsEnabled = editorOptions.Advanced.IsInlineTypeHintsEnabled
let isInlineReturnTypeHintsEnabled =
editorOptions.Advanced.IsInlineReturnTypeHintsEnabled
let enablePartialTypeChecking =
editorOptions.LanguageServicePerformance.EnablePartialTypeChecking
......@@ -169,6 +172,7 @@ type internal FSharpWorkspaceServiceFactory [<System.Composition.ImportingConstr
nameof enableFastFindReferences, enableFastFindReferences
nameof isInlineParameterNameHintsEnabled, isInlineParameterNameHintsEnabled
nameof isInlineTypeHintsEnabled, isInlineTypeHintsEnabled
nameof isInlineReturnTypeHintsEnabled, isInlineReturnTypeHintsEnabled
nameof enablePartialTypeChecking, enablePartialTypeChecking
]
......
......@@ -105,6 +105,7 @@ type AdvancedOptions =
IsOutliningEnabled: bool
IsInlineTypeHintsEnabled: bool
IsInlineParameterNameHintsEnabled: bool
IsInlineReturnTypeHintsEnabled: bool
IsLiveBuffersEnabled: bool
}
......@@ -114,6 +115,7 @@ type AdvancedOptions =
IsOutliningEnabled = true
IsInlineTypeHintsEnabled = false
IsInlineParameterNameHintsEnabled = false
IsInlineReturnTypeHintsEnabled = false
IsLiveBuffersEnabled = FSharpExperimentalFeaturesEnabledAutomatically
}
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -34,6 +34,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</source>
......@@ -43,6 +44,7 @@ Outlining;
Show outlining and collapsible nodes for F# code;
Inline hints;
Display inline type hints (preview);
Display return type hints (preview);
Display inline parameter name hints (preview);Beer;
Live Buffers;
Use live (unsaved) buffers for checking</target>
......
......@@ -28,6 +28,8 @@
<StackPanel>
<CheckBox x:Name="toggleInlineTypeHints" IsChecked="{Binding IsInlineTypeHintsEnabled}"
Content="{x:Static local:Strings.Show_Inline_Type_Hints}"/>
<CheckBox x:Name="toggleReturnTypeHints" IsChecked="{Binding IsInlineReturnTypeHintsEnabled}"
Content="{x:Static local:Strings.Show_Return_Type_Hints}"/>
<CheckBox x:Name="toggleParameterNameHints" IsChecked="{Binding IsInlineParameterNameHintsEnabled}"
Content="{x:Static local:Strings.Show_Inline_Parameter_Name_Hints}"/>
</StackPanel>
......
......@@ -402,6 +402,15 @@ public class Strings {
}
}
/// <summary>
/// Looks up a localized string similar to Display return type hints (preview).
/// </summary>
public static string Show_Return_Type_Hints {
get {
return ResourceManager.GetString("Show_Return_Type_Hints", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Simplify names (remove unnecessary qualifiers).
/// </summary>
......
......@@ -261,4 +261,7 @@
<data name="Tooltip_preferred_description_width_in_characters" xml:space="preserve">
<value>Format signature to the given width by adding line breaks conforming with F# syntax rules. </value>
</data>
<data name="Show_Return_Type_Hints" xml:space="preserve">
<value>Display return type hints (preview)</value>
</data>
</root>
\ No newline at end of file
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Zobrazení tipů pro vložený typ (experimentální)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">Zobrazit s_ymboly v neotevřených oborech názvů</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Hinweise für Inlinetypen anzeigen (experimentell)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">S_ymbole in nicht geöffneten Namespaces anzeigen</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Mostrar sugerencias de tipo insertadas (experimental)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">Mostrar sím_bolos en espacios de nombres sin abrir</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Afficher les indicateurs de type inline (expérimental)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">Afficher les sym_boles dans les espaces de noms non ouverts</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Visualizzare suggerimenti di tipo inline (sperimentale)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">Mostra si_mboli in spazi dei nomi non aperti</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">インライン型のヒントを表示する (試験段階)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">開かれていない名前空間の記号を表示する(_Y)</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">인라인 유형 힌트 표시(실험적)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">열려 있지 않은 네임스페이스에 기호 표시(_Y)</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Wyświetl wskazówki typu wbudowanego (eksperymentalne)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">Pokaż s_ymbole w nieotwartych przestrzeniach nazw</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Exibir as dicas de tipo embutido (experimental)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">Mostrar s_ímbolos em namespaces não abertos</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Отображать подсказки для встроенных типов (экспериментальная версия)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">По_казать символы в неоткрытых пространствах имен</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">Satır içi tür ipuçlarını göster (deneysel)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">Açılmamış ad alanlarında s_embolleri göster</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">显示内联类型提示(实验性)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">显示未打开的命名空间中的符号(_Y)</target>
......
......@@ -107,6 +107,11 @@
<target state="needs-review-translation">顯示內嵌類型提示 (實驗性)</target>
<note />
</trans-unit>
<trans-unit id="Show_Return_Type_Hints">
<source>Display return type hints (preview)</source>
<target state="new">Display return type hints (preview)</target>
<note />
</trans-unit>
<trans-unit id="Show_all_symbols">
<source>Show s_ymbols in unopened namespaces</source>
<target state="translated">顯示未開啟之命名空間中的符號(_Y)</target>
......
......@@ -34,6 +34,7 @@
<Compile Include="Hints\OptionParserTests.fs" />
<Compile Include="Hints\InlineParameterNameHintTests.fs" />
<Compile Include="Hints\InlineTypeHintTests.fs" />
<Compile Include="hints\InlineReturnTypeHintTests.fs" />
<Compile Include="Hints\OverallHintExperienceTests.fs" />
<Compile Include="EditorFormattingServiceTests.fs" />
<Compile Include="RoslynSourceTextTests.fs" />
......
......@@ -64,11 +64,16 @@ module HintTestFramework =
|> Async.RunSynchronously
let getTypeHints document =
getHints document (Set.empty.Add(HintKind.TypeHint))
getHints document (set [ HintKind.TypeHint ])
let getReturnTypeHints document =
getHints document (set [ HintKind.ReturnTypeHint ])
let getParameterNameHints document =
getHints document (Set.empty.Add(HintKind.ParameterNameHint))
getHints document (set [ HintKind.ParameterNameHint ])
let getAllHints document =
let hintKinds = Set.empty.Add(HintKind.TypeHint).Add(HintKind.ParameterNameHint)
let hintKinds =
set [ HintKind.TypeHint; HintKind.ParameterNameHint; HintKind.ReturnTypeHint ]
getHints document hintKinds
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
module FSharp.Editor.Tests.Hints.InlineReturnTypeHintTests
open Xunit
open HintTestFramework
open FSharp.Test
[<Fact>]
let ``Hints are shown for let-bound function return types`` () =
let code =
"""
let func () = 3
let func2 x = x + 1
let setConsoleOut = System.Console.SetOut
"""
let document = getFsDocument code
let result = getReturnTypeHints document
let expected =
[
{
Content = ": int "
Location = (1, 13)
}
{
Content = ": int "
Location = (2, 13)
}
{
Content = ": unit "
Location = (3, 19)
}
]
Assert.Equal(expected, result)
[<Fact>]
let ``Hints are shown for method return types`` () =
let code =
"""
type Test() =
member this.Func() = 3
"""
let document = getFsDocument code
let result = getReturnTypeHints document
let expected =
[
{
Content = ": int "
Location = (2, 24)
}
]
Assert.Equal(expected, result)
[<Fact>]
let ``Hints are shown for generic functions`` () =
let code = "let func _a = 5"
let document = getFsDocument code
let result = getReturnTypeHints document
let expected =
[
{
Content = ": int "
Location = (0, 13)
}
]
Assert.Equal(expected, result)
[<Fact>]
let ``Hints are shown for functions within expressions`` () =
let code =
"""
let _ =
let func () = 2
"""
let document = getFsDocument code
let result = getReturnTypeHints document
let expected =
[
{
Content = ": int "
Location = (2, 21)
}
]
Assert.Equal(expected, result)
[<Fact>]
let ``Hints are not shown for lambda bindings`` () =
let code = "let func = fun () -> 3"
let document = getFsDocument code
let result = getReturnTypeHints document
Assert.Empty result
[<Fact>]
let ``Hints are not shown when there's type annotation`` () =
let code = "let func x : int = x"
let document = getFsDocument code
let result = getReturnTypeHints document
Assert.Empty result
......@@ -26,7 +26,7 @@ let a = Square 1
let b = Rectangle (1, 2)
type C (blahFirst: int) =
member _.Normal (what: string) = 1
member _.Normal (what: string) = 1
let a = C 1
let cc = a.Normal "hmm"
......@@ -40,6 +40,10 @@ let cc = a.Normal "hmm"
Content = ": Song"
Location = (2, 18)
}
{
Content = ": string "
Location = (2, 19)
}
{
Content = "song = "
Location = (4, 23)
......@@ -68,6 +72,10 @@ let cc = a.Normal "hmm"
Content = ": Shape"
Location = (11, 6)
}
{
Content = ": int "
Location = (14, 36)
}
{
Content = "blahFirst = "
Location = (16, 11)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册