Skip to content

Commit

Permalink
Fix inlay hint tests. And reapply inlay hint settings if they're chan…
Browse files Browse the repository at this point in the history
…ged (#12014)

* Fix inlay hint tests. And reapply inlay hint settings if they're changed.
* Make updating work without scrolling.
  • Loading branch information
sean-mcmanus committed Feb 27, 2024
1 parent 93f4337 commit cdc9dd8
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 13 deletions.
69 changes: 63 additions & 6 deletions Extension/src/LanguageServer/Providers/inlayHintProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
Expand All @@ -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 {
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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);
}

Expand Down
32 changes: 25 additions & 7 deletions Extension/src/LanguageServer/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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 {
Expand Down

0 comments on commit cdc9dd8

Please sign in to comment.