Skip to content

Commit 51da619

Browse files
Merge pull request #11099 from microsoft/main
1.16.1 pre-release
2 parents 3eb5056 + 7544de0 commit 51da619

18 files changed

+681
-1434
lines changed

Extension/CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
# C/C++ for Visual Studio Code Changelog
22

3+
## Version 1.16.1: June 19, 2023
4+
### Enhancements
5+
* Add warning logging when the database is reset due to a version change. [#10984](https://github.com/microsoft/vscode-cpptools/issues/10984)
6+
* Move user compilers to the beginning of the "known compilers" lists. [#10985](https://github.com/microsoft/vscode-cpptools/issues/10985)
7+
* Add file path to the details of a call hierarchy result. [#10997](https://github.com/microsoft/vscode-cpptools/issues/10997)
8+
* Add `miDebuggerArgs` to debugger attach option.
9+
* Thank you for the contribution @Summon528 [PR #11066](https://github.com/microsoft/vscode-cpptools/pull/11066)
10+
11+
### Bug Fixes
12+
* Fix the "Other References" pane not getting cleared when Call Hierarchy is used. [#10988](https://github.com/microsoft/vscode-cpptools/issues/10988)
13+
* Fix some bugs if settings were empty string or null. [#10994](https://github.com/microsoft/vscode-cpptools/issues/10994)
14+
* Fix cancellation for Find All References/Rename/Call Hierarchy. [#10998](https://github.com/microsoft/vscode-cpptools/issues/10998)
15+
* Fix two Doxygen comment generation bugs. [#10995](https://github.com/microsoft/vscode-cpptools/issues/10995), [#11016](https://github.com/microsoft/vscode-cpptools/issues/11016)
16+
* Fix the thread pool sometimes not increasing in size, which could lead to the cpptools process incorrectly being shut down. [#11003](https://github.com/microsoft/vscode-cpptools/issues/11003)
17+
* Stop using vcFormat if .editorconfig exists with only non-formatting cpp settings. [PR #11015](https://github.com/microsoft/vscode-cpptools/pull/11015)
18+
* Use integratedTerminal when user is running cl.exe for debugger. [#11032](https://github.com/microsoft/vscode-cpptools/issues/11032)
19+
* Thank you for the contribution @caiohamamura [PR #11035](https://github.com/microsoft/vscode-cpptools/pull/11035)
20+
* Fix the configure your IntelliSense notification to not show again when the "Don't Show Again" option is selected. [#11070](https://github.com/microsoft/vscode-cpptools/issues/11070)
21+
322
## Version 1.16.0: May 22, 2023
423
### New Features
524
* Add Call Hierarchy. [#16](https://github.com/microsoft/vscode-cpptools/issues/16)

Extension/package.json

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "cpptools",
33
"displayName": "C/C++",
44
"description": "C/C++ IntelliSense, debugging, and code browsing.",
5-
"version": "1.16.0-main",
5+
"version": "1.16.1-main",
66
"publisher": "ms-vscode",
77
"icon": "LanguageCCPP_color_128x.png",
88
"readme": "README.md",
@@ -733,7 +733,6 @@
733733
},
734734
"C_Cpp.default.dotConfig": {
735735
"type": "string",
736-
"default": null,
737736
"markdownDescription": "%c_cpp.configuration.default.dotConfig.markdownDescription%",
738737
"scope": "resource"
739738
},
@@ -4231,6 +4230,11 @@
42314230
"description": "%c_cpp.debuggers.miDebuggerPath.description%",
42324231
"default": "/usr/bin/gdb"
42334232
},
4233+
"miDebuggerArgs": {
4234+
"type": "string",
4235+
"description": "%c_cpp.debuggers.miDebuggerArgs.description%",
4236+
"default": ""
4237+
},
42344238
"miDebuggerServerAddress": {
42354239
"type": "string",
42364240
"description": "%c_cpp.debuggers.miDebuggerServerAddress.description%",
@@ -6009,9 +6013,7 @@
60096013
"integrationTests": "tsc -p test.tsconfig.json && node ./out/test/integrationTests/languageServer/runTest.js",
60106014
"intelliSenseFeaturesTests": "tsc -p test.tsconfig.json && node ./out/test/integrationTests/IntelliSenseFeatures/runTest.js",
60116015
"import-edge-strings": "node ./import_edge_strings.js",
6012-
"download-api": "vscode-dts dev",
6013-
"postdownload-api": "vscode-dts master",
6014-
"postinstall": "npm run download-api"
6016+
"postinstall": "npx vscode-dts dev && npx vscode-dts main"
60156017
},
60166018
"devDependencies": {
60176019
"@octokit/rest": "^18.12.0",
@@ -6030,6 +6032,7 @@
60306032
"@typescript-eslint/eslint-plugin-tslint": "^4.31.1",
60316033
"@typescript-eslint/parser": "^4.31.1",
60326034
"@vscode/test-electron": "^1.6.1",
6035+
"@vscode/dts": "^0.4.0",
60336036
"async-child-process": "^1.1.1",
60346037
"await-notify": "^1.0.1",
60356038
"eslint": "^7.32.0",
@@ -6054,7 +6057,6 @@
60546057
"typescript": "^4.4.3",
60556058
"vscode-debugadapter": "^1.35.0",
60566059
"vscode-debugprotocol": "^1.35.0",
6057-
"vscode-dts": "^0.3.2",
60586060
"vscode-nls-dev": "^4.0.0-next.1",
60596061
"webpack": "^5.76.0",
60606062
"webpack-cli": "^5.0.1",
@@ -6104,4 +6106,4 @@
61046106
"yargs-parser": "^15.0.1",
61056107
"y18n": "^5.0.5"
61066108
}
6107-
}
6109+
}

Extension/src/Debugger/configurationProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ export class DebugConfigurationProvider implements vscode.DebugConfigurationProv
434434
if (newConfig.type === DebuggerType.cppdbg) {
435435
newConfig.externalConsole = false;
436436
} else {
437-
newConfig.console = "externalTerminal";
437+
newConfig.console = "integratedTerminal";
438438
}
439439
const isWindows: boolean = platformInfo.platform === 'win32';
440440
// Extract the .exe path from the defined task.

Extension/src/LanguageServer/Providers/callHierarchyProvider.ts

Lines changed: 88 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
* See 'LICENSE' in the project root for license information.
44
* ------------------------------------------------------------------------------------------ */
55
import * as vscode from 'vscode';
6+
import * as path from 'path';
67
import * as Telemetry from '../../telemetry';
7-
import { DefaultClient, CancelReferencesNotification, workspaceReferences } from '../client';
8+
import { DefaultClient, workspaceReferences } from '../client';
89
import { processDelayedDidOpen } from '../extension';
9-
import { CallHierarchyResultCallback } from '../references';
10+
import { CancellationSender } from '../references';
1011
import { Position, Range, RequestType, TextDocumentIdentifier } from 'vscode-languageclient';
1112
import { makeVscodeRange } from '../utils';
1213

@@ -53,7 +54,7 @@ interface CallHierarchyItemResult {
5354

5455
/**
5556
* If a request is cancelled, `succeeded` will be undefined to indicate no result was returned.
56-
* Therfore, object is not defined as optional on the language server.
57+
* Therefore, object is not defined as optional on the language server.
5758
*/
5859
succeeded: boolean;
5960
}
@@ -76,44 +77,68 @@ export interface CallHierarchyCallsItemResult {
7677
calls: CallHierarchyCallsItem[];
7778
}
7879

79-
export enum CallHierarchyRequestStatus {
80+
enum CallHierarchyRequestStatus {
8081
Unknown,
8182
Succeeded,
8283
Canceled,
83-
CaneledByUser,
84+
CanceledByUser,
8485
Failed
8586
}
8687

8788
const CallHierarchyItemRequest: RequestType<CallHierarchyParams, CallHierarchyItemResult, void> =
8889
new RequestType<CallHierarchyParams, CallHierarchyItemResult, void>('cpptools/prepareCallHierarchy');
8990

91+
const CallHierarchyCallsToRequest: RequestType<CallHierarchyParams, CallHierarchyCallsItemResult, void> =
92+
new RequestType<CallHierarchyParams, CallHierarchyCallsItemResult, void>('cpptools/callHierarchyCallsTo');
93+
9094
const CallHierarchyCallsFromRequest: RequestType<CallHierarchyParams, CallHierarchyCallsItemResult, void> =
9195
new RequestType<CallHierarchyParams, CallHierarchyCallsItemResult, void>('cpptools/callHierarchyCallsFrom');
9296

9397
export class CallHierarchyProvider implements vscode.CallHierarchyProvider {
9498
// Indicates whether a request is from an entry root node (e.g. top function in the call tree).
9599
private isEntryRootNodeTelemetry: boolean = false;
96100
private client: DefaultClient;
101+
97102
constructor(client: DefaultClient) {
98103
this.client = client;
99104
}
100105

101106
public async prepareCallHierarchy(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken):
102107
Promise<vscode.CallHierarchyItem | undefined> {
108+
await this.client.requestWhenReady(() => processDelayedDidOpen(document));
109+
workspaceReferences.cancelCurrentReferenceRequest(CancellationSender.NewRequest);
110+
workspaceReferences.clearViews();
111+
103112
const range: vscode.Range | undefined = document.getWordRangeAtPosition(position);
104113
if (range === undefined) {
105114
return undefined;
106115
}
107116

108-
await this.client.requestWhenReady(() => processDelayedDidOpen(document));
117+
// Listen to a cancellation for this request. When this request is cancelled,
118+
// use a local cancellation source to explicitly cancel a token.
119+
const cancelSource: vscode.CancellationTokenSource = new vscode.CancellationTokenSource();
120+
const cancellationTokenListener: vscode.Disposable = token.onCancellationRequested(() => {
121+
cancelSource.cancel();
122+
});
123+
const requestCanceledListener: vscode.Disposable = workspaceReferences.onCancellationRequested(sender => {
124+
cancelSource.cancel();
125+
});
109126

110127
const params: CallHierarchyParams = {
111128
textDocument: { uri: document.uri.toString() },
112129
position: Position.create(position.line, position.character)
113130
};
114-
const response: CallHierarchyItemResult = await this.client.languageClient.sendRequest(CallHierarchyItemRequest, params, token);
115-
if (token.isCancellationRequested || response.succeeded === undefined) {
116-
throw new vscode.CancellationError();
131+
const response: CallHierarchyItemResult = await this.client.languageClient.sendRequest(CallHierarchyItemRequest, params, cancelSource.token);
132+
133+
cancellationTokenListener.dispose();
134+
requestCanceledListener.dispose();
135+
136+
if (cancelSource.token.isCancellationRequested || response.succeeded === undefined) {
137+
// Return undefined instead of vscode.CancellationError to avoid the following error message from VS Code:
138+
// "MISSING provider."
139+
// TODO: per issue https://github.com/microsoft/vscode/issues/169698 vscode.CancellationError is expected,
140+
// so when VS Code fixes the error use vscode.CancellationError again.
141+
return undefined;
117142
} else if (response.item === undefined) {
118143
return undefined;
119144
}
@@ -123,76 +148,56 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider {
123148
}
124149

125150
public async provideCallHierarchyIncomingCalls(item: vscode.CallHierarchyItem, token: vscode.CancellationToken):
126-
Promise<vscode.CallHierarchyIncomingCall[] | undefined | any> {
127-
return new Promise<vscode.CallHierarchyIncomingCall[] | undefined | any>((resolve, reject) => {
128-
const CallHierarchyCallsToEvent: string = "CallHierarchyCallsTo";
129-
if (item === undefined) {
130-
this.logTelemetry(CallHierarchyCallsToEvent, CallHierarchyRequestStatus.Failed);
131-
resolve(undefined);
132-
return;
133-
}
134-
135-
const callback: () => Promise<void> = async () => {
136-
await this.client.awaitUntilLanguageClientReady();
137-
const params: CallHierarchyParams = {
138-
textDocument: { uri: item.uri.toString() },
139-
position: Position.create(item.range.start.line, item.range.start.character)
140-
};
141-
DefaultClient.referencesParams = params;
142-
// The current request is represented by referencesParams. If a request detects
143-
// referencesParams does not match the object used when creating the request, abort it.
144-
if (params !== DefaultClient.referencesParams) {
145-
// Complete with nothing instead of rejecting, to avoid an error message from VS Code
146-
resolve(undefined);
147-
}
148-
DefaultClient.referencesRequestPending = true;
149-
150-
// Register a single-fire handler for the reply.
151-
const resultCallback: CallHierarchyResultCallback =
152-
(result: CallHierarchyCallsItemResult | null, canceledByUser: boolean, progressBarDuration?: number) => {
153-
DefaultClient.referencesRequestPending = false;
154-
if (result === null || result?.calls === undefined) {
155-
const requestStatus: CallHierarchyRequestStatus = canceledByUser ? CallHierarchyRequestStatus.CaneledByUser : CallHierarchyRequestStatus.Canceled;
156-
this.logTelemetry(CallHierarchyCallsToEvent, requestStatus, progressBarDuration);
157-
reject(new vscode.CancellationError());
158-
} else {
159-
this.logTelemetry(CallHierarchyCallsToEvent, CallHierarchyRequestStatus.Succeeded, progressBarDuration);
160-
if (result?.calls.length === 0) {
161-
resolve(undefined);
162-
} else {
163-
resolve(this.createIncomingCalls(result.calls));
164-
}
165-
}
166-
167-
this.client.clearPendingReferencesCancellations();
168-
};
169-
170-
workspaceReferences.setCallHierarchyResultsCallback(resultCallback);
171-
workspaceReferences.startCallHierarchyIncomingCalls(params);
172-
173-
token.onCancellationRequested(e => {
174-
if (params === DefaultClient.referencesParams) {
175-
this.client.cancelReferences();
176-
}
177-
});
178-
};
179-
180-
if (DefaultClient.referencesRequestPending || workspaceReferences.symbolSearchInProgress) {
181-
const cancelling: boolean = DefaultClient.referencesPendingCancellations.length > 0;
182-
DefaultClient.referencesPendingCancellations.push({
183-
reject: () => {
184-
// Complete with nothing instead of rejecting, to avoid an error message from VS Code
185-
resolve(undefined);
186-
}, callback
187-
});
188-
if (!cancelling) {
189-
workspaceReferences.referencesCanceled = true;
190-
this.client.languageClient.sendNotification(CancelReferencesNotification);
191-
}
192-
} else {
193-
callback();
194-
}
151+
Promise<vscode.CallHierarchyIncomingCall[] | undefined> {
152+
await this.client.awaitUntilLanguageClientReady();
153+
workspaceReferences.cancelCurrentReferenceRequest(CancellationSender.NewRequest);
154+
155+
const CallHierarchyCallsToEvent: string = "CallHierarchyCallsTo";
156+
if (item === undefined) {
157+
this.logTelemetry(CallHierarchyCallsToEvent, CallHierarchyRequestStatus.Failed);
158+
return undefined;
159+
}
160+
161+
// Listen to a cancellation for this request. When this request is cancelled,
162+
// use a local cancellation source to explicitly cancel a token.
163+
let requestCanceled: CancellationSender | undefined;
164+
const cancelSource: vscode.CancellationTokenSource = new vscode.CancellationTokenSource();
165+
const cancellationTokenListener: vscode.Disposable = token.onCancellationRequested(() => {
166+
requestCanceled = CancellationSender.ProviderToken;
167+
cancelSource.cancel();
195168
});
169+
const requestCanceledListener: vscode.Disposable = workspaceReferences.onCancellationRequested(sender => {
170+
requestCanceled = sender;
171+
cancelSource.cancel();
172+
});
173+
174+
// Send the request to the language server.
175+
let result: vscode.CallHierarchyIncomingCall[] | undefined;
176+
const params: CallHierarchyParams = {
177+
textDocument: { uri: item.uri.toString() },
178+
position: Position.create(item.range.start.line, item.range.start.character)
179+
};
180+
const response: CallHierarchyCallsItemResult = await this.client.languageClient.sendRequest(CallHierarchyCallsToRequest, params, cancelSource.token);
181+
182+
// Reset anything that can be cleared before processing the result.
183+
const progressBarDuration: number | undefined = workspaceReferences.getCallHierarchyProgressBarDuration();
184+
workspaceReferences.resetProgressBar();
185+
workspaceReferences.resetReferences();
186+
cancellationTokenListener.dispose();
187+
requestCanceledListener.dispose();
188+
189+
// Process the result.
190+
if (cancelSource.token.isCancellationRequested || response.calls === undefined || requestCanceled !== undefined) {
191+
const requestStatus: CallHierarchyRequestStatus = requestCanceled === CancellationSender.User ?
192+
CallHierarchyRequestStatus.CanceledByUser : CallHierarchyRequestStatus.Canceled;
193+
this.logTelemetry(CallHierarchyCallsToEvent, requestStatus, progressBarDuration);
194+
throw new vscode.CancellationError();
195+
} else if (response.calls.length !== 0) {
196+
result = this.createIncomingCalls(response.calls);
197+
}
198+
199+
this.logTelemetry(CallHierarchyCallsToEvent, CallHierarchyRequestStatus.Succeeded, progressBarDuration);
200+
return result;
196201
}
197202

198203
public async provideCallHierarchyOutgoingCalls(item: vscode.CallHierarchyItem, token: vscode.CancellationToken):
@@ -210,8 +215,8 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider {
210215
textDocument: { uri: item.uri.toString() },
211216
position: Position.create(item.range.start.line, item.range.start.character)
212217
};
213-
214218
const response: CallHierarchyCallsItemResult = await this.client.languageClient.sendRequest(CallHierarchyCallsFromRequest, params, token);
219+
215220
if (token.isCancellationRequested || response.calls === undefined) {
216221
this.logTelemetry(CallHierarchyCallsFromEvent, CallHierarchyRequestStatus.Canceled);
217222
throw new vscode.CancellationError();
@@ -224,8 +229,10 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider {
224229
}
225230

226231
private makeVscodeCallHierarchyItem(item: CallHierarchyItem): vscode.CallHierarchyItem {
232+
const containerDetail: string = (item.detail !== "") ? `${item.detail} - ` : "";
233+
const fileDetail: string = `${path.basename(item.uri)} (${path.dirname(item.uri)})`;
227234
return new vscode.CallHierarchyItem(
228-
item.kind, item.name, item.detail,
235+
item.kind, item.name, containerDetail + fileDetail,
229236
vscode.Uri.file(item.uri),
230237
makeVscodeRange(item.range),
231238
makeVscodeRange(item.selectionRange));
@@ -276,7 +283,7 @@ export class CallHierarchyProvider implements vscode.CallHierarchyProvider {
276283
case CallHierarchyRequestStatus.Unknown: status = "Unknown"; break;
277284
case CallHierarchyRequestStatus.Succeeded: status = "Succeeded"; break;
278285
case CallHierarchyRequestStatus.Canceled: status = "Canceled"; break;
279-
case CallHierarchyRequestStatus.CaneledByUser: status = "CaneledByUser"; break;
286+
case CallHierarchyRequestStatus.CanceledByUser: status = "CanceledByUser"; break;
280287
case CallHierarchyRequestStatus.Failed: status = "Failed"; break;
281288
}
282289

0 commit comments

Comments
 (0)