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) {