Update inlay hints when inlay settings change

This commit is contained in:
Matt Bierner
2021-07-15 15:59:42 -07:00
parent 8849cc7bc5
commit 3fd02ec7ba
2 changed files with 43 additions and 11 deletions

View File

@@ -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<boolean>('inlayHints.parameterNames.suppressWhenArgumentMatchesName', true),
includeInlayFunctionParameterTypeHints: config.get<boolean>('inlayHints.parameterTypes.enabled', false),
includeInlayVariableTypeHints: config.get<boolean>('inlayHints.variableTypes.enabled', false),
includeInlayPropertyDeclarationTypeHints: config.get<boolean>('inlayHints.propertyDeclarationTypes.enabled', false),
includeInlayFunctionLikeReturnTypeHints: config.get<boolean>('inlayHints.functionLikeReturnTypes.enabled', false),
includeInlayEnumMemberValueHints: config.get<boolean>('inlayHints.enumMemberValues.enabled', false),
includeInlayParameterNameHintsWhenArgumentMatchesName: !config.get<boolean>(InlayHintSettingNames.parameterNamesSuppressWhenArgumentMatchesName, true),
includeInlayFunctionParameterTypeHints: config.get<boolean>(InlayHintSettingNames.parameterNamesEnabled, false),
includeInlayVariableTypeHints: config.get<boolean>(InlayHintSettingNames.variableTypesEnabled, false),
includeInlayPropertyDeclarationTypeHints: config.get<boolean>(InlayHintSettingNames.propertyDeclarationTypesEnabled, false),
includeInlayFunctionLikeReturnTypeHints: config.get<boolean>(InlayHintSettingNames.functionLikeReturnTypesEnabled, false),
includeInlayEnumMemberValueHints: config.get<boolean>(InlayHintSettingNames.enumMemberValuesEnabled, false),
} as const;
}

View File

@@ -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<void>();
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<vscode.InlayHint[]> {
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);
});
}