Bug 574044 - [var] error after "Convert to 'for' loop using index"

- add check to QuickAssistProcessor.getConvertEnhancedForLoopProposal()
  method so if converting to loop using index and the parameter is var
  and expression is array, do not create an array of var, just
  use var
- add new test to AssistQuickFixTest10

Change-Id: I0a10bebb4b761436dec850f0951e25ed9347497e
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/181553
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Tested-by: Jeff Johnston <jjohnstn@redhat.com>
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest10.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest10.java
index f1dd73e..98ada53 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest10.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest10.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2018, 2020 IBM Corporation and others.
+ * Copyright (c) 2018, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -45,6 +45,7 @@
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.text.correction.AssistContext;
+import org.eclipse.jdt.internal.ui.text.correction.proposals.LinkedCorrectionProposal;
 import org.eclipse.jdt.internal.ui.text.correction.proposals.TypeChangeCorrectionProposal;
 
 public class AssistQuickFixTest10 extends QuickFixTest {
@@ -53,6 +54,7 @@
     public ProjectTestSetup projectSetup= new Java10ProjectTestSetup();
 
 	private static final Class<?>[] TYPE_CHANGE_PROPOSAL_TYPE= { TypeChangeCorrectionProposal.class };
+	private static final Class<?>[] LINKED_PROPOSAL_TYPE= { LinkedCorrectionProposal.class };
 
 	private IJavaProject fJProject1;
 
@@ -445,6 +447,46 @@
 
 	}
 
+	@Test
+	public void testConvertToForUsingIndexWithVar() throws Exception {
+		StringBuffer buf= new StringBuffer();
+		buf.append("module test {\n");
+		buf.append("}\n");
+		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
+		def.createCompilationUnit("module-info.java", buf.toString(), false, null);
+
+		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
+		buf= new StringBuffer();
+		buf.append("package test;\n\n");
+		buf.append("public class Cls {\n");
+		buf.append("  public void foo() {\n");
+	    buf.append("    for (var y : new int[0]) {\n");
+	    buf.append("      System.out.println(y);\n");
+	    buf.append("    }\n");
+	    buf.append("  }\n");
+		buf.append("}\n");
+		ICompilationUnit cu= pack.createCompilationUnit("Cls.java", buf.toString(), false, null);
+
+		int offset= buf.toString().indexOf("for");
+
+		AssistContext context= getCorrectionContext(cu, offset, 3);
+		assertNoErrors(context);
+		List<IJavaCompletionProposal> proposals= getExpectedProposals(collectAssists(context, false), LINKED_PROPOSAL_TYPE);
+
+		buf= new StringBuffer();
+		buf.append("package test;\n\n");
+		buf.append("public class Cls {\n");
+		buf.append("  public void foo() {\n");
+	    buf.append("    var is = new int[0];\n");
+	    buf.append("    for (int i = 0; i < is.length; i++) {\n");
+	    buf.append("        var y = is[i];\n");
+	    buf.append("        System.out.println(y);\n");
+	    buf.append("    }\n");
+	    buf.append("  }\n");
+		buf.append("}\n");
+		assertExpectedExistInProposals(proposals, new String[] {buf.toString()});
+	}
+
 	private static final ArrayList<IJavaCompletionProposal> getExpectedProposals(ArrayList<IJavaCompletionProposal> proposals, Class<?>[] expectedTypes) {
 		ArrayList<IJavaCompletionProposal> expected= new ArrayList<>(proposals);
 		if (expectedTypes != null && expectedTypes.length > 0) {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java
index 6e548ed..d9eb1f6 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java
@@ -2504,7 +2504,7 @@
 			rewrite.set(varDecl, VariableDeclarationStatement.TYPE_PROPERTY, nType, null);
 			DimensionRewrite.removeAllChildren(fragment, VariableDeclarationFragment.EXTRA_DIMENSIONS2_PROPERTY, rewrite, null);
 		}
-		
+
 		ListRewrite listRewriter= rewrite.getListRewrite(statementParent, (ChildListPropertyDescriptor) property);
 		listRewriter.insertAt(newStatement, insertIndex, null);
 		resultingCollections.add(proposal);
@@ -4187,8 +4187,12 @@
 				VariableDeclarationStatement varDeclaration= ast.newVariableDeclarationStatement(varFragment);
 				Type varType;
 				if (initializerIsArray) {
-					Type copiedType= DimensionRewrite.copyTypeAndAddDimensions(parameter.getType(), parameter.extraDimensions(), rewrite);
-					varType= ASTNodeFactory.newArrayType(copiedType);
+					if (parameter.getType().isVar()) {
+						varType= ASTNodeFactory.newType(ast, "var"); //$NON-NLS-1$
+					} else {
+						Type copiedType= DimensionRewrite.copyTypeAndAddDimensions(parameter.getType(), parameter.extraDimensions(), rewrite);
+						varType= ASTNodeFactory.newArrayType(copiedType);
+					}
 				} else {
 					ImportRewrite imports= proposal.createImportRewrite(context.getASTRoot());
 					ImportRewriteContext importRewriteContext= new ContextSensitiveImportRewriteContext(node, imports);