Skip to content

Commit 6686996

Browse files
testforstephenfbricon
authored andcommitted
Enable advanced "Generate getters and setters..." source action
Signed-off-by: Jinbo Wang <[email protected]>
1 parent cf34bd3 commit 6686996

File tree

5 files changed

+67
-3
lines changed

5 files changed

+67
-3
lines changed

src/commands.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,4 +126,8 @@ export namespace Commands {
126126
* Generate toString().
127127
*/
128128
export const GENERATE_TOSTRING_PROMPT = 'java.action.generateToStringPrompt';
129+
/**
130+
* Generate Getters and Setters.
131+
*/
132+
export const GENERATE_ACCESSORS_PROMPT = 'java.action.generateAccessorsPrompt';
129133
}

src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ export function activate(context: ExtensionContext): Promise<ExtensionAPI> {
6868
overrideMethodsPromptSupport: true,
6969
hashCodeEqualsPromptSupport: true,
7070
advancedOrganizeImportsSupport: true,
71-
generateToStringPromptSupport: true
71+
generateToStringPromptSupport: true,
72+
advancedGenerateAccessorsSupport: true,
7273
},
7374
triggerFiles: getTriggerFiles()
7475
},

src/protocol.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,23 @@ export interface GenerateToStringParams {
206206
export namespace GenerateToStringRequest {
207207
export const type = new RequestType<GenerateToStringParams, WorkspaceEdit, void, void>('java/generateToString');
208208
}
209+
210+
export interface AccessorField {
211+
fieldName: string;
212+
isStatic: boolean;
213+
generateGetter: boolean;
214+
generateSetter: boolean;
215+
}
216+
217+
export namespace ResolveUnimplementedAccessorsRequest {
218+
export const type = new RequestType<CodeActionParams, AccessorField[], void, void>('java/resolveUnimplementedAccessors');
219+
}
220+
221+
export interface GenerateAccessorsParams {
222+
context: CodeActionParams;
223+
accessors: AccessorField[];
224+
}
225+
226+
export namespace GenerateAccessorsRequest {
227+
export const type = new RequestType<GenerateAccessorsParams, WorkspaceEdit, void, void>('java/generateAccessors');
228+
}

src/sourceAction.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ import { CodeActionParams, LanguageClient } from 'vscode-languageclient';
55
import { Commands } from './commands';
66
import { applyWorkspaceEdit } from './extension';
77
import { ListOverridableMethodsRequest, AddOverridableMethodsRequest, CheckHashCodeEqualsStatusRequest, GenerateHashCodeEqualsRequest,
8-
OrganizeImportsRequest, ImportCandidate, ImportSelection, GenerateToStringRequest, CheckToStringStatusRequest, VariableField } from './protocol';
8+
OrganizeImportsRequest, ImportCandidate, ImportSelection, GenerateToStringRequest, CheckToStringStatusRequest, VariableField, ResolveUnimplementedAccessorsRequest, GenerateAccessorsRequest } from './protocol';
99

1010
export function registerCommands(languageClient: LanguageClient, context: ExtensionContext) {
1111
registerOverrideMethodsCommand(languageClient, context);
1212
registerHashCodeEqualsCommand(languageClient, context);
1313
registerOrganizeImportsCommand(languageClient, context);
1414
registerChooseImportCommand(context);
1515
registerGenerateToStringCommand(languageClient, context);
16+
registerGenerateAccessorsCommand(languageClient, context);
1617
}
1718

1819
function registerOverrideMethodsCommand(languageClient: LanguageClient, context: ExtensionContext): void {
@@ -202,3 +203,40 @@ function registerGenerateToStringCommand(languageClient: LanguageClient, context
202203
applyWorkspaceEdit(workspaceEdit, languageClient);
203204
}));
204205
}
206+
207+
function registerGenerateAccessorsCommand(languageClient: LanguageClient, context: ExtensionContext): void {
208+
context.subscriptions.push(commands.registerCommand(Commands.GENERATE_ACCESSORS_PROMPT, async (params: CodeActionParams) => {
209+
const accessors = await languageClient.sendRequest(ResolveUnimplementedAccessorsRequest.type, params);
210+
if (!accessors || !accessors.length) {
211+
return;
212+
}
213+
214+
const accessorItems = accessors.map((accessor) => {
215+
const description = [];
216+
if (accessor.generateGetter) {
217+
description.push('getter');
218+
}
219+
if (accessor.generateSetter) {
220+
description.push('setter');
221+
}
222+
return {
223+
label: accessor.fieldName,
224+
description: (accessor.isStatic?'static ':'')+ description.join(', '),
225+
originalField: accessor,
226+
};
227+
});
228+
const selectedAccessors = await window.showQuickPick(accessorItems, {
229+
canPickMany: true,
230+
placeHolder: 'Select the fields to generate getters and setters.'
231+
});
232+
if (!selectedAccessors.length) {
233+
return;
234+
}
235+
236+
const workspaceEdit = await languageClient.sendRequest(GenerateAccessorsRequest.type, {
237+
context: params,
238+
accessors: selectedAccessors.map((item) => item.originalField),
239+
});
240+
applyWorkspaceEdit(workspaceEdit, languageClient);
241+
}));
242+
}

test/extension.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ suite('Java Language Extension', () => {
4646
Commands.OPEN_JSON_SETTINGS,
4747
Commands.ORGANIZE_IMPORTS,
4848
Commands.CHOOSE_IMPORTS,
49-
Commands.GENERATE_TOSTRING_PROMPT
49+
Commands.GENERATE_TOSTRING_PROMPT,
50+
Commands.GENERATE_ACCESSORS_PROMPT
5051
];
5152
const foundJavaCommands = commands.filter(function(value) {
5253
return JAVA_COMMANDS.indexOf(value)>=0 || value.startsWith('java.');

0 commit comments

Comments
 (0)