diff --git a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java index 5fe40b244df4..035005171ef1 100644 --- a/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java +++ b/platform/testFramework/src/com/intellij/testFramework/PsiTestUtil.java @@ -42,6 +42,7 @@ import com.intellij.openapi.vfs.*; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.DebugUtil; +import com.intellij.psi.impl.source.PsiFileImpl; import com.intellij.psi.stubs.StubTextInconsistencyException; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; @@ -247,7 +248,11 @@ public class PsiTestUtil { private static PsiFile createDummyCopy(PsiFile file) { LightVirtualFile copy = new LightVirtualFile(file.getName(), file.getText()); copy.setOriginalFile(file.getViewProvider().getVirtualFile()); - return Objects.requireNonNull(file.getManager().findFile(copy)); + PsiFile dummyCopy = Objects.requireNonNull(file.getManager().findFile(copy)); + if (dummyCopy instanceof PsiFileImpl) { + ((PsiFileImpl)dummyCopy).setOriginalFile(file); + } + return dummyCopy; } public static void checkPsiMatchesTextIgnoringNonCode(PsiFile file) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java index 212ead64b686..5b586e6cb714 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java @@ -21,6 +21,7 @@ import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.util.PsiTypesUtil; import com.intellij.psi.util.TypeConversionUtil; import com.intellij.util.Query; import com.siyeh.InspectionGadgetsBundle; @@ -136,7 +137,16 @@ public class WhileCanBeForeachInspection extends WhileCanBeForeachInspectionBase break; } final PsiExpression expression = assignment.getRExpression(); - initializer.delete(); + PsiTypeElement typeElement = iterator.getTypeElement(); + if (typeElement.isInferredType() && + (expression == null || + PsiType.NULL.equals(expression.getType()) || + expression instanceof PsiArrayInitializerExpression || + expression instanceof PsiFunctionalExpression) && + PsiTypesUtil.replaceWithExplicitType(typeElement) == null) { + deleteIterator = false; + break; + } iterator.setInitializer(expression); final PsiElement statement = assignment.getParent(); final PsiElement lastChild = statement.getLastChild(); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithValidInitializer.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithValidInitializer.after.java new file mode 100644 index 000000000000..7183f63850d6 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithValidInitializer.after.java @@ -0,0 +1,10 @@ +import java.util.List; + +class MyTest { + void test(List list) { + for (String aList: list) { + System.out.println(aList); + } + var it = list.iterator(); + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithValidInitializer.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithValidInitializer.java new file mode 100644 index 000000000000..10f70ab57fa8 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithValidInitializer.java @@ -0,0 +1,11 @@ +import java.util.List; + +class MyTest { + void test(List list) { + var it = list.iterator(); + while(it.hasNext()) { + System.out.println(it.next()); + } + it = list.iterator(); + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithoutValidInitializer.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithoutValidInitializer.after.java new file mode 100644 index 000000000000..b9e0c5e83c18 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithoutValidInitializer.after.java @@ -0,0 +1,11 @@ +import java.util.Iterator; +import java.util.List; + +class MyTest { + void test(List list) { + for (String aList: list) { + System.out.println(aList); + } + Iterator it = null; + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithoutValidInitializer.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithoutValidInitializer.java new file mode 100644 index 000000000000..8654bbe95603 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/VarWithoutValidInitializer.java @@ -0,0 +1,11 @@ +import java.util.List; + +class MyTest { + void test(List list) { + var it = list.iterator(); + while(it.hasNext()) { + System.out.println(it.next()); + } + it = null; + } +} diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/WhileCanBeForeachFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/WhileCanBeForeachFixTest.java index 43038eab59cf..2946f6a360cb 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/WhileCanBeForeachFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/WhileCanBeForeachFixTest.java @@ -15,6 +15,8 @@ */ package com.siyeh.ig.fixes.migration; +import com.intellij.pom.java.LanguageLevel; +import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.IGQuickFixesTestCase; import com.siyeh.ig.migration.WhileCanBeForeachInspection; @@ -31,6 +33,13 @@ public class WhileCanBeForeachFixTest extends IGQuickFixesTestCase { public void testCast() { doTest(); } public void testNakedNext() { doTest(); } public void testUnboundWildcard() { doTest(); } + public void testVarWithoutValidInitializer() { doTest(); } + public void testVarWithValidInitializer() { doTest(); } + + @Override + protected void tuneFixture(JavaModuleFixtureBuilder builder) { + builder.setLanguageLevel(LanguageLevel.HIGHEST); + } @Override protected String getRelativePath() {