Skip to content

Commit 460aee5

Browse files
'Create Declaration / Definition' command via 'Quick Fix...' hover (#11239)
1 parent 0e309a7 commit 460aee5

File tree

3 files changed

+36
-18
lines changed

3 files changed

+36
-18
lines changed

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: 15 additions & 10 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;
@@ -3502,20 +3502,25 @@ export class DefaultClient implements Client {
35023502
return this.handleRemoveCodeAnalysisProblems(false, identifiersAndUris);
35033503
}
35043504

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

3509-
// range is based on the cursor position.
35103509
const editor: vscode.TextEditor | undefined = vscode.window.activeTextEditor;
35113510
if (editor) {
35123511
uri = editor.document.uri;
3513-
if (editor.selection.isEmpty) {
3514-
range = new vscode.Range(editor.selection.active, editor.selection.active);
3515-
} else if (editor.selection.isReversed) {
3516-
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);
35173515
} else {
3518-
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+
}
35193524
}
35203525
}
35213526

@@ -3535,7 +3540,7 @@ export class DefaultClient implements Client {
35353540
line: range.end.line
35363541
}
35373542
},
3538-
copyToClipboard: copy ?? false
3543+
copyToClipboard: isCopyToClipboard
35393544
};
35403545

35413546
const result: CreateDeclarationOrDefinitionResult = await this.languageClient.sendRequest(CreateDeclarationOrDefinitionRequest, params);
@@ -3825,7 +3830,7 @@ class NullClient implements Client {
38253830
handleRemoveCodeAnalysisProblems(refreshSquigglesOnSave: boolean, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void> { return Promise.resolve(); }
38263831
handleFixCodeAnalysisProblems(workspaceEdit: vscode.WorkspaceEdit, refreshSquigglesOnSave: boolean, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void> { return Promise.resolve(); }
38273832
handleDisableAllTypeCodeAnalysisProblems(code: string, identifiersAndUris: CodeAnalysisDiagnosticIdentifiersAndUri[]): Promise<void> { return Promise.resolve(); }
3828-
handleCreateDeclarationOrDefinition(copy?: boolean): Promise<void> { return Promise.resolve(); }
3833+
handleCreateDeclarationOrDefinition(isCopyToClipboard: boolean, codeActionRange?: Range): Promise<void> { return Promise.resolve(); }
38293834
onInterval(): void { }
38303835
dispose(): void {
38313836
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)