From 506b33f8c93b0ac9a93069a7b492a088b8eb8dd1 Mon Sep 17 00:00:00 2001 From: kerams Date: Sun, 3 Apr 2022 11:39:04 +0200 Subject: [PATCH 1/5] TypeApp, type parameter completions --- src/fsharp/NameResolution.fs | 10 +++++++++- src/fsharp/NicePrint.fs | 2 ++ src/fsharp/NicePrint.fsi | 2 ++ src/fsharp/service/FSharpCheckerResults.fs | 19 +++++++++++-------- src/fsharp/service/ServiceConstants.fs | 3 ++- src/fsharp/service/ServiceDeclarationLists.fs | 16 ++++++++++++---- src/fsharp/service/ServiceParsedInputOps.fs | 6 ++++++ src/fsharp/service/ServiceParsedInputOps.fsi | 3 +++ .../src/FSharp.Editor/Common/Extensions.fs | 1 + .../LanguageService/Tokenizer.fs | 3 +++ .../FSharp.LanguageService/Intellisense.fs | 1 + 11 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 70055ea2624..4ff2a214201 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -4361,7 +4361,15 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE |> Seq.collect (InfosForTyconConstructors ncenv m ad) |> 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 -> diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index 78fe4bb4c97..089ca87c8ae 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -2415,6 +2415,8 @@ let prettyLayoutOfType denv x = x |> PrintTypes.prettyLayoutOfType 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 prettyStringOfTyNoCx denv x = x |> PrintTypes.prettyLayoutOfTypeNoConstraints denv |> showL diff --git a/src/fsharp/NicePrint.fsi b/src/fsharp/NicePrint.fsi index 5726a7f229b..bb7297879df 100644 --- a/src/fsharp/NicePrint.fsi +++ b/src/fsharp/NicePrint.fsi @@ -87,6 +87,8 @@ val prettyLayoutOfType: 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 prettyStringOfTyNoCx: denv:DisplayEnv -> x:TType -> string diff --git a/src/fsharp/service/FSharpCheckerResults.fs b/src/fsharp/service/FSharpCheckerResults.fs index 2f0159c5254..67f9b43c59d 100644 --- a/src/fsharp/service/FSharpCheckerResults.fs +++ b/src/fsharp/service/FSharpCheckerResults.fs @@ -1026,6 +1026,8 @@ type internal TypeCheckInfo // Completion at '(x: ...)" | Some CompletionContext.PatternType + // Completion at 'Unchecked.defaultof' + | Some CompletionContext.TypeApp // Completion at '| Case1 of ...' | Some CompletionContext.UnionCaseFieldsDeclaration // Completion at 'type Long = int6...' or 'type SomeUnion = Abc...' @@ -1034,14 +1036,15 @@ type internal TypeCheckInfo | Some(CompletionContext.RecordField(RecordContext.Declaration false)) -> GetDeclaredItems (parseResultsOpt, lineStr, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, filterCtors, resolveOverloads, false, getAllSymbols) |> Option.map (fun (items, denv, m) -> - items - |> List.filter (fun cItem -> - match cItem.Item with - | Item.ModuleOrNamespaces _ - | Item.Types _ - | Item.UnqualifiedType _ - | Item.ExnCase _ -> true - | _ -> false), denv, m) + items + |> List.filter (fun cItem -> + match cItem.Item with + | Item.ModuleOrNamespaces _ + | Item.Types _ + | Item.TypeVar _ + | Item.UnqualifiedType _ + | Item.ExnCase _ -> true + | _ -> false), denv, m) // Other completions | cc -> diff --git a/src/fsharp/service/ServiceConstants.fs b/src/fsharp/service/ServiceConstants.fs index b93d0abdab6..97b6a16d228 100644 --- a/src/fsharp/service/ServiceConstants.fs +++ b/src/fsharp/service/ServiceConstants.fs @@ -24,4 +24,5 @@ type FSharpGlyph = | Union | Variable | ExtensionMethod - | Error \ No newline at end of file + | Error + | TypeParameter \ No newline at end of file diff --git a/src/fsharp/service/ServiceDeclarationLists.fs b/src/fsharp/service/ServiceDeclarationLists.fs index afc36ab85ab..9ab844eb152 100644 --- a/src/fsharp/service/ServiceDeclarationLists.fs +++ b/src/fsharp/service/ServiceDeclarationLists.fs @@ -378,6 +378,11 @@ module DeclarationListHelpers = let remarks = toArray 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 | Item.ModuleOrNamespaces(modref :: _ as modrefs) -> //let os = StringBuilder() @@ -846,7 +851,7 @@ module internal DescriptionListsImpl = | Item.CustomOperation _ -> FSharpGlyph.Method | Item.MethodGroup (_, minfos, _) when minfos |> List.forall (fun minfo -> minfo.IsExtensionMember) -> FSharpGlyph.ExtensionMethod | Item.MethodGroup _ -> FSharpGlyph.Method - | Item.TypeVar _ + | Item.TypeVar _ -> FSharpGlyph.TypeParameter | Item.Types _ -> FSharpGlyph.Class | Item.UnqualifiedType (tcref :: _) -> if tcref.IsEnumTycon || tcref.IsILEnumTycon then FSharpGlyph.Enum @@ -1027,9 +1032,12 @@ type DeclarationListInfo(declarations: DeclarationListItem[], isForType: bool, i | Some u -> u.DisplayName | None -> item.Item.DisplayNameCore let textInCode = - match item.Unresolved with - | Some u -> u.DisplayName - | None -> item.Item.DisplayName + match item.Item with + | Item.TypeVar (name, typar) -> (if typar.StaticReq = Syntax.TyparStaticReq.None then "'" else " ^") + name + | _ -> + match item.Unresolved with + | Some u -> u.DisplayName + | None -> item.Item.DisplayName textInDeclList, textInCode, items) // Filter out operators, active patterns (as values) diff --git a/src/fsharp/service/ServiceParsedInputOps.fs b/src/fsharp/service/ServiceParsedInputOps.fs index 1dc3c049dbe..988402dbdd2 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fs +++ b/src/fsharp/service/ServiceParsedInputOps.fs @@ -70,6 +70,9 @@ type CompletionContext = /// Completing pattern type (e.g. foo (x: |)) | PatternType + /// Completing a type application (e.g. Unchecked.defaultof) + | TypeApp + /// Completing union case fields declaration (e.g. 'A of stri|' but not 'B of tex|: string') | UnionCaseFieldsDeclaration @@ -957,6 +960,9 @@ module ParsedInput = | _ -> defaultTraverse expr + // Unchecked.defaultof + | SynExpr.TypeApp (typeArgsRange = range) when rangeContainsPos range pos -> + Some CompletionContext.TypeApp | _ -> defaultTraverse expr member _.VisitRecordField(path, copyOpt, field) = diff --git a/src/fsharp/service/ServiceParsedInputOps.fsi b/src/fsharp/service/ServiceParsedInputOps.fsi index 2180b700416..76f7dc25d7c 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fsi +++ b/src/fsharp/service/ServiceParsedInputOps.fsi @@ -45,6 +45,9 @@ type public CompletionContext = /// Completing pattern type (e.g. foo (x: |)) | PatternType + /// Completing a type application (e.g. Unchecked.defaultof) + | TypeApp + /// Completing union case fields declaration (e.g. 'A of stri|' but not 'B of tex|: string') | UnionCaseFieldsDeclaration diff --git a/vsintegration/src/FSharp.Editor/Common/Extensions.fs b/vsintegration/src/FSharp.Editor/Common/Extensions.fs index 6315654f56a..60eb69bc288 100644 --- a/vsintegration/src/FSharp.Editor/Common/Extensions.fs +++ b/vsintegration/src/FSharp.Editor/Common/Extensions.fs @@ -221,6 +221,7 @@ type NavigationItem with | Some SynAccess.Internal -> FSharpRoslynGlyph.ExtensionMethodInternal | _ -> FSharpRoslynGlyph.ExtensionMethodPublic | FSharpGlyph.Error -> FSharpRoslynGlyph.Error + | FSharpGlyph.TypeParameter -> FSharpRoslynGlyph.TypeParameter [] module String = diff --git a/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs b/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs index 35bde0fd334..4d2159f7c3b 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs @@ -147,6 +147,7 @@ module internal Tokenizer = | Private -> Glyph.StructurePrivate | FSharpGlyph.Variable -> Glyph.Local | FSharpGlyph.Error -> Glyph.Error + | FSharpGlyph.TypeParameter -> Glyph.TypeParameter let GetImageIdForSymbol(symbolOpt:FSharpSymbol option, kind:LexerSymbolKind) = let imageId = @@ -243,6 +244,7 @@ module internal Tokenizer = | Internal -> KnownImageIds.ClassInternal | Protected -> KnownImageIds.ClassProtected | Private -> KnownImageIds.ClassPrivate + | :? FSharpGenericParameter -> KnownImageIds.Type | _ -> KnownImageIds.None if imageId = KnownImageIds.None then None @@ -345,6 +347,7 @@ module internal Tokenizer = | Internal -> Glyph.ClassInternal | Protected -> Glyph.ClassProtected | Private -> Glyph.ClassPrivate + | :? FSharpGenericParameter -> Glyph.TypeParameter | _ -> Glyph.None diff --git a/vsintegration/src/FSharp.LanguageService/Intellisense.fs b/vsintegration/src/FSharp.LanguageService/Intellisense.fs index 82e48f7a9db..c95cf70191b 100644 --- a/vsintegration/src/FSharp.LanguageService/Intellisense.fs +++ b/vsintegration/src/FSharp.LanguageService/Intellisense.fs @@ -219,6 +219,7 @@ type internal FSharpDeclarations_DEPRECATED(documentationBuilder, declarations: | FSharpGlyph.Field | FSharpGlyph.Delegate | FSharpGlyph.Variable + | FSharpGlyph.TypeParameter | FSharpGlyph.Error -> None |> Option.defaultValue ObsoleteGlyph.Class |> int From 580e63226ece27b06ed6b45bd60a220b7fe8e0e7 Mon Sep 17 00:00:00 2001 From: kerams Date: Sun, 3 Apr 2022 15:53:59 +0200 Subject: [PATCH 2/5] Make type parameters in tooltips navigable --- src/fsharp/NicePrint.fs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index 089ca87c8ae..2ed5d29d4be 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -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 and layoutTyparRef denv (typar: Typar) = - wordL - (tagTypeParameter - (sprintf "%s%s%s" - (if denv.showConstraintTyparAnnotations then prefixOfStaticReq typar.StaticReq else "'") - (if denv.showImperativeTyparAnnotations then prefixOfRigidTypar typar else "") - typar.DisplayName)) + tagTypeParameter + (sprintf "%s%s%s" + (if denv.showConstraintTyparAnnotations then prefixOfStaticReq typar.StaticReq else "'") + (if denv.showImperativeTyparAnnotations then prefixOfRigidTypar typar else "") + typar.DisplayName) + |> mkNav typar.Range + |> wordL /// Layout a single type parameter declaration, taking TypeSimplificationInfo into account /// There are several printing-cases for a typar: From 102f911938b9893d8c163c1f90c35cafab692b7f Mon Sep 17 00:00:00 2001 From: kerams Date: Mon, 11 Apr 2022 12:42:05 +0200 Subject: [PATCH 3/5] Add type parameter completion tests --- .../UnitTests/CompletionProviderTests.fs | 57 ++++++++++++++++--- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/vsintegration/tests/UnitTests/CompletionProviderTests.fs b/vsintegration/tests/UnitTests/CompletionProviderTests.fs index 9d9a60eecd1..b24a0d723fe 100644 --- a/vsintegration/tests/UnitTests/CompletionProviderTests.fs +++ b/vsintegration/tests/UnitTests/CompletionProviderTests.fs @@ -751,11 +751,18 @@ type A = { le: string } VerifyNoCompletionList(fileContents, "le") [] -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 = """ -type A = { Field: l } +type A<'lType> = { Field: l } """ - VerifyCompletionList(fileContents, "Field: l", ["LanguagePrimitives"; "List"], ["let"; "log"]) + VerifyCompletionList(fileContents, "Field: l", ["LanguagePrimitives"; "List"; "lType"], ["let"; "log"]) + +[] +let ``Completion list on record field type at declaration site contains type parameter``() = + let fileContents = """ +type A<'keyType> = { Field: key } +""" + VerifyCompletionList(fileContents, "Field: key", ["keyType"], []) [] let ``No completion on union case identifier at declaration site``() = @@ -774,20 +781,28 @@ type A = VerifyNoCompletionList(fileContents, "str") [] -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 = """ -type A = +type A<'lType> = | Case of blah: int * str: l """ - VerifyCompletionList(fileContents, "str: l", ["LanguagePrimitives"; "List"], ["let"; "log"]) + VerifyCompletionList(fileContents, "str: l", ["LanguagePrimitives"; "List"; "lType"], ["let"; "log"]) [] -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 = """ -type A = +type A<'lType> = | Case of l """ - VerifyCompletionList(fileContents, "of l", ["LanguagePrimitives"; "List"], ["let"; "log"]) + VerifyCompletionList(fileContents, "of l", ["LanguagePrimitives"; "List"; "lType"], ["let"; "log"]) + +[] +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"], []) [] let ``Completion list on type alias contains modules and types but not keywords or functions``() = @@ -804,6 +819,30 @@ type A = """ VerifyNoCompletionList(fileContents, "| C") +[] +let ``Completion list in generic function body contains type parameter``() = + let fileContents = """ +let null<'wrappedType> () = + Unchecked.defaultof +""" + VerifyCompletionList(fileContents, "defaultof] +let ``Completion list in generic method body contains type parameter``() = + let fileContents = """ +type A () = + member _.Null<'wrappedType> () = Unchecked.defaultof +""" + VerifyCompletionList(fileContents, "defaultof] +let ``Completion list in generic class method body contains type parameter``() = + let fileContents = """ +type A<'wrappedType> () = + member _.Null () = Unchecked.defaultof +""" + VerifyCompletionList(fileContents, "defaultof Date: Wed, 13 Apr 2022 16:09:39 +0200 Subject: [PATCH 4/5] Fix tests --- .../UnitTests/CompletionProviderTests.fs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/vsintegration/tests/UnitTests/CompletionProviderTests.fs b/vsintegration/tests/UnitTests/CompletionProviderTests.fs index b24a0d723fe..823fa258444 100644 --- a/vsintegration/tests/UnitTests/CompletionProviderTests.fs +++ b/vsintegration/tests/UnitTests/CompletionProviderTests.fs @@ -755,14 +755,7 @@ let ``Completion list on record field type at declaration site contains modules, let fileContents = """ type A<'lType> = { Field: l } """ - VerifyCompletionList(fileContents, "Field: l", ["LanguagePrimitives"; "List"; "lType"], ["let"; "log"]) - -[] -let ``Completion list on record field type at declaration site contains type parameter``() = - let fileContents = """ -type A<'keyType> = { Field: key } -""" - VerifyCompletionList(fileContents, "Field: key", ["keyType"], []) + VerifyCompletionList(fileContents, "Field: l", ["LanguagePrimitives"; "List"], ["let"; "log"]) [] let ``No completion on union case identifier at declaration site``() = @@ -822,7 +815,7 @@ type A = [] let ``Completion list in generic function body contains type parameter``() = let fileContents = """ -let null<'wrappedType> () = +let Null<'wrappedType> () = Unchecked.defaultof """ VerifyCompletionList(fileContents, "defaultof () = """ VerifyCompletionList(fileContents, "defaultof] +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 ShouldDisplaySystemNamespace() #endif From fdbb9aaaf6336a831b3d50b5296d9f4860179258 Mon Sep 17 00:00:00 2001 From: kerams Date: Wed, 20 Apr 2022 21:51:01 +0200 Subject: [PATCH 5/5] Surface area, remove CompletionContext.TypeApp --- src/fsharp/service/FSharpCheckerResults.fs | 2 -- src/fsharp/service/ServiceParsedInputOps.fs | 5 +---- src/fsharp/service/ServiceParsedInputOps.fsi | 3 --- .../FSharp.CompilerService.SurfaceArea.netstandard.expected | 5 +++++ 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/fsharp/service/FSharpCheckerResults.fs b/src/fsharp/service/FSharpCheckerResults.fs index 0f2f155c21c..1a89fcece22 100644 --- a/src/fsharp/service/FSharpCheckerResults.fs +++ b/src/fsharp/service/FSharpCheckerResults.fs @@ -1033,8 +1033,6 @@ type internal TypeCheckInfo // Completion at '(x: ...)" | Some CompletionContext.PatternType - // Completion at 'Unchecked.defaultof' - | Some CompletionContext.TypeApp // Completion at '| Case1 of ...' | Some CompletionContext.UnionCaseFieldsDeclaration // Completion at 'type Long = int6...' or 'type SomeUnion = Abc...' diff --git a/src/fsharp/service/ServiceParsedInputOps.fs b/src/fsharp/service/ServiceParsedInputOps.fs index 161f36858cd..0c4c4aaa105 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fs +++ b/src/fsharp/service/ServiceParsedInputOps.fs @@ -70,9 +70,6 @@ type CompletionContext = /// Completing pattern type (e.g. foo (x: |)) | PatternType - /// Completing a type application (e.g. Unchecked.defaultof) - | TypeApp - /// Completing union case fields declaration (e.g. 'A of stri|' but not 'B of tex|: string') | UnionCaseFieldsDeclaration @@ -962,7 +959,7 @@ module ParsedInput = // Unchecked.defaultof | SynExpr.TypeApp (typeArgsRange = range) when rangeContainsPos range pos -> - Some CompletionContext.TypeApp + Some CompletionContext.PatternType | _ -> defaultTraverse expr member _.VisitRecordField(path, copyOpt, field) = diff --git a/src/fsharp/service/ServiceParsedInputOps.fsi b/src/fsharp/service/ServiceParsedInputOps.fsi index 82159033049..0aa0bbcc590 100644 --- a/src/fsharp/service/ServiceParsedInputOps.fsi +++ b/src/fsharp/service/ServiceParsedInputOps.fsi @@ -45,9 +45,6 @@ type public CompletionContext = /// Completing pattern type (e.g. foo (x: |)) | PatternType - /// Completing a type application (e.g. Unchecked.defaultof) - | TypeApp - /// Completing union case fields declaration (e.g. 'A of stri|' but not 'B of tex|: string') | UnionCaseFieldsDeclaration diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected index dc9699557a6..9f0fd1f9903 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.expected @@ -2652,6 +2652,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Property FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Struct FSharp.Compiler.EditorServices.FSharpGlyph+Tags: Int32 Type 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 Variable FSharp.Compiler.EditorServices.FSharpGlyph: Boolean Equals(FSharp.Compiler.EditorServices.FSharpGlyph) @@ -2676,6 +2677,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsProperty FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsStruct FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsType FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsTypedef +FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsTypeParameter FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsUnion FSharp.Compiler.EditorServices.FSharpGlyph: Boolean IsVariable FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsClass() @@ -2697,6 +2699,7 @@ FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsProperty() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsStruct() FSharp.Compiler.EditorServices.FSharpGlyph: Boolean get_IsType() 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_IsVariable() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph Class @@ -2718,6 +2721,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 Type 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 Variable FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph get_Class() @@ -2739,6 +2743,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_Type() 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_Variable() FSharp.Compiler.EditorServices.FSharpGlyph: FSharp.Compiler.EditorServices.FSharpGlyph+Tags