diff --git a/java/java-impl/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java b/java/java-impl/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java index 63cd59f7f18f..d5c864572f45 100644 --- a/java/java-impl/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/PatternVariableCanBeUsedInspection.java @@ -101,11 +101,34 @@ public class PatternVariableCanBeUsedInspection extends AbstractBaseJavaLocalIns } } } + if (isConflictingNameDeclaredInside(identifier, stmt)) return true; if (stmt instanceof PsiSwitchLabelStatementBase) break; } return false; } + private boolean isConflictingNameDeclaredInside(PsiIdentifier identifier, PsiElement statement) { + class Visitor extends JavaRecursiveElementWalkingVisitor { + boolean hasConflict = false; + + @Override + public void visitClass(final PsiClass aClass) {} + + @Override + public void visitVariable(PsiVariable variable) { + String name = variable.getName(); + if (name != null && identifier.textMatches(name)) { + hasConflict = true; + stopWalking(); + } + super.visitVariable(variable); + } + } + Visitor visitor = new Visitor(); + statement.accept(visitor); + return visitor.hasConflict; + } + private boolean canCompleteNormally(@NotNull PsiElement parent, @Nullable PsiStatement statement) { if (statement == null) return true; ControlFlow flow; diff --git a/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeNameConflict.java b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeNameConflict.java new file mode 100644 index 000000000000..65ec1a2a5765 --- /dev/null +++ b/java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeNameConflict.java @@ -0,0 +1,11 @@ +// "Replace 'n' with pattern variable" "false" +class X { + void test(Object obj) { + if (!(obj instanceof Number)) return; + if (false) { + Number n; + } + Number n = (Number)obj; + System.out.println(n.longValue()); + } +} \ No newline at end of file