Bug 547236 - [quick fix] 'Assign all parameters to new fields' generate
the wrong field names
Change-Id: I22c92f3f36ae334e9268b8f909c3062d697f46f7
Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/180478
Tested-by: JDT Bot <jdt-bot@eclipse.org>
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AdvancedQuickAssistTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AdvancedQuickAssistTest.java
index 8724dbb..60901a5 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AdvancedQuickAssistTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AdvancedQuickAssistTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -6211,7 +6211,7 @@
assertExpectedExistInProposals(proposals, new String[] { expected });
- }
+}
@Test
public void testPickOutStringProposals2() throws Exception {
@@ -6709,4 +6709,42 @@
assertCorrectLabels(proposals);
assertProposalDoesNotExist(proposals, CorrectionMessages.AdvancedQuickAssistProcessor_convertToIfReturn);
}
+
+ @Test
+ public void testConvertParamsToFields() throws Exception {
+ IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
+ String buf= "" +
+ "package test;\n\n" +
+ "package test16_3;\n" +
+ "public class App {\n" +
+ " private String s;\n" +
+ "\n" +
+ " public App(String s, String s3, String s2) {\n" +
+ " }\n" +
+ "}";
+
+ ICompilationUnit cu= pack1.createCompilationUnit("App.java", buf, false, null);
+
+ String str= "String s3";
+ AssistContext context= getCorrectionContext(cu, buf.indexOf(str) + str.length(), 0);
+ List<IJavaCompletionProposal> proposals= collectAssists(context, false);
+ assertProposalExists(proposals, CorrectionMessages.AssignToVariableAssistProposal_assignallparamstofields_description);
+ String expected= "" +
+ "package test;\n\n" +
+ "package test16_3;\n" +
+ "public class App {\n" +
+ " private String s;\n" +
+ " private String s4;\n" +
+ " private String s3;\n" +
+ " private String s2;\n" +
+ "\n" +
+ " public App(String s, String s3, String s2) {\n" +
+ " s4 = s;\n" +
+ " this.s3 = s3;\n" +
+ " this.s2 = s2;\n" +
+ " }\n" +
+ "}";
+
+ assertProposalPreviewEquals(expected, CorrectionMessages.AssignToVariableAssistProposal_assignallparamstofields_description, proposals);
+ }
}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java
index aecb755..fbb6596 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/AssignToVariableAssistProposal.java
@@ -116,6 +116,7 @@
private final List<ASTNode> fNodesToAssign; // ExpressionStatement or SingleVariableDeclaration(s)
private final ITypeBinding fTypeBinding;
private final ICompilationUnit fCUnit;
+ private final List<String> fParamNames;
private VariableDeclarationFragment fExistingFragment;
@@ -124,6 +125,7 @@
fCUnit= cu;
fVariableKind= variableKind;
+ fParamNames = null;
fNodesToAssign= new ArrayList<>();
fNodesToAssign.add(node);
@@ -148,6 +150,7 @@
fVariableKind= FIELD;
fNodesToAssign= new ArrayList<>();
fNodesToAssign.add(parameter);
+ fParamNames= null;
fTypeBinding= typeBinding;
fExistingFragment= existingFragment;
@@ -167,7 +170,8 @@
fNodesToAssign= new ArrayList<>();
fNodesToAssign.addAll(parameters);
fTypeBinding= null;
-
+ fParamNames= new ArrayList<>();
+ populateNames(parameters);
setDisplayName(CorrectionMessages.AssignToVariableAssistProposal_assignallparamstofields_description);
setImage(JavaPluginImages.get(JavaPluginImages.IMG_FIELD_PRIVATE));
}
@@ -186,6 +190,16 @@
}
}
+ private void populateNames(List<SingleVariableDeclaration> parameters) {
+ if (parameters != null && parameters.size() > 0) {
+ for (SingleVariableDeclaration param : parameters) {
+ if (param.getName() != null) {
+ fParamNames.add(param.getName().getIdentifier());
+ }
+ }
+ }
+ }
+
private ASTRewrite doAddLocal() throws CoreException {
ASTNode nodeToAssign= fNodesToAssign.get(0);
Expression expression= ((ExpressionStatement) nodeToAssign).getExpression();
@@ -533,7 +547,29 @@
}
private Collection<String> getUsedVariableNames(ASTNode nodeToAssign) {
- return Arrays.asList(ASTResolving.getUsedVariableNames(nodeToAssign));
+ Collection<String> usedVarNames = Arrays.asList(ASTResolving.getUsedVariableNames(nodeToAssign));
+ Collection<String> additionalVarNames= getRemainingParamNamed(nodeToAssign);
+ if (additionalVarNames != null) {
+ usedVarNames = new ArrayList<>(Arrays.asList(ASTResolving.getUsedVariableNames(nodeToAssign)));
+ usedVarNames.addAll(additionalVarNames);
+ }
+ return usedVarNames;
+ }
+
+ private ArrayList<String> getRemainingParamNamed(ASTNode nodeToAssign) {
+ ArrayList<String> paramNames = null;
+ if (fParamNames != null) {
+ paramNames = new ArrayList<>();
+ paramNames.addAll(fParamNames);
+ if (nodeToAssign instanceof SingleVariableDeclaration
+ && ((SingleVariableDeclaration)nodeToAssign).getName() != null) {
+ int index= fNodesToAssign.indexOf(nodeToAssign);
+ if (index >= 0 && index < paramNames.size()) {
+ paramNames.remove(index);
+ }
+ }
+ }
+ return paramNames;
}
private int findAssignmentInsertIndex(List<Statement> statements, ASTNode nodeToAssign) {