Skip to content

Commit 62e0994

Browse files
authored
Merge pull request #11241 from microsoft/main
2 parents c9b0db0 + 9ce7b5a commit 62e0994

File tree

4 files changed

+42
-20
lines changed

4 files changed

+42
-20
lines changed

Extension/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
* Address various issues with support for gcc 13. [#11038](https://github.com/microsoft/vscode-cpptools/issues/11038)
1313
* Fix `#include` completion leaving an extra `>`. [#11042](https://github.com/microsoft/vscode-cpptools/issues/11042)
1414
* Fix an issue with matching of glob patterns containing path delimiters. [#11132](https://github.com/microsoft/vscode-cpptools/issues/11132)
15+
* Fix Create Declaration/Definition via `Quick Fix…` from hover tooltip. [#11157](https://github.com/microsoft/vscode-cpptools/issues/11157)
1516
* Fix issues with compiler querying of clang-cl. [#11207](https://github.com/microsoft/vscode-cpptools/issues/11207)
17+
* Fix `files.encoding` setting on startup. [#11210](https://github.com/microsoft/vscode-cpptools/issues/11210)
1618
* Fix a crash related to directories with a very large number of files. [#11226](https://github.com/microsoft/vscode-cpptools/issues/11226)
1719
* Fix Rank > 1 Display Strings for Natvis. [PR MIEngine#1406](https://github.com/microsoft/MIEngine/pull/1406)
1820
* Fix some crashes identified by crash telemetry.

Extension/src/LanguageServer/Providers/codeActionProvider.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { DefaultClient } from '../client';
88
import {
99
CodeActionCodeInfo, CodeActionDiagnosticInfo, codeAnalysisAllFixes, codeAnalysisCodeToFixes, codeAnalysisFileToCodeActions
1010
} from '../codeAnalysis';
11-
import { getLocalizedString, LocalizeStringParams } from '../localization';
11+
import { LocalizeStringParams, getLocalizedString } from '../localization';
1212
import { CppSettings } from '../settings';
1313
import { makeVscodeRange } from '../utils';
1414

@@ -23,12 +23,18 @@ interface CodeActionCommand {
2323
arguments?: any[];
2424
edit?: TextEdit;
2525
uri?: string;
26+
range?: Range;
2627
}
2728

2829
interface GetCodeActionsResult {
2930
commands: CodeActionCommand[];
3031
}
3132

33+
export interface CreateDeclDefnCommandArguments {
34+
sender: string;
35+
range: Range;
36+
}
37+
3238
export const GetCodeActionsRequest: RequestType<GetCodeActionsRequestParams, GetCodeActionsResult, void> =
3339
new RequestType<GetCodeActionsRequestParams, GetCodeActionsResult, void>('cpptools/getCodeActions');
3440

@@ -180,8 +186,14 @@ export class CodeActionProvider implements vscode.CodeActionProvider {
180186
resultCodeActions.push(...disableCodeActions);
181187
resultCodeActions.push(...docCodeActions);
182188
return;
183-
} else if (command.command === 'C_Cpp.CreateDeclarationOrDefinition' && (command.arguments ?? []).length === 0) {
184-
command.arguments = ['codeAction']; // We report the sender of the command
189+
} else if ((command.command === 'C_Cpp.CreateDeclarationOrDefinition' || command.command === 'C_Cpp.CopyDeclarationOrDefinition')
190+
&& (command.arguments ?? []).length === 0 && command.range !== undefined) {
191+
const args: CreateDeclDefnCommandArguments = {
192+
sender: 'codeAction',
193+
range: command.range
194+
};
195+
command.arguments = [];
196+
command.arguments.push(args);
185197
} else if (command.command === "C_Cpp.SelectIntelliSenseConfiguration") {
186198
command.arguments = ['codeAction'];
187199
hasSelectIntelliSenseConfiguration = true;

Extension/src/LanguageServer/client.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -795,7 +795,7 @@ export interface Client {
795795
handleRemoveCodeAnalysisProblems(refreshSquigglesOnSave: boolean, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void>;
796796
handleFixCodeAnalysisProblems(workspaceEdit: vscode.WorkspaceEdit, refreshSquigglesOnSave: boolean, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void>;
797797
handleDisableAllTypeCodeAnalysisProblems(code: string, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void>;
798-
handleCreateDeclarationOrDefinition(copy?: boolean): Promise<void>;
798+
handleCreateDeclarationOrDefinition(isCopyToClipboard: boolean, codeActionRange?: Range): Promise<void>;
799799
onInterval(): void;
800800
dispose(): void;
801801
addFileAssociations(fileAssociations: string, languageId: string): void;
@@ -1856,9 +1856,11 @@ export class DefaultClient implements Client {
18561856
if (!currentProvider.isReady) {
18571857
return;
18581858
}
1859+
18591860
await Promise.all([
18601861
this.clearCustomConfigurations(),
1861-
this.handleRemoveAllCodeAnalysisProblems(),
1862+
this.handleRemoveAllCodeAnalysisProblems()]);
1863+
await Promise.all([
18621864
...[...this.trackedDocuments].map(document => this.provideCustomConfiguration(document.uri, undefined, true))
18631865
]);
18641866
}
@@ -1924,7 +1926,7 @@ export class DefaultClient implements Client {
19241926
hasCompleted = true;
19251927
this.sendCustomBrowseConfiguration(null, undefined, Version.v0, true);
19261928
if (currentProvider.version >= Version.v2) {
1927-
console.warn("Configuration Provider timed out in {0}ms.", configProviderTimeout);
1929+
console.warn(`Configuration Provider timed out in ${configProviderTimeout}ms.`);
19281930
void this.resumeParsing().catch(logAndReturn.undefined);
19291931
}
19301932
}
@@ -3500,20 +3502,25 @@ export class DefaultClient implements Client {
35003502
return this.handleRemoveCodeAnalysisProblems(false, identifiersAndUris);
35013503
}
35023504

3503-
public async handleCreateDeclarationOrDefinition(copy?: boolean): Promise<void> {
3505+
public async handleCreateDeclarationOrDefinition(isCopyToClipboard: boolean, codeActionRange?: Range): Promise<void> {
35043506
let range: vscode.Range | undefined;
35053507
let uri: vscode.Uri | undefined;
35063508

3507-
// range is based on the cursor position.
35083509
const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
35093510
if (editor) {
35103511
uri = editor.document.uri;
3511-
if (editor.selection.isEmpty) {
3512-
range = new vscode.Range(editor.selection.active, editor.selection.active);
3513-
} else if (editor.selection.isReversed) {
3514-
range = new vscode.Range(editor.selection.active, editor.selection.anchor);
3512+
if (codeActionRange !== undefined) {
3513+
// Request is from a code action command which provides range from code actions args.
3514+
range = makeVscodeRange(codeActionRange);
35153515
} else {
3516-
range = new vscode.Range(editor.selection.anchor, editor.selection.active);
3516+
// Request is from context menu or command palette. Use range from cursor position.
3517+
if (editor.selection.isEmpty) {
3518+
range = new vscode.Range(editor.selection.active, editor.selection.active);
3519+
} else if (editor.selection.isReversed) {
3520+
range = new vscode.Range(editor.selection.active, editor.selection.anchor);
3521+
} else {
3522+
range = new vscode.Range(editor.selection.anchor, editor.selection.active);
3523+
}
35173524
}
35183525
}
35193526

@@ -3533,7 +3540,7 @@ export class DefaultClient implements Client {
35333540
line: range.end.line
35343541
}
35353542
},
3536-
copyToClipboard: copy ?? false
3543+
copyToClipboard: isCopyToClipboard
35373544
};
35383545

35393546
const result: CreateDeclarationOrDefinitionResult = await this.languageClient.sendRequest(CreateDeclarationOrDefinitionRequest, params);
@@ -3823,7 +3830,7 @@ class NullClient implements Client {
38233830
handleRemoveCodeAnalysisProblems(refreshSquigglesOnSave: boolean, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void> { return Promise.resolve(); }
38243831
handleFixCodeAnalysisProblems(workspaceEdit: vscode.WorkspaceEdit, refreshSquigglesOnSave: boolean, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void> { return Promise.resolve(); }
38253832
handleDisableAllTypeCodeAnalysisProblems(code: string, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void> { return Promise.resolve(); }
3826-
handleCreateDeclarationOrDefinition(copy?: boolean): Promise<void> { return Promise.resolve(); }
3833+
handleCreateDeclarationOrDefinition(isCopyToClipboard: boolean, codeActionRange?: Range): Promise<void> { return Promise.resolve(); }
38273834
onInterval(): void { }
38283835
dispose(): void {
38293836
this.booleanEvent.dispose();

Extension/src/LanguageServer/extension.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -689,20 +689,22 @@ async function onDisableAllTypeCodeAnalysisProblems(code: string, identifiersAnd
689689
return getActiveClient().handleDisableAllTypeCodeAnalysisProblems(code, identifiersAndUris);
690690
}
691691

692-
async function onCopyDeclarationOrDefinition(sender?: any): Promise<void> {
692+
async function onCopyDeclarationOrDefinition(args?: any): Promise<void> {
693+
const sender: any | undefined = util.isString(args?.sender) ? args.sender : args;
693694
const properties: { [key: string]: string } = {
694695
sender: util.getSenderType(sender)
695696
};
696697
telemetry.logLanguageServerEvent('CopyDeclDefn', properties);
697-
return getActiveClient().handleCreateDeclarationOrDefinition(true);
698+
return getActiveClient().handleCreateDeclarationOrDefinition(true, args?.range);
698699
}
699700

700-
async function onCreateDeclarationOrDefinition(sender?: any): Promise<void> {
701+
async function onCreateDeclarationOrDefinition(args?: any): Promise<void> {
702+
const sender: any | undefined = util.isString(args?.sender) ? args.sender : args;
701703
const properties: { [key: string]: string } = {
702704
sender: util.getSenderType(sender)
703705
};
704706
telemetry.logLanguageServerEvent('CreateDeclDefn', properties);
705-
return getActiveClient().handleCreateDeclarationOrDefinition();
707+
return getActiveClient().handleCreateDeclarationOrDefinition(false, args?.range);
706708
}
707709

708710
function onAddToIncludePath(path: string): void {
@@ -711,7 +713,6 @@ function onAddToIncludePath(path: string): void {
711713
// suggestion to a different workspace.
712714
return clients.ActiveClient.handleAddToIncludePathCommand(path);
713715
}
714-
715716
}
716717

717718
function onEnableSquiggles(): void {

0 commit comments

Comments
 (0)