未验证 提交 7abc88be 编写于 作者: K kerams 提交者: GitHub

TypeApp, type parameter completions (#12933)

上级 506e58d4
...@@ -4364,7 +4364,15 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE ...@@ -4364,7 +4364,15 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE
|> Seq.collect (InfosForTyconConstructors ncenv m ad) |> Seq.collect (InfosForTyconConstructors ncenv m ad)
|> Seq.toList |> Seq.toList
unqualifiedItems @ activePatternItems @ moduleAndNamespaceItems @ tycons @ constructors let typeVars =
if nenv.eTypars.IsEmpty then
[]
else
nenv.eTypars
|> Seq.map (fun kvp -> Item.TypeVar (kvp.Key, kvp.Value))
|> Seq.toList
unqualifiedItems @ activePatternItems @ moduleAndNamespaceItems @ tycons @ constructors @ typeVars
| id :: rest -> | id :: rest ->
......
...@@ -650,12 +650,13 @@ module PrintTypes = ...@@ -650,12 +650,13 @@ module PrintTypes =
| _, _ -> squareAngleL (sepListL (rightL (tagPunctuation ";")) ((match kind with TyparKind.Type -> [] | TyparKind.Measure -> [wordL (tagText "Measure")]) @ List.map (layoutAttrib denv) attrs)) ^^ restL | _, _ -> squareAngleL (sepListL (rightL (tagPunctuation ";")) ((match kind with TyparKind.Type -> [] | TyparKind.Measure -> [wordL (tagText "Measure")]) @ List.map (layoutAttrib denv) attrs)) ^^ restL
and layoutTyparRef denv (typar: Typar) = and layoutTyparRef denv (typar: Typar) =
wordL tagTypeParameter
(tagTypeParameter
(sprintf "%s%s%s" (sprintf "%s%s%s"
(if denv.showConstraintTyparAnnotations then prefixOfStaticReq typar.StaticReq else "'") (if denv.showConstraintTyparAnnotations then prefixOfStaticReq typar.StaticReq else "'")
(if denv.showImperativeTyparAnnotations then prefixOfRigidTypar typar else "") (if denv.showImperativeTyparAnnotations then prefixOfRigidTypar typar else "")
typar.DisplayName)) typar.DisplayName)
|> mkNav typar.Range
|> wordL
/// Layout a single type parameter declaration, taking TypeSimplificationInfo into account /// Layout a single type parameter declaration, taking TypeSimplificationInfo into account
/// There are several printing-cases for a typar: /// There are several printing-cases for a typar:
...@@ -2426,6 +2427,8 @@ let prettyLayoutOfType denv x = x |> PrintTypes.prettyLayoutOfType denv ...@@ -2426,6 +2427,8 @@ let prettyLayoutOfType denv x = x |> PrintTypes.prettyLayoutOfType denv
let prettyLayoutOfTypeNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv let prettyLayoutOfTypeNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv
let prettyLayoutOfTypar denv x = x |> PrintTypes.layoutTyparRef denv
let prettyStringOfTy denv x = x |> PrintTypes.prettyLayoutOfType denv |> showL let prettyStringOfTy denv x = x |> PrintTypes.prettyLayoutOfType denv |> showL
let prettyStringOfTyNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv |> showL let prettyStringOfTyNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv |> showL
......
...@@ -87,6 +87,8 @@ val prettyLayoutOfType: denv:DisplayEnv -> x:TType -> Layout ...@@ -87,6 +87,8 @@ val prettyLayoutOfType: denv:DisplayEnv -> x:TType -> Layout
val prettyLayoutOfTypeNoCx: denv:DisplayEnv -> x:TType -> Layout val prettyLayoutOfTypeNoCx: denv:DisplayEnv -> x:TType -> Layout
val prettyLayoutOfTypar: denv:DisplayEnv -> x:Typar -> Layout
val prettyStringOfTy: denv:DisplayEnv -> x:TType -> string val prettyStringOfTy: denv:DisplayEnv -> x:TType -> string
val prettyStringOfTyNoCx: denv:DisplayEnv -> x:TType -> string val prettyStringOfTyNoCx: denv:DisplayEnv -> x:TType -> string
......
...@@ -1051,6 +1051,7 @@ type internal TypeCheckInfo ...@@ -1051,6 +1051,7 @@ type internal TypeCheckInfo
match cItem.Item with match cItem.Item with
| Item.ModuleOrNamespaces _ | Item.ModuleOrNamespaces _
| Item.Types _ | Item.Types _
| Item.TypeVar _
| Item.UnqualifiedType _ | Item.UnqualifiedType _
| Item.ExnCase _ -> true | Item.ExnCase _ -> true
| _ -> false), denv, m) | _ -> false), denv, m)
......
...@@ -25,3 +25,4 @@ type FSharpGlyph = ...@@ -25,3 +25,4 @@ type FSharpGlyph =
| Variable | Variable
| ExtensionMethod | ExtensionMethod
| Error | Error
| TypeParameter
\ No newline at end of file
...@@ -380,6 +380,11 @@ module DeclarationListHelpers = ...@@ -380,6 +380,11 @@ module DeclarationListHelpers =
let remarks = toArray remarks let remarks = toArray remarks
ToolTipElement.Single (layout, xml, remarks=remarks) ToolTipElement.Single (layout, xml, remarks=remarks)
// Type variables
| Item.TypeVar (_, typar) ->
let layout = NicePrint.prettyLayoutOfTypar denv typar
ToolTipElement.Single (toArray layout, xml)
// F# Modules and namespaces // F# Modules and namespaces
| Item.ModuleOrNamespaces(modref :: _ as modrefs) -> | Item.ModuleOrNamespaces(modref :: _ as modrefs) ->
//let os = StringBuilder() //let os = StringBuilder()
...@@ -848,7 +853,7 @@ module internal DescriptionListsImpl = ...@@ -848,7 +853,7 @@ module internal DescriptionListsImpl =
| Item.CustomOperation _ -> FSharpGlyph.Method | Item.CustomOperation _ -> FSharpGlyph.Method
| Item.MethodGroup (_, minfos, _) when minfos |> List.forall (fun minfo -> minfo.IsExtensionMember) -> FSharpGlyph.ExtensionMethod | Item.MethodGroup (_, minfos, _) when minfos |> List.forall (fun minfo -> minfo.IsExtensionMember) -> FSharpGlyph.ExtensionMethod
| Item.MethodGroup _ -> FSharpGlyph.Method | Item.MethodGroup _ -> FSharpGlyph.Method
| Item.TypeVar _ | Item.TypeVar _ -> FSharpGlyph.TypeParameter
| Item.Types _ -> FSharpGlyph.Class | Item.Types _ -> FSharpGlyph.Class
| Item.UnqualifiedType (tcref :: _) -> | Item.UnqualifiedType (tcref :: _) ->
if tcref.IsEnumTycon || tcref.IsILEnumTycon then FSharpGlyph.Enum if tcref.IsEnumTycon || tcref.IsILEnumTycon then FSharpGlyph.Enum
...@@ -1031,6 +1036,9 @@ type DeclarationListInfo(declarations: DeclarationListItem[], isForType: bool, i ...@@ -1031,6 +1036,9 @@ type DeclarationListInfo(declarations: DeclarationListItem[], isForType: bool, i
| Some u -> u.DisplayName | Some u -> u.DisplayName
| None -> item.Item.DisplayNameCore | None -> item.Item.DisplayNameCore
let textInCode = let textInCode =
match item.Item with
| Item.TypeVar (name, typar) -> (if typar.StaticReq = Syntax.TyparStaticReq.None then "'" else " ^") + name
| _ ->
match item.Unresolved with match item.Unresolved with
| Some u -> u.DisplayName | Some u -> u.DisplayName
| None -> item.Item.DisplayName | None -> item.Item.DisplayName
......
...@@ -957,6 +957,9 @@ module ParsedInput = ...@@ -957,6 +957,9 @@ module ParsedInput =
| _ -> | _ ->
defaultTraverse expr defaultTraverse expr
// Unchecked.defaultof<str$>
| SynExpr.TypeApp (typeArgsRange = range) when rangeContainsPos range pos ->
Some CompletionContext.PatternType
| _ -> defaultTraverse expr | _ -> defaultTraverse expr
member _.VisitRecordField(path, copyOpt, field) = member _.VisitRecordField(path, copyOpt, field) =
......
...@@ -2654,6 +2654,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Property ...@@ -2654,6 +2654,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Property
FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Struct FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Struct
FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Type FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Type
FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Typedef FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Typedef
FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 TypeParameter
FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Union FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Union
FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Variable FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Variable
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean Equals(FSharp.Compiler.EditorServices.FSharpGlyph) FSharp.Compiler.EditorServices.FSharpGlyph: Boolean Equals(FSharp.Compiler.EditorServices.FSharpGlyph)
...@@ -2678,6 +2679,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsProperty ...@@ -2678,6 +2679,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsProperty
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsStruct FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsStruct
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsType FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsType
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsTypedef FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsTypedef
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsTypeParameter
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsUnion FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsUnion
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsVariable FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsVariable
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsClass() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsClass()
...@@ -2699,6 +2701,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsProperty() ...@@ -2699,6 +2701,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsProperty()
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsStruct() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsStruct()
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsType() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsType()
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsTypedef() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsTypedef()
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsTypeParameter()
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsUnion() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsUnion()
FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsVariable() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsVariable()
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Class FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Class
...@@ -2720,6 +2723,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FShar ...@@ -2720,6 +2723,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FShar
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Struct FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Struct
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Type FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Type
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Typedef FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Typedef
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph TypeParameter
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Union FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Union
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Variable FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Variable
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Class() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Class()
...@@ -2741,6 +2745,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FShar ...@@ -2741,6 +2745,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FShar
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Struct() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Struct()
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Type() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Type()
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Typedef() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Typedef()
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_TypeParameter()
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Union() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Union()
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Variable() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Variable()
FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph+Tags FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph+Tags
......
...@@ -221,6 +221,7 @@ type NavigationItem with ...@@ -221,6 +221,7 @@ type NavigationItem with
| Some SynAccess.Internal -> FSharpRoslynGlyph.ExtensionMethodInternal | Some SynAccess.Internal -> FSharpRoslynGlyph.ExtensionMethodInternal
| _ -> FSharpRoslynGlyph.ExtensionMethodPublic | _ -> FSharpRoslynGlyph.ExtensionMethodPublic
| FSharpGlyph.Error -> FSharpRoslynGlyph.Error | FSharpGlyph.Error -> FSharpRoslynGlyph.Error
| FSharpGlyph.TypeParameter -> FSharpRoslynGlyph.TypeParameter
[<RequireQualifiedAccess>] [<RequireQualifiedAccess>]
module String = module String =
......
...@@ -147,6 +147,7 @@ module internal Tokenizer = ...@@ -147,6 +147,7 @@ module internal Tokenizer =
| Private -> Glyph.StructurePrivate | Private -> Glyph.StructurePrivate
| FSharpGlyph.Variable -> Glyph.Local | FSharpGlyph.Variable -> Glyph.Local
| FSharpGlyph.Error -> Glyph.Error | FSharpGlyph.Error -> Glyph.Error
| FSharpGlyph.TypeParameter -> Glyph.TypeParameter
let GetImageIdForSymbol(symbolOpt:FSharpSymbol option, kind:LexerSymbolKind) = let GetImageIdForSymbol(symbolOpt:FSharpSymbol option, kind:LexerSymbolKind) =
let imageId = let imageId =
...@@ -243,6 +244,7 @@ module internal Tokenizer = ...@@ -243,6 +244,7 @@ module internal Tokenizer =
| Internal -> KnownImageIds.ClassInternal | Internal -> KnownImageIds.ClassInternal
| Protected -> KnownImageIds.ClassProtected | Protected -> KnownImageIds.ClassProtected
| Private -> KnownImageIds.ClassPrivate | Private -> KnownImageIds.ClassPrivate
| :? FSharpGenericParameter -> KnownImageIds.Type
| _ -> KnownImageIds.None | _ -> KnownImageIds.None
if imageId = KnownImageIds.None then if imageId = KnownImageIds.None then
None None
...@@ -345,6 +347,7 @@ module internal Tokenizer = ...@@ -345,6 +347,7 @@ module internal Tokenizer =
| Internal -> Glyph.ClassInternal | Internal -> Glyph.ClassInternal
| Protected -> Glyph.ClassProtected | Protected -> Glyph.ClassProtected
| Private -> Glyph.ClassPrivate | Private -> Glyph.ClassPrivate
| :? FSharpGenericParameter -> Glyph.TypeParameter
| _ -> Glyph.None | _ -> Glyph.None
......
...@@ -219,6 +219,7 @@ type internal FSharpDeclarations_DEPRECATED(documentationBuilder, declarations: ...@@ -219,6 +219,7 @@ type internal FSharpDeclarations_DEPRECATED(documentationBuilder, declarations:
| FSharpGlyph.Field | FSharpGlyph.Field
| FSharpGlyph.Delegate | FSharpGlyph.Delegate
| FSharpGlyph.Variable | FSharpGlyph.Variable
| FSharpGlyph.TypeParameter
| FSharpGlyph.Error -> None | FSharpGlyph.Error -> None
|> Option.defaultValue ObsoleteGlyph.Class |> Option.defaultValue ObsoleteGlyph.Class
|> int |> int
......
...@@ -751,9 +751,9 @@ type A = { le: string } ...@@ -751,9 +751,9 @@ type A = { le: string }
VerifyNoCompletionList(fileContents, "le") VerifyNoCompletionList(fileContents, "le")
[<Test>] [<Test>]
let ``Completion list on record field type at declaration site contains modules and types but not keywords or functions``() = let ``Completion list on record field type at declaration site contains modules, types and type parameters but not keywords or functions``() =
let fileContents = """ let fileContents = """
type A = { Field: l } type A<'lType> = { Field: l }
""" """
VerifyCompletionList(fileContents, "Field: l", ["LanguagePrimitives"; "List"], ["let"; "log"]) VerifyCompletionList(fileContents, "Field: l", ["LanguagePrimitives"; "List"], ["let"; "log"])
...@@ -774,20 +774,28 @@ type A = ...@@ -774,20 +774,28 @@ type A =
VerifyNoCompletionList(fileContents, "str") VerifyNoCompletionList(fileContents, "str")
[<Test>] [<Test>]
let ``Completion list on union case type at declaration site contains modules and types but not keywords or functions``() = let ``Completion list on union case type at declaration site contains modules, types and type parameters but not keywords or functions``() =
let fileContents = """ let fileContents = """
type A = type A<'lType> =
| Case of blah: int * str: l | Case of blah: int * str: l
""" """
VerifyCompletionList(fileContents, "str: l", ["LanguagePrimitives"; "List"], ["let"; "log"]) VerifyCompletionList(fileContents, "str: l", ["LanguagePrimitives"; "List"; "lType"], ["let"; "log"])
[<Test>] [<Test>]
let ``Completion list on union case type at declaration site contains modules and types but not keywords or functions2``() = let ``Completion list on union case type at declaration site contains modules, types and type parameters but not keywords or functions2``() =
let fileContents = """ let fileContents = """
type A = type A<'lType> =
| Case of l | Case of l
""" """
VerifyCompletionList(fileContents, "of l", ["LanguagePrimitives"; "List"], ["let"; "log"]) VerifyCompletionList(fileContents, "of l", ["LanguagePrimitives"; "List"; "lType"], ["let"; "log"])
[<Test>]
let ``Completion list on union case type at declaration site contains type parameter``() =
let fileContents = """
type A<'keyType> =
| Case of key
"""
VerifyCompletionList(fileContents, "of key", ["keyType"], [])
[<Test>] [<Test>]
let ``Completion list on type alias contains modules and types but not keywords or functions``() = let ``Completion list on type alias contains modules and types but not keywords or functions``() =
...@@ -804,6 +812,38 @@ type A = ...@@ -804,6 +812,38 @@ type A =
""" """
VerifyNoCompletionList(fileContents, "| C") VerifyNoCompletionList(fileContents, "| C")
[<Test>]
let ``Completion list in generic function body contains type parameter``() =
let fileContents = """
let Null<'wrappedType> () =
Unchecked.defaultof<wrapp>
"""
VerifyCompletionList(fileContents, "defaultof<wrapp", ["wrappedType"], [])
[<Test>]
let ``Completion list in generic method body contains type parameter``() =
let fileContents = """
type A () =
member _.Null<'wrappedType> () = Unchecked.defaultof<wrapp>
"""
VerifyCompletionList(fileContents, "defaultof<wrapp", ["wrappedType"], [])
[<Test>]
let ``Completion list in generic class method body contains type parameter``() =
let fileContents = """
type A<'wrappedType> () =
member _.Null () = Unchecked.defaultof<wrapp>
"""
VerifyCompletionList(fileContents, "defaultof<wrapp", ["wrappedType"], [])
[<Test>]
let ``Completion list in type application contains modules, types and type parameters but not keywords or functions``() =
let fileContents = """
let emptyMap<'keyType, 'lValueType> () =
Map.empty<'keyType, l>
"""
VerifyCompletionList(fileContents, ", l", ["LanguagePrimitives"; "List"; "lValueType"], ["let"; "log"])
#if EXE #if EXE
ShouldDisplaySystemNamespace() ShouldDisplaySystemNamespace()
#endif #endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册