From 2c12bf0ee5f71b4f8aa051410b90111499af42c2 Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Wed, 2 Aug 2023 15:54:09 +0200 Subject: [PATCH] [java-inspections] IDEA-326718 skip not reassigned variables GitOrigin-RevId: acdfa3cd6fd701f6a61ca0a461d179b1bda107c7 --- .../codeInspection/defUse/DefUseInspection.java | 8 ++++++-- .../intellij/psi/controlFlow/DefUseUtil.java | 17 +++++++++++++---- .../defUse/ForEachIterationParameter.java | 2 ++ .../inspection/defUse/PatternVariable.java | 2 ++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/DefUseInspection.java b/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/DefUseInspection.java index 53f1471d182c..bc32147f21f0 100644 --- a/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/DefUseInspection.java +++ b/java/java-impl-inspections/src/com/intellij/codeInspection/defUse/DefUseInspection.java @@ -111,11 +111,15 @@ public class DefUseInspection extends AbstractBaseJavaLocalInspectionTool { context instanceof PsiPostfixExpression && REPORT_POSTFIX_EXPRESSIONS) { holder.registerProblem(context, JavaBundle.message("inspection.unused.assignment.problem.descriptor4")); } - else if (REPORT_PATTERN_VARIABLE && psiVariable instanceof PsiPatternVariable) { + else if (REPORT_PATTERN_VARIABLE && psiVariable instanceof PsiPatternVariable && + //case is covered with `Java | Declaration redundancy | Unused declaration` + info.isWriteOutsideDeclaration()) { holder.registerProblem(psiVariable.getNameIdentifier(), JavaBundle.message("inspection.unused.assignment.problem.descriptor5")); } else if (REPORT_FOR_EACH_PARAMETER && context instanceof PsiForeachStatement foreachStatement && - foreachStatement.getIterationParameter() == psiVariable && psiVariable.getNameIdentifier() != null) { + foreachStatement.getIterationParameter() == psiVariable && psiVariable.getNameIdentifier() != null && + //case is covered with `Java | Declaration redundancy | Unused declaration` + info.isWriteOutsideDeclaration()) { holder.registerProblem(psiVariable.getNameIdentifier(), JavaBundle.message("inspection.unused.assignment.problem.descriptor6")); } } diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java index df4fb69437cc..a23ce99706dc 100644 --- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/DefUseUtil.java @@ -31,10 +31,13 @@ public final class DefUseUtil { private final PsiElement myContext; private final boolean myIsRead; - public Info(@NotNull PsiVariable variable, @NotNull PsiElement context, boolean read) { + private final boolean myWriteOutsideDeclaration; + + public Info(@NotNull PsiVariable variable, @NotNull PsiElement context, boolean read, boolean writeOutsideDeclaration) { myVariable = variable; myContext = context; myIsRead = read; + myWriteOutsideDeclaration = writeOutsideDeclaration; } @NotNull @@ -50,6 +53,9 @@ public final class DefUseUtil { public boolean isRead() { return myIsRead; } + public boolean isWriteOutsideDeclaration() { + return myWriteOutsideDeclaration; + } } private static class InstructionState implements Comparable { @@ -143,6 +149,7 @@ public final class DefUseUtil { } Set assignedVariables = new HashSet<>(); + Set assignedSeveralTimes = new HashSet<>(); Set readVariables = new HashSet<>(); for (int i = 0; i < instructions.size(); i++) { Instruction instruction = instructions.get(i); @@ -153,7 +160,9 @@ public final class DefUseUtil { context = PsiTreeUtil.getParentOfType(context, PsiStatement.class, false); PsiVariable psiVariable = writeInstruction.variable; if (context != null && !(context instanceof PsiDeclarationStatement && psiVariable.getInitializer() == null)) { - assignedVariables.add(psiVariable); + if (!assignedVariables.add(psiVariable)) { + assignedSeveralTimes.add(psiVariable); + } } } else if (instruction instanceof ReadVariableInstruction) { @@ -241,11 +250,11 @@ public final class DefUseUtil { if (context != null) { if (context instanceof PsiDeclarationStatement && psiVariable.getInitializer() == null) { if (!assignedVariables.contains(psiVariable)) { - unusedDefs.add(new Info(psiVariable, context, false)); + unusedDefs.add(new Info(psiVariable, context, false, assignedSeveralTimes.contains(psiVariable))); } } else { - unusedDefs.add(new Info(psiVariable, context, readVariables.contains(psiVariable))); + unusedDefs.add(new Info(psiVariable, context, readVariables.contains(psiVariable), assignedSeveralTimes.contains(psiVariable))); } } } diff --git a/java/java-tests/testData/inspection/defUse/ForEachIterationParameter.java b/java/java-tests/testData/inspection/defUse/ForEachIterationParameter.java index 9f967632c982..ad7d551135b4 100644 --- a/java/java-tests/testData/inspection/defUse/ForEachIterationParameter.java +++ b/java/java-tests/testData/inspection/defUse/ForEachIterationParameter.java @@ -4,6 +4,8 @@ class Test { arg = "test"; System.out.println(arg); } + for (String ignored : args) { + } for (String arg : args) { if (args.length == 1) { diff --git a/java/java-tests/testData/inspection/defUse/PatternVariable.java b/java/java-tests/testData/inspection/defUse/PatternVariable.java index c5e959a3ea78..a297623726f6 100644 --- a/java/java-tests/testData/inspection/defUse/PatternVariable.java +++ b/java/java-tests/testData/inspection/defUse/PatternVariable.java @@ -4,6 +4,8 @@ class Test { s = "hello"; // not reported System.out.println(s); } + if (object instanceof String ignored) { + } if (object instanceof R(var x, var y)) { if (1 == 1) {