Skip to content

Commit 8aef228

Browse files
committed
Fix naming strategy for 'assign all params to new fields' action
Signed-off-by: Fred Bricon <[email protected]>
1 parent 4a6f917 commit 8aef228

File tree

2 files changed

+86
-3
lines changed

2 files changed

+86
-3
lines changed

org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AssignToVariableAssistProposal.java

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,17 @@ public class AssignToVariableAssistProposal extends LinkedCorrectionProposal {
8585
private final int fVariableKind;
8686
private final List<ASTNode> fNodesToAssign; // ExpressionStatement or SingleVariableDeclaration(s)
8787
private final ITypeBinding fTypeBinding;
88+
private final List<String> fParamNames;
8889

8990
private VariableDeclarationFragment fExistingFragment;
9091

9192
public AssignToVariableAssistProposal(ICompilationUnit cu, int variableKind, ExpressionStatement node, ITypeBinding typeBinding, int relevance) {
9293
super("", JavaCodeActionKind.QUICK_ASSIST, cu, null, relevance); //$NON-NLS-1$
9394

9495
fVariableKind= variableKind;
96+
fParamNames = null;
9597
fNodesToAssign= new ArrayList<>();
9698
fNodesToAssign.add(node);
97-
9899
fTypeBinding= Bindings.normalizeForDeclarationUse(typeBinding, node.getAST());
99100
if (variableKind == LOCAL) {
100101
setDisplayName(CorrectionMessages.AssignToVariableAssistProposal_assigntolocal_description);
@@ -108,6 +109,7 @@ public AssignToVariableAssistProposal(ICompilationUnit cu, String kind, int vari
108109
super("", kind, cu, null, relevance); //$NON-NLS-1$
109110

110111
fVariableKind = variableKind;
112+
fParamNames = null;
111113
fNodesToAssign = new ArrayList<>();
112114
fNodesToAssign.add(node);
113115

@@ -128,7 +130,7 @@ public AssignToVariableAssistProposal(ICompilationUnit cu, SingleVariableDeclara
128130
fNodesToAssign.add(parameter);
129131
fTypeBinding= typeBinding;
130132
fExistingFragment= existingFragment;
131-
133+
fParamNames = null;
132134
if (existingFragment == null) {
133135
setDisplayName(CorrectionMessages.AssignToVariableAssistProposal_assignparamtofield_description);
134136
} else {
@@ -143,6 +145,8 @@ public AssignToVariableAssistProposal(ICompilationUnit cu, List<SingleVariableDe
143145
fNodesToAssign= new ArrayList<>();
144146
fNodesToAssign.addAll(parameters);
145147
fTypeBinding= null;
148+
fParamNames = new ArrayList<>();
149+
populateNames(parameters);
146150

147151
setDisplayName(CorrectionMessages.AssignToVariableAssistProposal_assignallparamstofields_description);
148152
}
@@ -161,6 +165,16 @@ protected ASTRewrite getRewrite() throws CoreException {
161165
}
162166
}
163167

168+
private void populateNames(List<SingleVariableDeclaration> parameters) {
169+
if (parameters != null && parameters.size() > 0) {
170+
for (SingleVariableDeclaration param : parameters) {
171+
if (param.getName() != null) {
172+
fParamNames.add(param.getName().getIdentifier());
173+
}
174+
}
175+
}
176+
}
177+
164178
private ASTRewrite doAddLocal() {
165179
ASTNode nodeToAssign= fNodesToAssign.get(0);
166180
Expression expression= ((ExpressionStatement) nodeToAssign).getExpression();
@@ -373,7 +387,28 @@ private String[] suggestFieldNames(ITypeBinding binding, Expression expression,
373387
}
374388

375389
private Collection<String> getUsedVariableNames(ASTNode nodeToAssign) {
376-
return Arrays.asList(ASTResolving.getUsedVariableNames(nodeToAssign));
390+
Collection<String> usedVarNames = Arrays.asList(ASTResolving.getUsedVariableNames(nodeToAssign));
391+
Collection<String> additionalVarNames = getRemainingParamNamed(nodeToAssign);
392+
if (additionalVarNames != null) {
393+
usedVarNames = new ArrayList<>(Arrays.asList(ASTResolving.getUsedVariableNames(nodeToAssign)));
394+
usedVarNames.addAll(additionalVarNames);
395+
}
396+
return usedVarNames;
397+
}
398+
399+
private ArrayList<String> getRemainingParamNamed(ASTNode nodeToAssign) {
400+
ArrayList<String> paramNames = null;
401+
if (fParamNames != null) {
402+
paramNames = new ArrayList<>();
403+
paramNames.addAll(fParamNames);
404+
if (nodeToAssign instanceof SingleVariableDeclaration && ((SingleVariableDeclaration) nodeToAssign).getName() != null) {
405+
int index = fNodesToAssign.indexOf(nodeToAssign);
406+
if (index >= 0 && index < paramNames.size()) {
407+
paramNames.remove(index);
408+
}
409+
}
410+
}
411+
return paramNames;
377412
}
378413

379414
private int findAssignmentInsertIndex(List<Statement> statements, ASTNode nodeToAssign) {

org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CodeActionResolveHandlerTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,54 @@ public void testResolveCodeAction_QuickAssists() throws Exception {
262262
Assert.assertEquals(buf.toString(), actual);
263263
}
264264

265+
@Test
266+
public void testAssignAllParamsToFields() throws Exception {
267+
when(preferenceManager.getClientPreferences().isResolveCodeActionSupported()).thenReturn(true);
268+
269+
StringBuilder buf = new StringBuilder();
270+
buf.append("public class App {\n");
271+
buf.append(" private String s;\n");
272+
buf.append("\n");
273+
buf.append(" public App(String s, String s3, String s2) {\n");
274+
buf.append(" }\n");
275+
buf.append("}\n");
276+
ICompilationUnit unit = defaultPackage.createCompilationUnit("App.java", buf.toString(), false, null);
277+
CodeActionParams params = new CodeActionParams();
278+
params.setTextDocument(new TextDocumentIdentifier(JDTUtils.toURI(unit)));
279+
Range range = CodeActionUtil.getRange(unit, "s3");
280+
params.setRange(range);
281+
CodeActionContext context = new CodeActionContext(Collections.emptyList(), Collections.singletonList(JavaCodeActionKind.QUICK_ASSIST));
282+
params.setContext(context);
283+
284+
List<Either<Command, CodeAction>> codeActions = server.codeAction(params).join();
285+
Assert.assertNotNull(codeActions);
286+
Assert.assertFalse("No quickassist actions were found", codeActions.isEmpty());
287+
288+
Optional<Either<Command, CodeAction>> assignAllToNewFieldsResponse = codeActions.stream().filter(codeAction -> {
289+
return "Assign all parameters to new fields".equals(codeAction.getRight().getTitle());
290+
}).findFirst();
291+
Assert.assertTrue("Should return the quick assist 'Assign all parameters to new fields'", assignAllToNewFieldsResponse.isPresent());
292+
CodeAction unresolvedCodeAction = assignAllToNewFieldsResponse.get().getRight();
293+
294+
CodeAction resolvedCodeAction = server.resolveCodeAction(unresolvedCodeAction).join();
295+
Assert.assertNotNull("Should resolve the edit property in the resolveCodeAction request", resolvedCodeAction.getEdit());
296+
String actual = AbstractQuickFixTest.evaluateWorkspaceEdit(resolvedCodeAction.getEdit());
297+
buf = new StringBuilder();
298+
buf.append("public class App {\n");
299+
buf.append(" private String s;\n");
300+
buf.append(" private String s4;\n");
301+
buf.append(" private String s3;\n");
302+
buf.append(" private String s2;\n");
303+
buf.append("\n");
304+
buf.append(" public App(String s, String s3, String s2) {\n");
305+
buf.append(" s4 = s;\n");
306+
buf.append(" this.s3 = s3;\n");
307+
buf.append(" this.s2 = s2;\n");
308+
buf.append(" }\n");
309+
buf.append("}\n");
310+
Assert.assertEquals(buf.toString(), actual);
311+
}
312+
265313
@Test
266314
public void testResolveCodeAction_SourceActions() throws Exception {
267315
when(preferenceManager.getClientPreferences().isResolveCodeActionSupported()).thenReturn(true);

0 commit comments

Comments
 (0)