Skip to content

Commit 7ac9a33

Browse files
testforstephenfbricon
authored andcommitted
Enable Source Action 'Override/Implement Methods' with prompt (#749)
Signed-off-by: Jinbo Wang <[email protected]>
1 parent 4d27859 commit 7ac9a33

File tree

5 files changed

+92
-3
lines changed

5 files changed

+92
-3
lines changed

src/commands.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,8 @@ export namespace Commands {
102102
* List all recognized source roots in the workspace.
103103
*/
104104
export const LIST_SOURCEPATHS = 'java.project.listSourcePaths';
105+
/**
106+
* Override or implements the methods from the supertypes.
107+
*/
108+
export const OVERRIDE_METHODS_PROMPT = 'java.action.overrideMethodsPrompt';
105109
}

src/extension.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { StatusNotification, ClassFileContentsRequest, ProjectConfigurationUpdat
1313
SourceAttachmentRequest, SourceAttachmentResult, SourceAttachmentAttribute } from './protocol';
1414
import { ExtensionAPI } from './extension.api';
1515
import * as buildpath from './buildpath';
16+
import * as sourceAction from './sourceAction';
1617
import * as net from 'net';
1718
import { getJavaConfiguration } from './utils';
1819
import { onConfigurationChange, excludeProjectSettingsFiles } from './settings';
@@ -72,7 +73,8 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
7273
settings: { java: getJavaConfiguration() },
7374
extendedClientCapabilities:{
7475
progressReportProvider: getJavaConfiguration().get('progressReports.enabled'),
75-
classFileContentsSupport:true
76+
classFileContentsSupport:true,
77+
overrideMethodsPromptSupport:true
7678
},
7779
triggerFiles: getTriggerFiles()
7880
},
@@ -286,6 +288,7 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
286288
});
287289

288290
buildpath.registerCommands();
291+
sourceAction.registerCommands(languageClient);
289292

290293
window.onDidChangeActiveTextEditor((editor) => {
291294
toggleItem(editor, item);
@@ -623,7 +626,7 @@ async function addFormatter(extensionPath, formatterUrl, defaultFormatter, relat
623626
});
624627
}
625628

626-
async function applyWorkspaceEdit(obj, languageClient) {
629+
export async function applyWorkspaceEdit(obj, languageClient) {
627630
let edit = languageClient.protocol2CodeConverter.asWorkspaceEdit(obj);
628631
if (edit) {
629632
await workspace.applyEdit(edit);

src/protocol.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
import { RequestType, NotificationType, TextDocumentIdentifier, ExecuteCommandParams } from 'vscode-languageclient';
3+
import { RequestType, NotificationType, TextDocumentIdentifier, ExecuteCommandParams, CodeActionParams, WorkspaceEdit } from 'vscode-languageclient';
44
import { Command } from 'vscode';
55

66
/**
@@ -120,4 +120,31 @@ export interface SourceAttachmentAttribute {
120120
sourceAttachmentPath?: string;
121121
sourceAttachmentEncoding?: string;
122122
canEditEncoding?: boolean;
123+
}
124+
125+
export interface OverridableMethod {
126+
key: string;
127+
name: string;
128+
parameters: string[];
129+
unimplemented: boolean;
130+
declaringClass: string;
131+
declaringClassType: string;
132+
}
133+
134+
export interface OverridableMethodsResponse {
135+
type: string;
136+
methods: OverridableMethod[];
137+
}
138+
139+
export namespace ListOverridableMethodsRequest {
140+
export const type = new RequestType<CodeActionParams, OverridableMethodsResponse, void, void>('java/listOverridableMethods');
141+
}
142+
143+
export interface AddOverridableMethodParams {
144+
context: CodeActionParams;
145+
overridableMethods: OverridableMethod[];
146+
}
147+
148+
export namespace AddOverridableMethodsRequest {
149+
export const type = new RequestType<AddOverridableMethodParams, WorkspaceEdit, void, void>('java/addOverridableMethods');
123150
}

src/sourceAction.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'use strict';
2+
3+
import { commands, window } from 'vscode';
4+
import { CodeActionParams, LanguageClient } from 'vscode-languageclient';
5+
import { Commands } from './commands';
6+
import { applyWorkspaceEdit } from './extension';
7+
import { ListOverridableMethodsRequest, AddOverridableMethodsRequest } from './protocol';
8+
9+
export function registerCommands(languageClient: LanguageClient) {
10+
commands.registerCommand(Commands.OVERRIDE_METHODS_PROMPT, async (params: CodeActionParams) => {
11+
const result = await languageClient.sendRequest(ListOverridableMethodsRequest.type, params);
12+
if (!result || !result.methods || !result.methods.length) {
13+
window.showWarningMessage('No overridable methods found in the super type.');
14+
return;
15+
}
16+
17+
result.methods.sort((a, b) => {
18+
const declaringClass = a.declaringClass.localeCompare(b.declaringClass);
19+
if (declaringClass !== 0) {
20+
return declaringClass;
21+
}
22+
23+
const methodName = a.name.localeCompare(b.name);
24+
if (methodName !== 0) {
25+
return methodName;
26+
}
27+
28+
return a.parameters.length - b.parameters.length;
29+
});
30+
31+
const quickPickItems = result.methods.map(method => {
32+
return {
33+
label: `${method.name}(${method.parameters.join(',')})`,
34+
description: `${method.declaringClassType}: ${method.declaringClass}`,
35+
picked: method.unimplemented,
36+
originalMethod: method,
37+
};
38+
});
39+
40+
const selectedItems = await window.showQuickPick(quickPickItems, {
41+
canPickMany: true,
42+
placeHolder: `Select methods to override or implement in ${result.type}`
43+
});
44+
if (!selectedItems.length) {
45+
return;
46+
}
47+
48+
const workspaceEdit = await languageClient.sendRequest(AddOverridableMethodsRequest.type, {
49+
context: params,
50+
overridableMethods: selectedItems.map((item) => item.originalMethod),
51+
});
52+
applyWorkspaceEdit(workspaceEdit, languageClient);
53+
});
54+
}

test/extension.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ suite('Java Language Extension', () => {
4141
Commands.ADD_TO_SOURCEPATH,
4242
Commands.REMOVE_FROM_SOURCEPATH,
4343
Commands.LIST_SOURCEPATHS,
44+
Commands.OVERRIDE_METHODS_PROMPT,
4445
];
4546
let foundJavaCommands = commands.filter(function(value){
4647
return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.');

0 commit comments

Comments
 (0)