internal/ls/lsutil/userpreferences.go (561 lines of code) (raw):

package lsutil import ( "slices" "strings" "github.com/microsoft/typescript-go/internal/core" "github.com/microsoft/typescript-go/internal/modulespecifiers" "github.com/microsoft/typescript-go/internal/tsoptions" ) func NewDefaultUserPreferences() *UserPreferences { return &UserPreferences{ IncludeCompletionsForModuleExports: core.TSTrue, IncludeCompletionsForImportStatements: core.TSTrue, AllowRenameOfImportPath: true, ProvideRefactorNotApplicableReason: true, IncludeCompletionsWithSnippetText: core.TSTrue, DisplayPartsForJSDoc: true, DisableLineTextInReferences: true, ReportStyleChecksAsWarnings: true, ExcludeLibrarySymbolsInNavTo: true, } } type UserPreferences struct { QuotePreference QuotePreference LazyConfiguredProjectsFromExternalProject bool // !!! // A positive integer indicating the maximum length of a hover text before it is truncated. // // Default: `500` MaximumHoverLength int // !!! // ------- Completions ------- // If enabled, TypeScript will search through all external modules' exports and add them to the completions list. // This affects lone identifier completions but not completions on the right hand side of `obj.`. IncludeCompletionsForModuleExports core.Tristate // Enables auto-import-style completions on partially-typed import statements. E.g., allows // `import write|` to be completed to `import { writeFile } from "fs"`. IncludeCompletionsForImportStatements core.Tristate // Unless this option is `false`, member completion lists triggered with `.` will include entries // on potentially-null and potentially-undefined values, with insertion text to replace // preceding `.` tokens with `?.`. IncludeAutomaticOptionalChainCompletions core.Tristate // Allows completions to be formatted with snippet text, indicated by `CompletionItem["isSnippet"]`. IncludeCompletionsWithSnippetText core.Tristate // !!! // If enabled, completions for class members (e.g. methods and properties) will include // a whole declaration for the member. // E.g., `class A { f| }` could be completed to `class A { foo(): number {} }`, instead of // `class A { foo }`. IncludeCompletionsWithClassMemberSnippets core.Tristate // !!! // If enabled, object literal methods will have a method declaration completion entry in addition // to the regular completion entry containing just the method name. // E.g., `const objectLiteral: T = { f| }` could be completed to `const objectLiteral: T = { foo(): void {} }`, // in addition to `const objectLiteral: T = { foo }`. IncludeCompletionsWithObjectLiteralMethodSnippets core.Tristate // !!! JsxAttributeCompletionStyle JsxAttributeCompletionStyle // ------- AutoImports -------- ImportModuleSpecifierPreference modulespecifiers.ImportModuleSpecifierPreference // !!! // Determines whether we import `foo/index.ts` as "foo", "foo/index", or "foo/index.js" ImportModuleSpecifierEnding modulespecifiers.ImportModuleSpecifierEndingPreference // !!! IncludePackageJsonAutoImports IncludePackageJsonAutoImports // !!! AutoImportSpecifierExcludeRegexes []string // !!! AutoImportFileExcludePatterns []string // !!! PreferTypeOnlyAutoImports bool // !!! // ------- OrganizeImports ------- // Indicates whether imports should be organized in a case-insensitive manner. // // Default: TSUnknown ("auto" in strada), will perform detection OrganizeImportsIgnoreCase core.Tristate // !!! // Indicates whether imports should be organized via an "ordinal" (binary) comparison using the numeric value of their // code points, or via "unicode" collation (via the Unicode Collation Algorithm (https://unicode.org/reports/tr10/#Scope)) // // using rules associated with the locale specified in organizeImportsCollationLocale. // // Default: Ordinal OrganizeImportsCollation OrganizeImportsCollation // !!! // Indicates the locale to use for "unicode" collation. If not specified, the locale `"en"` is used as an invariant // for the sake of consistent sorting. Use `"auto"` to use the detected UI locale. // // This preference is ignored if organizeImportsCollation is not `unicode`. // // Default: `"en"` OrganizeImportsLocale string // !!! // Indicates whether numeric collation should be used for digit sequences in strings. When `true`, will collate // strings such that `a1z < a2z < a100z`. When `false`, will collate strings such that `a1z < a100z < a2z`. // // This preference is ignored if organizeImportsCollation is not `unicode`. // // Default: `false` OrganizeImportsNumericCollation bool // !!! // Indicates whether accents and other diacritic marks are considered unequal for the purpose of collation. When // `true`, characters with accents and other diacritics will be collated in the order defined by the locale specified // in organizeImportsCollationLocale. // // This preference is ignored if organizeImportsCollation is not `unicode`. // // Default: `true` OrganizeImportsAccentCollation bool // !!! // Indicates whether upper case or lower case should sort first. When `false`, the default order for the locale // specified in organizeImportsCollationLocale is used. // // This preference is ignored if: // - organizeImportsCollation is not `unicode` // - organizeImportsIgnoreCase is `true` // - organizeImportsIgnoreCase is `auto` and the auto-detected case sensitivity is case-insensitive. // // Default: `false` OrganizeImportsCaseFirst OrganizeImportsCaseFirst // !!! // Indicates where named type-only imports should sort. "inline" sorts named imports without regard to if the import is type-only. // // Default: `auto`, which defaults to `last` OrganizeImportsTypeOrder OrganizeImportsTypeOrder // !!! // ------- MoveToFile ------- AllowTextChangesInNewFiles bool // !!! // ------- Rename ------- // renamed from `providePrefixAndSuffixTextForRename` UseAliasesForRename core.Tristate AllowRenameOfImportPath bool // !!! // ------- CodeFixes/Refactors ------- ProvideRefactorNotApplicableReason bool // !!! // ------- InlayHints ------- InlayHints InlayHintsPreferences // ------- CodeLens ------- CodeLens CodeLensUserPreferences // ------- Symbols ------- ExcludeLibrarySymbolsInNavTo bool // ------- Misc ------- DisableSuggestions bool // !!! DisableLineTextInReferences bool // !!! DisplayPartsForJSDoc bool // !!! ReportStyleChecksAsWarnings bool // !!! If this changes, we need to ask the client to recompute diagnostics } type InlayHintsPreferences struct { IncludeInlayParameterNameHints IncludeInlayParameterNameHints IncludeInlayParameterNameHintsWhenArgumentMatchesName bool IncludeInlayFunctionParameterTypeHints bool IncludeInlayVariableTypeHints bool IncludeInlayVariableTypeHintsWhenTypeMatchesName bool IncludeInlayPropertyDeclarationTypeHints bool IncludeInlayFunctionLikeReturnTypeHints bool IncludeInlayEnumMemberValueHints bool } type CodeLensUserPreferences struct { ReferencesCodeLensEnabled bool ImplementationsCodeLensEnabled bool ReferencesCodeLensShowOnAllFunctions bool ImplementationsCodeLensShowOnInterfaceMethods bool ImplementationsCodeLensShowOnAllClassMethods bool } type JsxAttributeCompletionStyle string const ( JsxAttributeCompletionStyleUnknown JsxAttributeCompletionStyle = "" // !!! JsxAttributeCompletionStyleAuto JsxAttributeCompletionStyle = "auto" JsxAttributeCompletionStyleBraces JsxAttributeCompletionStyle = "braces" JsxAttributeCompletionStyleNone JsxAttributeCompletionStyle = "none" ) func parseJsxAttributeCompletionStyle(val any) JsxAttributeCompletionStyle { if s, ok := val.(string); ok { switch strings.ToLower(s) { case "braces": return JsxAttributeCompletionStyleBraces case "none": return JsxAttributeCompletionStyleNone } } return JsxAttributeCompletionStyleAuto } func parseImportModuleSpecifierPreference(val any) modulespecifiers.ImportModuleSpecifierPreference { if s, ok := val.(string); ok { switch strings.ToLower(s) { case "project-relative": return modulespecifiers.ImportModuleSpecifierPreferenceProjectRelative case "relative": return modulespecifiers.ImportModuleSpecifierPreferenceRelative case "non-relative": return modulespecifiers.ImportModuleSpecifierPreferenceNonRelative } } return modulespecifiers.ImportModuleSpecifierPreferenceShortest } func parseImportModuleSpecifierEndingPreference(val any) modulespecifiers.ImportModuleSpecifierEndingPreference { if s, ok := val.(string); ok { switch strings.ToLower(s) { case "minimal": return modulespecifiers.ImportModuleSpecifierEndingPreferenceMinimal case "index": return modulespecifiers.ImportModuleSpecifierEndingPreferenceIndex case "js": return modulespecifiers.ImportModuleSpecifierEndingPreferenceJs } } return modulespecifiers.ImportModuleSpecifierEndingPreferenceAuto } type IncludeInlayParameterNameHints string const ( IncludeInlayParameterNameHintsNone IncludeInlayParameterNameHints = "" IncludeInlayParameterNameHintsAll IncludeInlayParameterNameHints = "all" IncludeInlayParameterNameHintsLiterals IncludeInlayParameterNameHints = "literals" ) func parseInlayParameterNameHints(val any) IncludeInlayParameterNameHints { if prefStr, ok := val.(string); ok { switch prefStr { case "all": return IncludeInlayParameterNameHintsAll case "literals": return IncludeInlayParameterNameHintsLiterals } } return IncludeInlayParameterNameHintsNone } type IncludePackageJsonAutoImports string const ( IncludePackageJsonAutoImportsUnknown IncludePackageJsonAutoImports = "" // !!! IncludePackageJsonAutoImportsAuto IncludePackageJsonAutoImports = "auto" IncludePackageJsonAutoImportsOn IncludePackageJsonAutoImports = "on" IncludePackageJsonAutoImportsOff IncludePackageJsonAutoImports = "off" ) func parseIncludePackageJsonAutoImports(val any) IncludePackageJsonAutoImports { if s, ok := val.(string); ok { switch strings.ToLower(s) { case "on": return IncludePackageJsonAutoImportsOn case "off": return IncludePackageJsonAutoImportsOff default: return IncludePackageJsonAutoImportsAuto } } return IncludePackageJsonAutoImportsUnknown } type OrganizeImportsCollation bool const ( OrganizeImportsCollationOrdinal OrganizeImportsCollation = false OrganizeImportsCollationUnicode OrganizeImportsCollation = true ) func parseOrganizeImportsCollation(val any) OrganizeImportsCollation { if b, ok := val.(string); ok && strings.ToLower(b) == "unicode" { return OrganizeImportsCollationUnicode } return OrganizeImportsCollationOrdinal } type OrganizeImportsCaseFirst int const ( OrganizeImportsCaseFirstFalse OrganizeImportsCaseFirst = 0 OrganizeImportsCaseFirstLower OrganizeImportsCaseFirst = 1 OrganizeImportsCaseFirstUpper OrganizeImportsCaseFirst = 2 ) func parseOrganizeImportsCaseFirst(caseFirst any) OrganizeImportsCaseFirst { if caseFirstStr, ok := caseFirst.(string); ok { switch caseFirstStr { case "lower": return OrganizeImportsCaseFirstLower case "upper": return OrganizeImportsCaseFirstUpper } } return OrganizeImportsCaseFirstFalse } type OrganizeImportsTypeOrder int const ( OrganizeImportsTypeOrderAuto OrganizeImportsTypeOrder = 0 OrganizeImportsTypeOrderLast OrganizeImportsTypeOrder = 1 OrganizeImportsTypeOrderInline OrganizeImportsTypeOrder = 2 OrganizeImportsTypeOrderFirst OrganizeImportsTypeOrder = 3 ) func parseOrganizeImportsTypeOrder(typeOrder any) OrganizeImportsTypeOrder { if typeOrderStr, ok := typeOrder.(string); ok { switch typeOrderStr { case "last": return OrganizeImportsTypeOrderLast case "inline": return OrganizeImportsTypeOrderInline case "first": return OrganizeImportsTypeOrderFirst } } return OrganizeImportsTypeOrderAuto } type QuotePreference string const ( QuotePreferenceUnknown QuotePreference = "" QuotePreferenceAuto QuotePreference = "auto" QuotePreferenceDouble QuotePreference = "double" QuotePreferenceSingle QuotePreference = "single" ) func parseQuotePreference(val any) QuotePreference { if s, ok := val.(string); ok { switch strings.ToLower(s) { case "auto": return QuotePreferenceAuto case "double": return QuotePreferenceDouble case "single": return QuotePreferenceSingle } } return QuotePreferenceUnknown } func (p *UserPreferences) Copy() *UserPreferences { if p == nil { return nil } prefCopy := *p prefCopy.AutoImportSpecifierExcludeRegexes = slices.Clone(p.AutoImportSpecifierExcludeRegexes) prefCopy.AutoImportFileExcludePatterns = slices.Clone(p.AutoImportFileExcludePatterns) return &prefCopy } func (p *UserPreferences) CopyOrDefault() *UserPreferences { if p == nil { return NewDefaultUserPreferences() } return p.Copy() } func (p *UserPreferences) ModuleSpecifierPreferences() modulespecifiers.UserPreferences { return modulespecifiers.UserPreferences{ ImportModuleSpecifierPreference: p.ImportModuleSpecifierPreference, ImportModuleSpecifierEnding: p.ImportModuleSpecifierEnding, AutoImportSpecifierExcludeRegexes: p.AutoImportSpecifierExcludeRegexes, } } // ------ Parsing Config Response ------- // returns non-nil if should break loop func (p *UserPreferences) Parse(item any) *UserPreferences { if item == nil { // continue } else if config, ok := item.(map[string]any); ok { p.parseWorker(config) } else if item, ok := item.(*UserPreferences); ok { // case for fourslash return item.CopyOrDefault() } return nil } func (p *UserPreferences) parseWorker(config map[string]any) { // Process unstable preferences first so that they do not overwrite stable properties if unstable, ok := config["unstable"]; ok { // unstable properties must be named the same as userPreferences p.parseAll(unstable) } for name, values := range config { switch name { case "unstable": continue case "inlayHints": p.parseInlayHints(values) case "referencesCodeLens": p.parseReferencesCodeLens(values) case "implementationsCodeLens": p.parseImplementationsCodeLens(values) case "suggest": p.parseSuggest(values) case "preferences": p.parsePreferences(values) case "workspaceSymbols": p.parseWorkspaceSymbols(values) case "format": // !!! case "tsserver": // !!! case "tsc": // !!! case "experimental": // !!! default: p.set(name, values) } } } func (p *UserPreferences) parseAll(prefs any) { prefsMap, ok := prefs.(map[string]any) if !ok { return } for name, value := range prefsMap { p.set(name, value) } } func (p *UserPreferences) parseInlayHints(prefs any) { inlayHintsPreferences, ok := prefs.(map[string]any) if !ok { return } for name, value := range inlayHintsPreferences { if v, ok := value.(map[string]any); ok { // vscode's inlay hints settings are nested objects with "enabled" and other properties switch name { case "parameterNames": if enabled, ok := v["enabled"]; ok { p.set("includeInlayParameterNameHints", enabled) } p.InlayHints.IncludeInlayParameterNameHintsWhenArgumentMatchesName = parseSuppress(v, "suppressWhenArgumentMatchesName") case "parameterTypes": p.InlayHints.IncludeInlayFunctionParameterTypeHints = parseEnabledBool(v) case "variableTypes": p.InlayHints.IncludeInlayVariableTypeHints = parseEnabledBool(v) p.InlayHints.IncludeInlayVariableTypeHintsWhenTypeMatchesName = parseSuppress(v, "suppressWhenTypeMatchesName") case "propertyDeclarationTypes": p.InlayHints.IncludeInlayPropertyDeclarationTypeHints = parseEnabledBool(v) case "functionLikeReturnTypes": p.InlayHints.IncludeInlayFunctionLikeReturnTypeHints = parseEnabledBool(v) case "enumMemberValues": p.InlayHints.IncludeInlayEnumMemberValueHints = parseEnabledBool(v) } } else { // non-vscode case p.set(name, v) } } } func (p *UserPreferences) parseReferencesCodeLens(prefs any) { referencesCodeLens, ok := prefs.(map[string]any) if !ok { return } for name, value := range referencesCodeLens { switch name { case "enabled": p.set("referencesCodeLensEnabled", value) case "showOnAllFunctions": p.set("referencesCodeLensShowOnAllFunctions", value) } } } func (p *UserPreferences) parseImplementationsCodeLens(prefs any) { implementationsCodeLens, ok := prefs.(map[string]any) if !ok { return } for name, value := range implementationsCodeLens { switch name { case "enabled": p.set("implementationsCodeLensEnabled", value) case "showOnInterfaceMethods": p.set("implementationsCodeLensShowOnInterfaceMethods", value) case "showOnAllClassMethods": p.set("implementationsCodeLensShowOnAllClassMethods", value) } } } func (p *UserPreferences) parseSuggest(prefs any) { completionsPreferences, ok := prefs.(map[string]any) if !ok { return } for name, value := range completionsPreferences { switch name { case "autoImports": p.set("includeCompletionsForModuleExports", value) case "objectLiteralMethodSnippets": if v, ok := value.(map[string]any); ok { p.set("includeCompletionsWithObjectLiteralMethodSnippets", parseEnabledBool(v)) } case "classMemberSnippets": if v, ok := value.(map[string]any); ok { p.set("includeCompletionsWithClassMemberSnippets", parseEnabledBool(v)) } case "includeAutomaticOptionalChainCompletions": p.set("includeAutomaticOptionalChainCompletions", value) case "includeCompletionsForImportStatements": p.set("includeCompletionsForImportStatements", value) } } } func (p *UserPreferences) parsePreferences(prefs any) { prefsMap, ok := prefs.(map[string]any) if !ok { return } for name, value := range prefsMap { if name == "organizeImports" { p.parseOrganizeImportsPreferences(value) } else { p.set(name, value) } } } func (p *UserPreferences) parseOrganizeImportsPreferences(prefs any) { // !!! this used to be in the typescript-language-features extension prefsMap, ok := prefs.(map[string]any) if !ok { return } if typeOrder, ok := prefsMap["typeOrder"]; ok { p.set("organizeimportstypeorder", parseOrganizeImportsTypeOrder(typeOrder)) } if caseSensitivity, ok := prefsMap["caseSensitivity"]; ok { if caseSensitivityStr, ok := caseSensitivity.(string); ok { // default is already "auto" switch caseSensitivityStr { case "caseInsensitive": p.OrganizeImportsIgnoreCase = core.TSTrue case "caseSensitive": p.OrganizeImportsIgnoreCase = core.TSFalse } } } if collation, ok := prefsMap["unicodeCollation"]; ok { // The rest of the settings are only applicable when using unicode collation if collationStr, ok := collation.(string); ok && collationStr == "unicode" { p.set("organizeimportscollation", OrganizeImportsCollationUnicode) if locale, ok := prefsMap["locale"]; ok { p.set("organizeimportslocale", locale) } if numeric, ok := prefsMap["numericCollation"]; ok { p.set("organizeimportsnumericcollation", numeric) } if accent, ok := prefsMap["accentCollation"]; ok { p.set("organizeimportsaccentcollation", accent) } if caseFirst, ok := prefsMap["caseFirst"]; ok && !p.OrganizeImportsIgnoreCase.IsTrue() { p.set("organizeimportscasefirst", caseFirst) } } } } func (p *UserPreferences) parseWorkspaceSymbols(prefs any) { symbolPreferences, ok := prefs.(map[string]any) if !ok { return } for name, value := range symbolPreferences { switch name { // !!! scope case "excludeLibrarySymbols": p.ExcludeLibrarySymbolsInNavTo = parseBoolWithDefault(value, true) default: p.set(name, value) } } } func parseEnabledBool(v map[string]any) bool { // vscode nested option if enabled, ok := v["enabled"]; ok { if e, ok := enabled.(bool); ok { return e } } return false } func parseSuppress(v map[string]any, name string) bool { // vscode nested option if val, ok := v[name]; ok { if suppress, ok := val.(bool); ok { return !suppress } } return false } func parseBoolWithDefault(val any, defaultV bool) bool { if v, ok := val.(bool); ok { return v } return defaultV } func parseIntWithDefault(val any, defaultV int) int { if v, ok := val.(int); ok { return v } return defaultV } func (p *UserPreferences) set(name string, value any) { switch strings.ToLower(name) { case "quotePreference": p.QuotePreference = parseQuotePreference(value) case "lazyconfiguredprojectsfromexternalproject": p.LazyConfiguredProjectsFromExternalProject = parseBoolWithDefault(value, false) case "maximumhoverlength": p.MaximumHoverLength = parseIntWithDefault(value, 500) case "includecompletionsformoduleexports": p.IncludeCompletionsForModuleExports = tsoptions.ParseTristate(value) case "includecompletionsforimportstatements": p.IncludeCompletionsForImportStatements = tsoptions.ParseTristate(value) case "includeautomaticoptionalchaincompletions": p.IncludeAutomaticOptionalChainCompletions = tsoptions.ParseTristate(value) case "includecompletionswithsnippettext": p.IncludeCompletionsWithSnippetText = tsoptions.ParseTristate(value) case "includecompletionswithclassmembersnippets": p.IncludeCompletionsWithClassMemberSnippets = tsoptions.ParseTristate(value) case "includecompletionswithobjectliteralmethodsnippets": p.IncludeCompletionsWithObjectLiteralMethodSnippets = tsoptions.ParseTristate(value) case "jsxattributecompletionstyle": p.JsxAttributeCompletionStyle = parseJsxAttributeCompletionStyle(value) case "importmodulespecifierpreference": p.ImportModuleSpecifierPreference = parseImportModuleSpecifierPreference(value) case "importmodulespecifierending": p.ImportModuleSpecifierEnding = parseImportModuleSpecifierEndingPreference(value) case "includepackagejsonautoimports": p.IncludePackageJsonAutoImports = parseIncludePackageJsonAutoImports(value) case "autoimportspecifierexcluderegexes": p.AutoImportSpecifierExcludeRegexes = tsoptions.ParseStringArray(value) case "autoimportfileexcludepatterns": p.AutoImportFileExcludePatterns = tsoptions.ParseStringArray(value) case "prefertypeonlyautoimports": p.PreferTypeOnlyAutoImports = parseBoolWithDefault(value, false) case "organizeimportsignorecase": p.OrganizeImportsIgnoreCase = tsoptions.ParseTristate(value) case "organizeimportscollation": p.OrganizeImportsCollation = parseOrganizeImportsCollation(value) case "organizeimportslocale": p.OrganizeImportsLocale = tsoptions.ParseString(value) case "organizeimportsnumericcollation": p.OrganizeImportsNumericCollation = parseBoolWithDefault(value, false) case "organizeimportsaccentcollation": p.OrganizeImportsAccentCollation = parseBoolWithDefault(value, true) case "organizeimportscasefirst": p.OrganizeImportsCaseFirst = parseOrganizeImportsCaseFirst(value) case "organizeimportstypeorder": p.OrganizeImportsTypeOrder = parseOrganizeImportsTypeOrder(value) case "allowtextchangesinnewfiles": p.AllowTextChangesInNewFiles = parseBoolWithDefault(value, true) // !!! case "usealiasesforrename", "provideprefixandsuffixtextforrename": p.UseAliasesForRename = tsoptions.ParseTristate(value) case "allowrenameofimportpath": p.AllowRenameOfImportPath = parseBoolWithDefault(value, true) case "providerefactornotapplicablereason": p.ProvideRefactorNotApplicableReason = parseBoolWithDefault(value, true) case "includeinlayparameternamehints": p.InlayHints.IncludeInlayParameterNameHints = parseInlayParameterNameHints(value) case "includeinlayparameternamehintswhenargumentmatchesname": p.InlayHints.IncludeInlayParameterNameHintsWhenArgumentMatchesName = parseBoolWithDefault(value, false) case "includeinlayfunctionparametertypeHints": p.InlayHints.IncludeInlayFunctionParameterTypeHints = parseBoolWithDefault(value, false) case "includeinlayvariabletypehints": p.InlayHints.IncludeInlayVariableTypeHints = parseBoolWithDefault(value, false) case "includeinlayvariabletypehintswhentypematchesname": p.InlayHints.IncludeInlayVariableTypeHintsWhenTypeMatchesName = parseBoolWithDefault(value, false) case "includeinlaypropertydeclarationtypehints": p.InlayHints.IncludeInlayPropertyDeclarationTypeHints = parseBoolWithDefault(value, false) case "includeinlayfunctionlikereturntypehints": p.InlayHints.IncludeInlayFunctionLikeReturnTypeHints = parseBoolWithDefault(value, false) case "includeinlayenummembervaluehints": p.InlayHints.IncludeInlayEnumMemberValueHints = parseBoolWithDefault(value, false) case "excludelibrarysymbolsinnavto": p.ExcludeLibrarySymbolsInNavTo = parseBoolWithDefault(value, true) case "disablesuggestions": p.DisableSuggestions = parseBoolWithDefault(value, false) case "disablelinetextinreferences": p.DisableLineTextInReferences = parseBoolWithDefault(value, true) case "displaypartsforjsdoc": p.DisplayPartsForJSDoc = parseBoolWithDefault(value, true) case "reportstylechecksaswarnings": p.ReportStyleChecksAsWarnings = parseBoolWithDefault(value, true) case "referencescodelensenabled": p.CodeLens.ReferencesCodeLensEnabled = parseBoolWithDefault(value, false) case "implementationscodelensenabled": p.CodeLens.ImplementationsCodeLensEnabled = parseBoolWithDefault(value, false) case "referencescodelensshowonallfunctions": p.CodeLens.ReferencesCodeLensShowOnAllFunctions = parseBoolWithDefault(value, false) case "implementationscodelensshowoninterfacemethods": p.CodeLens.ImplementationsCodeLensShowOnInterfaceMethods = parseBoolWithDefault(value, false) case "implementationscodelensshowonallclassmethods": p.CodeLens.ImplementationsCodeLensShowOnAllClassMethods = parseBoolWithDefault(value, false) } }