From 0d121391d545511f19716ca9c5ec85e20af3cf59 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 14 Nov 2022 15:20:39 +0100 Subject: [PATCH] [java-intentions] ReplaceIteratorForEachLoopWithIteratorForLoopFix: support 'var' Fixes EA-745826 - IOE: JavaParserUtil.parseFragment GitOrigin-RevId: 08296c2f0b06ccaf87ad637155a97e3b5bfe8f99 --- ...laceIteratorForEachLoopWithIteratorForLoopFix.java | 10 ++++++---- .../replaceIteratorForEachWithFor/afterVar.java | 11 +++++++++++ .../replaceIteratorForEachWithFor/beforeVar.java | 10 ++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/afterVar.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/beforeVar.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceIteratorForEachLoopWithIteratorForLoopFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceIteratorForEachLoopWithIteratorForLoopFix.java index 2cc181ce4cb2..bf418ae9b962 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceIteratorForEachLoopWithIteratorForLoopFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ReplaceIteratorForEachLoopWithIteratorForLoopFix.java @@ -29,7 +29,6 @@ import com.intellij.util.IncorrectOperationException; import com.siyeh.ig.psiutils.VariableNameGenerator; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** * @author Pavel.Dolgov @@ -89,7 +88,7 @@ public final class ReplaceIteratorForEachLoopWithIteratorForLoopFix implements I final String name = new VariableNameGenerator(myStatement, VariableKind.LOCAL_VARIABLE) .byName("it", "iter", "iterator").generate(true); PsiForStatement newForLoop = (PsiForStatement)elementFactory.createStatementFromText( - "for (Iterator " + name + " = initializer; " + name + ".hasNext();) { Object next = " + name + ".next(); }", myStatement); + "for (Iterator " + name + " = initializer; " + name + ".hasNext();) { var next = " + name + ".next(); }", myStatement); final PsiDeclarationStatement newDeclaration = (PsiDeclarationStatement)newForLoop.getInitialization(); if (newDeclaration == null) return; @@ -104,8 +103,11 @@ public final class ReplaceIteratorForEachLoopWithIteratorForLoopFix implements I final PsiDeclarationStatement newFirstStatement = (PsiDeclarationStatement)newBodyBlock.getStatements()[0]; final PsiLocalVariable newItemVariable = (PsiLocalVariable)newFirstStatement.getDeclaredElements()[0]; - final PsiTypeElement newItemTypeElement = elementFactory.createTypeElement(iterationParameter.getType()); - newItemVariable.getTypeElement().replace(newItemTypeElement); + PsiTypeElement typeElement = iterationParameter.getTypeElement(); + if (typeElement == null || !typeElement.isInferredType()) { + final PsiTypeElement newItemTypeElement = elementFactory.createTypeElement(iterationParameter.getType()); + newItemVariable.getTypeElement().replace(newItemTypeElement); + } newItemVariable.setName(iterationParameterName); final CodeStyleSettings codeStyleSettings = CodeStyle.getSettings(file); if (codeStyleSettings.getCustomSettings(JavaCodeStyleSettings.class).GENERATE_FINAL_LOCALS) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/afterVar.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/afterVar.java new file mode 100644 index 000000000000..ef5cf1ffd54b --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/afterVar.java @@ -0,0 +1,11 @@ +// "Replace 'for each' loop with iterator 'for' loop" "true-preview" +import java.util.Iterator; + +class X { + void test(Iterator it) { + for (Iterator iter = it; iter.hasNext(); ) { + var x = iter.next(); + System.out.println(x); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/beforeVar.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/beforeVar.java new file mode 100644 index 000000000000..0714080c7fe5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceIteratorForEachWithFor/beforeVar.java @@ -0,0 +1,10 @@ +// "Replace 'for each' loop with iterator 'for' loop" "true-preview" +import java.util.Iterator; + +class X { + void test(Iterator it) { + for (var x : it) { + System.out.println(x); + } + } +} \ No newline at end of file