while -> foreach: expand var when no appropriate initializer is found IDEA-193830

This commit is contained in:
Anna Kozlova
2018-06-14 14:56:15 +03:00
parent b26c14af4b
commit 237aadc1c8
7 changed files with 69 additions and 2 deletions
@@ -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) {
@@ -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();
@@ -0,0 +1,10 @@
import java.util.List;
class MyTest {
void test(List<? extends String> list) {
fo<caret>r (String aList: list) {
System.out.println(aList);
}
var it = list.iterator();
}
}
@@ -0,0 +1,11 @@
import java.util.List;
class MyTest {
void test(List<? extends String> list) {
var it = list.iterator();
wh<caret>ile(it.hasNext()) {
System.out.println(it.next());
}
it = list.iterator();
}
}
@@ -0,0 +1,11 @@
import java.util.Iterator;
import java.util.List;
class MyTest {
void test(List<? extends String> list) {
fo<caret>r (String aList: list) {
System.out.println(aList);
}
Iterator<? extends String> it = null;
}
}
@@ -0,0 +1,11 @@
import java.util.List;
class MyTest {
void test(List<? extends String> list) {
var it = list.iterator();
wh<caret>ile(it.hasNext()) {
System.out.println(it.next());
}
it = null;
}
}
@@ -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() {