diff --git a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationLabeler.java b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationLabeler.java index 705a10bc595c..0978777f60c0 100644 --- a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationLabeler.java +++ b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationLabeler.java @@ -958,10 +958,29 @@ public class TypeMigrationLabeler { private static PsiElement getContainingStatement(final PsiElement root) { final PsiStatement statement = PsiTreeUtil.getParentOfType(root, PsiStatement.class); + PsiExpression condition = getContainingCondition(root, statement); + if (condition != null) return condition; final PsiField field = PsiTreeUtil.getParentOfType(root, PsiField.class); return statement != null ? statement : field != null ? field : root; } + private static PsiExpression getContainingCondition(PsiElement root, PsiStatement statement) { + PsiExpression condition = null; + if (statement instanceof PsiWhileStatement) { + condition = ((PsiWhileStatement)statement).getCondition(); + } + else if (statement instanceof PsiDoWhileStatement) { + condition = ((PsiDoWhileStatement)statement).getCondition(); + } + else if (statement instanceof PsiForStatement) { + condition = ((PsiForStatement)statement).getCondition(); + } + else if (statement instanceof PsiIfStatement) { + condition = ((PsiIfStatement)statement).getCondition(); + } + return PsiTreeUtil.isAncestor(condition, root, false) ? condition : null; + } + void migrateRootUsageExpression(final PsiReference usage, final Set processed) { final PsiElement ref = usage.getElement(); if (ref != null && ref.getLanguage() == JavaLanguage.INSTANCE) { diff --git a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java index 4894266aef31..87bed11ae326 100644 --- a/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/typeMigration/TypeMigrationStatementProcessor.java @@ -30,10 +30,10 @@ import com.intellij.psi.util.*; import com.intellij.refactoring.typeMigration.usageInfo.TypeMigrationUsageInfo; import com.intellij.util.CommonProcessors; import com.intellij.util.IncorrectOperationException; -import java.util.HashMap; import org.jetbrains.annotations.NotNull; import java.util.Collections; +import java.util.HashMap; import java.util.Map; /** @@ -240,6 +240,12 @@ class TypeMigrationStatementProcessor extends JavaRecursiveElementVisitor { } } } + else if (PsiUtil.isCondition(expression, expression.getParent())) { + final TypeView view = new TypeView(expression); + if (view.isChanged()) { //means that boolean condition becomes non-boolean + findConversionOrFail(expression, expression, view.getTypePair()); + } + } } @Override diff --git a/java/java-tests/testData/codeInspection/makeTypeGeneric/AvoidUnrelatedWarnings.java b/java/java-tests/testData/codeInspection/makeTypeGeneric/AvoidUnrelatedWarnings.java new file mode 100644 index 000000000000..e13311de3ffc --- /dev/null +++ b/java/java-tests/testData/codeInspection/makeTypeGeneric/AvoidUnrelatedWarnings.java @@ -0,0 +1,27 @@ +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import java.util.stream.Collectors; + +class ChangeIteratorTypeFail { + + private static void test(List greeting) { + + final String[] helloBugArray = new String[] { "Hello", ",", " ", "bug", "!" }; + + Iterator iterator = greeting.iterator(); + + while (iterator.hasNext()) { + String userGreeting = (String) iterator.next(); + System.out.println(userGreeting); + + String bugGreeting = Arrays + .stream(helloBugArray, 0, helloBugArray.length) + .collect(Collectors.joining("")); + + System.out.println(bugGreeting); + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInspection/makeTypeGeneric/AvoidUnrelatedWarnings_after.java b/java/java-tests/testData/codeInspection/makeTypeGeneric/AvoidUnrelatedWarnings_after.java new file mode 100644 index 000000000000..8a290c2610a1 --- /dev/null +++ b/java/java-tests/testData/codeInspection/makeTypeGeneric/AvoidUnrelatedWarnings_after.java @@ -0,0 +1,27 @@ +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; + +import java.util.stream.Collectors; + +class ChangeIteratorTypeFail { + + private static void test(List greeting) { + + final String[] helloBugArray = new String[] { "Hello", ",", " ", "bug", "!" }; + + Iterator iterator = greeting.iterator(); + + while (iterator.hasNext()) { + String userGreeting = (String) iterator.next(); + System.out.println(userGreeting); + + String bugGreeting = Arrays + .stream(helloBugArray, 0, helloBugArray.length) + .collect(Collectors.joining("")); + + System.out.println(bugGreeting); + } + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/RawTypeCanBeGenericTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/RawTypeCanBeGenericTest.java index 51efb9b1f575..d4c635e0caa2 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/RawTypeCanBeGenericTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/RawTypeCanBeGenericTest.java @@ -60,6 +60,10 @@ public class RawTypeCanBeGenericTest extends LightCodeInsightFixtureTestCase { doTest(getMessage("list", "List")); } + public void testAvoidUnrelatedWarnings() { + doTest(getMessage("iterator", "Iterator")); + } + public void testAtEquals() { doTest(getMessage("list", "List")); }