diff --git a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts index a1faf287a3f..e3381679a30 100644 --- a/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts +++ b/extensions/typescript-language-features/src/languageFeatures/fileConfigurationManager.ts @@ -217,15 +217,24 @@ export default class FileConfigurationManager extends Disposable { } } +export class InlayHintSettingNames { + static readonly parameterNamesSuppressWhenArgumentMatchesName = 'inlayHints.parameterNames.suppressWhenArgumentMatchesName'; + static readonly parameterNamesEnabled = 'inlayHints.parameterTypes.enabled'; + static readonly variableTypesEnabled = 'inlayHints.variableTypes.enabled'; + static readonly propertyDeclarationTypesEnabled = 'inlayHints.propertyDeclarationTypes.enabled'; + static readonly functionLikeReturnTypesEnabled = 'inlayHints.functionLikeReturnTypes.enabled'; + static readonly enumMemberValuesEnabled = 'inlayHints.enumMemberValues.enabled'; +} + export function getInlayHintsPreferences(config: vscode.WorkspaceConfiguration) { return { includeInlayParameterNameHints: getInlayParameterNameHintsPreference(config), - includeInlayParameterNameHintsWhenArgumentMatchesName: !config.get('inlayHints.parameterNames.suppressWhenArgumentMatchesName', true), - includeInlayFunctionParameterTypeHints: config.get('inlayHints.parameterTypes.enabled', false), - includeInlayVariableTypeHints: config.get('inlayHints.variableTypes.enabled', false), - includeInlayPropertyDeclarationTypeHints: config.get('inlayHints.propertyDeclarationTypes.enabled', false), - includeInlayFunctionLikeReturnTypeHints: config.get('inlayHints.functionLikeReturnTypes.enabled', false), - includeInlayEnumMemberValueHints: config.get('inlayHints.enumMemberValues.enabled', false), + includeInlayParameterNameHintsWhenArgumentMatchesName: !config.get(InlayHintSettingNames.parameterNamesSuppressWhenArgumentMatchesName, true), + includeInlayFunctionParameterTypeHints: config.get(InlayHintSettingNames.parameterNamesEnabled, false), + includeInlayVariableTypeHints: config.get(InlayHintSettingNames.variableTypesEnabled, false), + includeInlayPropertyDeclarationTypeHints: config.get(InlayHintSettingNames.propertyDeclarationTypesEnabled, false), + includeInlayFunctionLikeReturnTypeHints: config.get(InlayHintSettingNames.functionLikeReturnTypesEnabled, false), + includeInlayEnumMemberValueHints: config.get(InlayHintSettingNames.enumMemberValuesEnabled, false), } as const; } diff --git a/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts b/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts index c2039e9646b..5ca34a41aad 100644 --- a/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts +++ b/extensions/typescript-language-features/src/languageFeatures/inlayHints.ts @@ -9,8 +9,9 @@ import { DocumentSelector } from '../utils/documentSelector'; import { ClientCapability, ITypeScriptServiceClient, ServerResponse, ExecConfig } from '../typescriptService'; import { Condition, conditionalRegistration, requireMinVersion, requireSomeCapability } from '../utils/dependentRegistration'; import { Position } from '../utils/typeConverters'; -import FileConfigurationManager, { getInlayHintsPreferences } from './fileConfigurationManager'; +import FileConfigurationManager, { getInlayHintsPreferences, InlayHintSettingNames } from './fileConfigurationManager'; import API from '../utils/api'; +import { Disposable } from '../utils/dispose'; namespace ExperimentalProto { export const enum CommandTypes { @@ -80,13 +81,35 @@ namespace ExperimentalProto { } } -class TypeScriptInlayHintsProvider implements vscode.InlayHintsProvider { +const inlayHintSettingNames = [ + InlayHintSettingNames.parameterNamesSuppressWhenArgumentMatchesName, + InlayHintSettingNames.parameterNamesEnabled, + InlayHintSettingNames.variableTypesEnabled, + InlayHintSettingNames.propertyDeclarationTypesEnabled, + InlayHintSettingNames.functionLikeReturnTypesEnabled, + InlayHintSettingNames.enumMemberValuesEnabled, +]; + +class TypeScriptInlayHintsProvider extends Disposable implements vscode.InlayHintsProvider { + public static readonly minVersion = API.v440; + private readonly _onDidChangeInlayHints = new vscode.EventEmitter(); + public readonly onDidChangeInlayHints = this._onDidChangeInlayHints.event; + constructor( + modeId: string, private readonly client: ITypeScriptServiceClient, private readonly fileConfigurationManager: FileConfigurationManager - ) { } + ) { + super(); + + this._register(vscode.workspace.onDidChangeConfiguration(e => { + if (inlayHintSettingNames.some(settingName => e.affectsConfiguration(modeId + '.' + settingName))) { + this._onDidChangeInlayHints.fire(); + } + })); + } async provideInlayHints(model: vscode.TextDocument, range: vscode.Range, token: vscode.CancellationToken): Promise { const filepath = this.client.toOpenedFilePath(model); @@ -148,7 +171,7 @@ export function register( requireMinVersion(client, TypeScriptInlayHintsProvider.minVersion), requireSomeCapability(client, ClientCapability.Semantic), ], () => { - return vscode.languages.registerInlayHintsProvider(selector.semantic, - new TypeScriptInlayHintsProvider(client, fileConfigurationManager)); + const provider = new TypeScriptInlayHintsProvider(modeId, client, fileConfigurationManager); + return vscode.languages.registerInlayHintsProvider(selector.semantic, provider); }); }