Fix inlay hint tests. And reapply inlay hint settings if they're changed (#12014)
* Fix inlay hint tests. And reapply inlay hint settings if they're changed. * Make updating work without scrolling.
This commit is contained in:
Родитель
93f4337576
Коммит
cdc9dd8584
|
@ -10,7 +10,17 @@ interface FileData
|
|||
{
|
||||
version: number;
|
||||
promise: ManualPromise<vscode.InlayHint[]>;
|
||||
typeHints: CppInlayHint[];
|
||||
parameterHints: CppInlayHint[];
|
||||
inlayHints: vscode.InlayHint[];
|
||||
|
||||
inlayHintsAutoDeclarationTypes?: boolean;
|
||||
inlayHintsAutoDeclarationTypesShowOnLeft?: boolean;
|
||||
inlayHintsParameterNames?: boolean;
|
||||
inlayHintsParameterNamesHideLeadingUnderscores?: boolean;
|
||||
inlayHintsParameterNamesSuppressName?: boolean;
|
||||
inlayHintsReferenceOperator?: boolean;
|
||||
inlayHintsReferenceOperatorShowSpace?: boolean;
|
||||
}
|
||||
|
||||
export interface CppInlayHint {
|
||||
|
@ -35,7 +45,7 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
|
|||
public onDidChangeInlayHints?: vscode.Event<void> = this.onDidChangeInlayHintsEvent.event;
|
||||
private allFileData: Map<string, FileData> = new Map<string, FileData>();
|
||||
|
||||
public async provideInlayHints(document: vscode.TextDocument, range: vscode.Range, token: vscode.CancellationToken): Promise<vscode.InlayHint[]> {
|
||||
public async provideInlayHints(document: vscode.TextDocument, _range: vscode.Range, token: vscode.CancellationToken): Promise<vscode.InlayHint[]> {
|
||||
const uri: vscode.Uri = document.uri;
|
||||
const uriString: string = uri.toString();
|
||||
let fileData: FileData | undefined = this.allFileData.get(uriString);
|
||||
|
@ -44,6 +54,36 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
|
|||
// Make sure file hasn't been changed since the last set of results.
|
||||
// If a complete promise is present, there should also be a cache.
|
||||
if (fileData.version === document.version) {
|
||||
const settings: CppSettings = new CppSettings(vscode.Uri.parse(uriString));
|
||||
// Check if any of the settings changed.
|
||||
if (fileData.inlayHintsAutoDeclarationTypes === settings.inlayHintsAutoDeclarationTypes &&
|
||||
fileData.inlayHintsAutoDeclarationTypesShowOnLeft === settings.inlayHintsAutoDeclarationTypesShowOnLeft &&
|
||||
fileData.inlayHintsParameterNames === settings.inlayHintsParameterNames &&
|
||||
fileData.inlayHintsParameterNamesHideLeadingUnderscores === settings.inlayHintsParameterNamesHideLeadingUnderscores &&
|
||||
fileData.inlayHintsParameterNamesSuppressName === settings.inlayHintsParameterNamesSuppressName &&
|
||||
fileData.inlayHintsReferenceOperator === settings.inlayHintsReferenceOperator &&
|
||||
fileData.inlayHintsReferenceOperatorShowSpace === settings.inlayHintsReferenceOperatorShowSpace) {
|
||||
return fileData.promise;
|
||||
}
|
||||
fileData.inlayHints = [];
|
||||
fileData.inlayHintsAutoDeclarationTypes = settings.inlayHintsAutoDeclarationTypes;
|
||||
fileData.inlayHintsAutoDeclarationTypesShowOnLeft = settings.inlayHintsAutoDeclarationTypesShowOnLeft;
|
||||
fileData.inlayHintsParameterNames = settings.inlayHintsParameterNames;
|
||||
fileData.inlayHintsParameterNamesHideLeadingUnderscores = settings.inlayHintsParameterNamesHideLeadingUnderscores;
|
||||
fileData.inlayHintsParameterNamesSuppressName = settings.inlayHintsParameterNamesSuppressName;
|
||||
fileData.inlayHintsReferenceOperator = settings.inlayHintsReferenceOperator;
|
||||
fileData.inlayHintsReferenceOperatorShowSpace = settings.inlayHintsReferenceOperatorShowSpace;
|
||||
if (settings.inlayHintsAutoDeclarationTypes) {
|
||||
const resolvedTypeHints: vscode.InlayHint[] = this.resolveTypeHints(settings, fileData.typeHints);
|
||||
Array.prototype.push.apply(fileData.inlayHints, resolvedTypeHints);
|
||||
}
|
||||
if (settings.inlayHintsParameterNames || settings.inlayHintsReferenceOperator) {
|
||||
const resolvedParameterHints: vscode.InlayHint[] = this.resolveParameterHints(settings, fileData.parameterHints);
|
||||
Array.prototype.push.apply(fileData.inlayHints, resolvedParameterHints);
|
||||
}
|
||||
fileData.promise = new ManualPromise<vscode.InlayHint[]>();
|
||||
fileData.promise.resolve(fileData.inlayHints);
|
||||
this.onDidChangeInlayHintsEvent.fire();
|
||||
return fileData.promise;
|
||||
}
|
||||
} else {
|
||||
|
@ -56,6 +96,8 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
|
|||
fileData = {
|
||||
version: document.version,
|
||||
promise: new ManualPromise<vscode.InlayHint[]>(),
|
||||
typeHints: [],
|
||||
parameterHints: [],
|
||||
inlayHints: []
|
||||
};
|
||||
this.allFileData.set(uriString, fileData);
|
||||
|
@ -93,6 +135,8 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
|
|||
fileData = {
|
||||
version: editor.document.version,
|
||||
promise: new ManualPromise<vscode.InlayHint[]>(),
|
||||
typeHints: [],
|
||||
parameterHints: [],
|
||||
inlayHints: []
|
||||
};
|
||||
newPromiseCreated = true;
|
||||
|
@ -105,25 +149,38 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
|
|||
}
|
||||
if (fileData.version !== editor.document.version) {
|
||||
fileData.version = editor.document.version;
|
||||
fileData.typeHints = [];
|
||||
fileData.parameterHints = [];
|
||||
fileData.inlayHints = [];
|
||||
}
|
||||
}
|
||||
return [fileData, newPromiseCreated];
|
||||
})();
|
||||
const settings: CppSettings = new CppSettings(vscode.Uri.parse(uriString));
|
||||
if (startNewSet) {
|
||||
fileData.inlayHints = [];
|
||||
fileData.typeHints = [];
|
||||
fileData.parameterHints = [];
|
||||
fileData.inlayHintsAutoDeclarationTypes = settings.inlayHintsAutoDeclarationTypes;
|
||||
fileData.inlayHintsAutoDeclarationTypesShowOnLeft = settings.inlayHintsAutoDeclarationTypesShowOnLeft;
|
||||
fileData.inlayHintsParameterNames = settings.inlayHintsParameterNames;
|
||||
fileData.inlayHintsParameterNamesHideLeadingUnderscores = settings.inlayHintsParameterNamesHideLeadingUnderscores;
|
||||
fileData.inlayHintsParameterNamesSuppressName = settings.inlayHintsParameterNamesSuppressName;
|
||||
fileData.inlayHintsReferenceOperator = settings.inlayHintsReferenceOperator;
|
||||
fileData.inlayHintsReferenceOperatorShowSpace = settings.inlayHintsReferenceOperatorShowSpace;
|
||||
}
|
||||
|
||||
const typeHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Type);
|
||||
const paramHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Parameter);
|
||||
const newTypeHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Type);
|
||||
const newParameterHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Parameter);
|
||||
Array.prototype.push.apply(fileData.typeHints, newTypeHints);
|
||||
Array.prototype.push.apply(fileData.parameterHints, newParameterHints);
|
||||
|
||||
const settings: CppSettings = new CppSettings(vscode.Uri.parse(uriString));
|
||||
if (settings.inlayHintsAutoDeclarationTypes) {
|
||||
const resolvedTypeHints: vscode.InlayHint[] = this.resolveTypeHints(settings, typeHints);
|
||||
const resolvedTypeHints: vscode.InlayHint[] = this.resolveTypeHints(settings, newTypeHints);
|
||||
Array.prototype.push.apply(fileData.inlayHints, resolvedTypeHints);
|
||||
}
|
||||
if (settings.inlayHintsParameterNames || settings.inlayHintsReferenceOperator) {
|
||||
const resolvedParameterHints: vscode.InlayHint[] = this.resolveParameterHints(settings, paramHints);
|
||||
const resolvedParameterHints: vscode.InlayHint[] = this.resolveParameterHints(settings, newParameterHints);
|
||||
Array.prototype.push.apply(fileData.inlayHints, resolvedParameterHints);
|
||||
}
|
||||
|
||||
|
|
|
@ -1628,6 +1628,24 @@ export class DefaultClient implements Client {
|
|||
}
|
||||
}
|
||||
|
||||
// If an inlay hints setting has changed, force an inlay provider update on the visible documents.
|
||||
if (["inlayHints.autoDeclarationTypes.enabled",
|
||||
"inlayHints.autoDeclarationTypes.showOnLeft",
|
||||
"inlayHints.parameterNames.enabled",
|
||||
"inlayHints.parameterNames.hideLeadingUnderscores",
|
||||
"inlayHints.parameterNames.suppressWhenArgumentContainsName",
|
||||
"inlayHints.referenceOperator.enabled",
|
||||
"inlayHints.referenceOperator.showSpace"].some(setting => setting in changedSettings)) {
|
||||
vscode.window.visibleTextEditors.forEach((visibleEditor: vscode.TextEditor) => {
|
||||
// The exact range doesn't matter.
|
||||
const visibleRange: vscode.Range | undefined = visibleEditor.visibleRanges.at(0);
|
||||
if (visibleRange !== undefined) {
|
||||
void vscode.commands.executeCommand<vscode.InlayHint[]>('vscode.executeInlayHintProvider',
|
||||
visibleEditor.document.uri, visibleRange);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const showButtonSender: string = "settingsChanged";
|
||||
if (changedSettings["default.configurationProvider"] !== undefined) {
|
||||
void ui.ShowConfigureIntelliSenseButton(false, this, ConfigurationType.ConfigProvider, showButtonSender);
|
||||
|
@ -2309,21 +2327,21 @@ export class DefaultClient implements Client {
|
|||
this.languageClient.onNotification(CanceledReferencesNotification, this.serverCanceledReferences);
|
||||
}
|
||||
|
||||
private handleIntelliSenseResult(intelliseSenseResult: IntelliSenseResult): void {
|
||||
const fileVersion: number | undefined = openFileVersions.get(intelliseSenseResult.uri);
|
||||
if (fileVersion !== undefined && fileVersion !== intelliseSenseResult.fileVersion) {
|
||||
private handleIntelliSenseResult(intelliSenseResult: IntelliSenseResult): void {
|
||||
const fileVersion: number | undefined = openFileVersions.get(intelliSenseResult.uri);
|
||||
if (fileVersion !== undefined && fileVersion !== intelliSenseResult.fileVersion) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.semanticTokensProvider) {
|
||||
this.semanticTokensProvider.deliverTokens(intelliseSenseResult.uri, intelliseSenseResult.semanticTokens, intelliseSenseResult.clearExistingSemanticTokens);
|
||||
this.semanticTokensProvider.deliverTokens(intelliSenseResult.uri, intelliSenseResult.semanticTokens, intelliSenseResult.clearExistingSemanticTokens);
|
||||
}
|
||||
if (this.inlayHintsProvider) {
|
||||
this.inlayHintsProvider.deliverInlayHints(intelliseSenseResult.uri, intelliseSenseResult.inlayHints, intelliseSenseResult.clearExistingInlayHint);
|
||||
this.inlayHintsProvider.deliverInlayHints(intelliSenseResult.uri, intelliSenseResult.inlayHints, intelliSenseResult.clearExistingInlayHint);
|
||||
}
|
||||
|
||||
this.updateInactiveRegions(intelliseSenseResult.uri, intelliseSenseResult.inactiveRegions, intelliseSenseResult.clearExistingInactiveRegions, intelliseSenseResult.isCompletePass);
|
||||
this.updateSquiggles(intelliseSenseResult.uri, intelliseSenseResult.diagnostics, intelliseSenseResult.clearExistingDiagnostics);
|
||||
this.updateInactiveRegions(intelliSenseResult.uri, intelliSenseResult.inactiveRegions, intelliSenseResult.clearExistingInactiveRegions, intelliSenseResult.isCompletePass);
|
||||
this.updateSquiggles(intelliSenseResult.uri, intelliSenseResult.diagnostics, intelliSenseResult.clearExistingDiagnostics);
|
||||
}
|
||||
|
||||
private updateSquiggles(uriString: string, diagnostics: IntelliSenseDiagnostic[], startNewSet: boolean): void {
|
||||
|
|
Загрузка…
Ссылка в новой задаче