From f03104bcd1f4cbd840eec219db6b5a8baea7b06a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 9 Jan 2020 12:34:23 +0700 Subject: [PATCH] PatternVariableCanBeUsedInspection: do not warn if there's a conflicting variable name (IDEA-CR-57035) GitOrigin-RevId: cc1ea92dbabe741f1a0c9c7577912a42ac520957 --- .../PatternVariableCanBeUsedInspection.java | 23 +++++++++++++++++++ .../beforeNameConflict.java | 11 +++++++++ 2 files changed, 34 insertions(+) create mode 100644 java/java-tests/testData/inspection/patternVariableCanBeUsed/beforeNameConflict.java 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