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