Skip to content

Commit cdc9dd8

Browse files
authored
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.
1 parent 93f4337 commit cdc9dd8

File tree

2 files changed

+88
-13
lines changed

2 files changed

+88
-13
lines changed

Extension/src/LanguageServer/Providers/inlayHintProvider.ts

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,17 @@ interface FileData
1010
{
1111
version: number;
1212
promise: ManualPromise<vscode.InlayHint[]>;
13+
typeHints: CppInlayHint[];
14+
parameterHints: CppInlayHint[];
1315
inlayHints: vscode.InlayHint[];
16+
17+
inlayHintsAutoDeclarationTypes?: boolean;
18+
inlayHintsAutoDeclarationTypesShowOnLeft?: boolean;
19+
inlayHintsParameterNames?: boolean;
20+
inlayHintsParameterNamesHideLeadingUnderscores?: boolean;
21+
inlayHintsParameterNamesSuppressName?: boolean;
22+
inlayHintsReferenceOperator?: boolean;
23+
inlayHintsReferenceOperatorShowSpace?: boolean;
1424
}
1525

1626
export interface CppInlayHint {
@@ -35,7 +45,7 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
3545
public onDidChangeInlayHints?: vscode.Event<void> = this.onDidChangeInlayHintsEvent.event;
3646
private allFileData: Map<string, FileData> = new Map<string, FileData>();
3747

38-
public async provideInlayHints(document: vscode.TextDocument, range: vscode.Range, token: vscode.CancellationToken): Promise<vscode.InlayHint[]> {
48+
public async provideInlayHints(document: vscode.TextDocument, _range: vscode.Range, token: vscode.CancellationToken): Promise<vscode.InlayHint[]> {
3949
const uri: vscode.Uri = document.uri;
4050
const uriString: string = uri.toString();
4151
let fileData: FileData | undefined = this.allFileData.get(uriString);
@@ -44,6 +54,36 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
4454
// Make sure file hasn't been changed since the last set of results.
4555
// If a complete promise is present, there should also be a cache.
4656
if (fileData.version === document.version) {
57+
const settings: CppSettings = new CppSettings(vscode.Uri.parse(uriString));
58+
// Check if any of the settings changed.
59+
if (fileData.inlayHintsAutoDeclarationTypes === settings.inlayHintsAutoDeclarationTypes &&
60+
fileData.inlayHintsAutoDeclarationTypesShowOnLeft === settings.inlayHintsAutoDeclarationTypesShowOnLeft &&
61+
fileData.inlayHintsParameterNames === settings.inlayHintsParameterNames &&
62+
fileData.inlayHintsParameterNamesHideLeadingUnderscores === settings.inlayHintsParameterNamesHideLeadingUnderscores &&
63+
fileData.inlayHintsParameterNamesSuppressName === settings.inlayHintsParameterNamesSuppressName &&
64+
fileData.inlayHintsReferenceOperator === settings.inlayHintsReferenceOperator &&
65+
fileData.inlayHintsReferenceOperatorShowSpace === settings.inlayHintsReferenceOperatorShowSpace) {
66+
return fileData.promise;
67+
}
68+
fileData.inlayHints = [];
69+
fileData.inlayHintsAutoDeclarationTypes = settings.inlayHintsAutoDeclarationTypes;
70+
fileData.inlayHintsAutoDeclarationTypesShowOnLeft = settings.inlayHintsAutoDeclarationTypesShowOnLeft;
71+
fileData.inlayHintsParameterNames = settings.inlayHintsParameterNames;
72+
fileData.inlayHintsParameterNamesHideLeadingUnderscores = settings.inlayHintsParameterNamesHideLeadingUnderscores;
73+
fileData.inlayHintsParameterNamesSuppressName = settings.inlayHintsParameterNamesSuppressName;
74+
fileData.inlayHintsReferenceOperator = settings.inlayHintsReferenceOperator;
75+
fileData.inlayHintsReferenceOperatorShowSpace = settings.inlayHintsReferenceOperatorShowSpace;
76+
if (settings.inlayHintsAutoDeclarationTypes) {
77+
const resolvedTypeHints: vscode.InlayHint[] = this.resolveTypeHints(settings, fileData.typeHints);
78+
Array.prototype.push.apply(fileData.inlayHints, resolvedTypeHints);
79+
}
80+
if (settings.inlayHintsParameterNames || settings.inlayHintsReferenceOperator) {
81+
const resolvedParameterHints: vscode.InlayHint[] = this.resolveParameterHints(settings, fileData.parameterHints);
82+
Array.prototype.push.apply(fileData.inlayHints, resolvedParameterHints);
83+
}
84+
fileData.promise = new ManualPromise<vscode.InlayHint[]>();
85+
fileData.promise.resolve(fileData.inlayHints);
86+
this.onDidChangeInlayHintsEvent.fire();
4787
return fileData.promise;
4888
}
4989
} else {
@@ -56,6 +96,8 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
5696
fileData = {
5797
version: document.version,
5898
promise: new ManualPromise<vscode.InlayHint[]>(),
99+
typeHints: [],
100+
parameterHints: [],
59101
inlayHints: []
60102
};
61103
this.allFileData.set(uriString, fileData);
@@ -93,6 +135,8 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
93135
fileData = {
94136
version: editor.document.version,
95137
promise: new ManualPromise<vscode.InlayHint[]>(),
138+
typeHints: [],
139+
parameterHints: [],
96140
inlayHints: []
97141
};
98142
newPromiseCreated = true;
@@ -105,25 +149,38 @@ export class InlayHintsProvider implements vscode.InlayHintsProvider {
105149
}
106150
if (fileData.version !== editor.document.version) {
107151
fileData.version = editor.document.version;
152+
fileData.typeHints = [];
153+
fileData.parameterHints = [];
108154
fileData.inlayHints = [];
109155
}
110156
}
111157
return [fileData, newPromiseCreated];
112158
})();
159+
const settings: CppSettings = new CppSettings(vscode.Uri.parse(uriString));
113160
if (startNewSet) {
114161
fileData.inlayHints = [];
162+
fileData.typeHints = [];
163+
fileData.parameterHints = [];
164+
fileData.inlayHintsAutoDeclarationTypes = settings.inlayHintsAutoDeclarationTypes;
165+
fileData.inlayHintsAutoDeclarationTypesShowOnLeft = settings.inlayHintsAutoDeclarationTypesShowOnLeft;
166+
fileData.inlayHintsParameterNames = settings.inlayHintsParameterNames;
167+
fileData.inlayHintsParameterNamesHideLeadingUnderscores = settings.inlayHintsParameterNamesHideLeadingUnderscores;
168+
fileData.inlayHintsParameterNamesSuppressName = settings.inlayHintsParameterNamesSuppressName;
169+
fileData.inlayHintsReferenceOperator = settings.inlayHintsReferenceOperator;
170+
fileData.inlayHintsReferenceOperatorShowSpace = settings.inlayHintsReferenceOperatorShowSpace;
115171
}
116172

117-
const typeHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Type);
118-
const paramHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Parameter);
173+
const newTypeHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Type);
174+
const newParameterHints: CppInlayHint[] = cppInlayHints.filter(h => h.inlayHintKind === InlayHintKind.Parameter);
175+
Array.prototype.push.apply(fileData.typeHints, newTypeHints);
176+
Array.prototype.push.apply(fileData.parameterHints, newParameterHints);
119177

120-
const settings: CppSettings = new CppSettings(vscode.Uri.parse(uriString));
121178
if (settings.inlayHintsAutoDeclarationTypes) {
122-
const resolvedTypeHints: vscode.InlayHint[] = this.resolveTypeHints(settings, typeHints);
179+
const resolvedTypeHints: vscode.InlayHint[] = this.resolveTypeHints(settings, newTypeHints);
123180
Array.prototype.push.apply(fileData.inlayHints, resolvedTypeHints);
124181
}
125182
if (settings.inlayHintsParameterNames || settings.inlayHintsReferenceOperator) {
126-
const resolvedParameterHints: vscode.InlayHint[] = this.resolveParameterHints(settings, paramHints);
183+
const resolvedParameterHints: vscode.InlayHint[] = this.resolveParameterHints(settings, newParameterHints);
127184
Array.prototype.push.apply(fileData.inlayHints, resolvedParameterHints);
128185
}
129186

Extension/src/LanguageServer/client.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,6 +1628,24 @@ export class DefaultClient implements Client {
16281628
}
16291629
}
16301630

1631+
// If an inlay hints setting has changed, force an inlay provider update on the visible documents.
1632+
if (["inlayHints.autoDeclarationTypes.enabled",
1633+
"inlayHints.autoDeclarationTypes.showOnLeft",
1634+
"inlayHints.parameterNames.enabled",
1635+
"inlayHints.parameterNames.hideLeadingUnderscores",
1636+
"inlayHints.parameterNames.suppressWhenArgumentContainsName",
1637+
"inlayHints.referenceOperator.enabled",
1638+
"inlayHints.referenceOperator.showSpace"].some(setting => setting in changedSettings)) {
1639+
vscode.window.visibleTextEditors.forEach((visibleEditor: vscode.TextEditor) => {
1640+
// The exact range doesn't matter.
1641+
const visibleRange: vscode.Range | undefined = visibleEditor.visibleRanges.at(0);
1642+
if (visibleRange !== undefined) {
1643+
void vscode.commands.executeCommand<vscode.InlayHint[]>('vscode.executeInlayHintProvider',
1644+
visibleEditor.document.uri, visibleRange);
1645+
}
1646+
});
1647+
}
1648+
16311649
const showButtonSender: string = "settingsChanged";
16321650
if (changedSettings["default.configurationProvider"] !== undefined) {
16331651
void ui.ShowConfigureIntelliSenseButton(false, this, ConfigurationType.ConfigProvider, showButtonSender);
@@ -2309,21 +2327,21 @@ export class DefaultClient implements Client {
23092327
this.languageClient.onNotification(CanceledReferencesNotification, this.serverCanceledReferences);
23102328
}
23112329

2312-
private handleIntelliSenseResult(intelliseSenseResult: IntelliSenseResult): void {
2313-
const fileVersion: number | undefined = openFileVersions.get(intelliseSenseResult.uri);
2314-
if (fileVersion !== undefined && fileVersion !== intelliseSenseResult.fileVersion) {
2330+
private handleIntelliSenseResult(intelliSenseResult: IntelliSenseResult): void {
2331+
const fileVersion: number | undefined = openFileVersions.get(intelliSenseResult.uri);
2332+
if (fileVersion !== undefined && fileVersion !== intelliSenseResult.fileVersion) {
23152333
return;
23162334
}
23172335

23182336
if (this.semanticTokensProvider) {
2319-
this.semanticTokensProvider.deliverTokens(intelliseSenseResult.uri, intelliseSenseResult.semanticTokens, intelliseSenseResult.clearExistingSemanticTokens);
2337+
this.semanticTokensProvider.deliverTokens(intelliSenseResult.uri, intelliSenseResult.semanticTokens, intelliSenseResult.clearExistingSemanticTokens);
23202338
}
23212339
if (this.inlayHintsProvider) {
2322-
this.inlayHintsProvider.deliverInlayHints(intelliseSenseResult.uri, intelliseSenseResult.inlayHints, intelliseSenseResult.clearExistingInlayHint);
2340+
this.inlayHintsProvider.deliverInlayHints(intelliSenseResult.uri, intelliSenseResult.inlayHints, intelliSenseResult.clearExistingInlayHint);
23232341
}
23242342

2325-
this.updateInactiveRegions(intelliseSenseResult.uri, intelliseSenseResult.inactiveRegions, intelliseSenseResult.clearExistingInactiveRegions, intelliseSenseResult.isCompletePass);
2326-
this.updateSquiggles(intelliseSenseResult.uri, intelliseSenseResult.diagnostics, intelliseSenseResult.clearExistingDiagnostics);
2343+
this.updateInactiveRegions(intelliSenseResult.uri, intelliSenseResult.inactiveRegions, intelliSenseResult.clearExistingInactiveRegions, intelliSenseResult.isCompletePass);
2344+
this.updateSquiggles(intelliSenseResult.uri, intelliSenseResult.diagnostics, intelliSenseResult.clearExistingDiagnostics);
23272345
}
23282346

23292347
private updateSquiggles(uriString: string, diagnostics: IntelliSenseDiagnostic[], startNewSet: boolean): void {

0 commit comments

Comments
 (0)