From 42ca138d64779dae6faf498bb6f3d83d0a287529 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Fri, 29 Apr 2022 17:49:33 +0200 Subject: [PATCH] Report unused local variables inside lambda expressions with expression bodies for the global "Unused declaration" inspection GitOrigin-RevId: a6f9f2de0b53f254312a07c43190502731d995e2 --- .../deadCode/UnusedDeclarationInspection.java | 36 +++++++------------ .../deadCode/localVariables/expected.xml | 15 ++++++++ .../deadCode/localVariables/src/Lambda.java | 10 ++++++ 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java index 7cdada8cd411..63a4f936a9b0 100644 --- a/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/deadCode/UnusedDeclarationInspection.java @@ -266,35 +266,30 @@ public final class UnusedDeclarationInspection extends UnusedDeclarationInspecti UField field = ((RefField)refElement).getUastElement(); if (field != null) { UExpression initializer = field.getUastInitializer(); - if (initializer != null) { - initializer = UastUtils.skipParenthesizedExprDown(initializer); - if (initializer instanceof ULambdaExpression) { - findUnusedLocalVariables(((ULambdaExpression)initializer).getBody(), refElement); - } - } + findUnusedLocalVariables(initializer, refElement); } } } private void findUnusedLocalVariables(UExpression body, RefElement refElement) { if (body == null) return; - PsiCodeBlock bodySourcePsi = ObjectUtils.tryCast(body.getSourcePsi(), PsiCodeBlock.class); - if (bodySourcePsi == null) return; - if (!myTools.isEnabled(bodySourcePsi)) return; - InspectionToolWrapper toolWrapper = myTools.getInspectionTool(bodySourcePsi); + PsiElement psiBody = body.getSourcePsi(); + if (psiBody == null) return; + if (!myTools.isEnabled(psiBody)) return; + InspectionToolWrapper toolWrapper = myTools.getInspectionTool(psiBody); InspectionToolPresentation presentation = myContext.getPresentation(toolWrapper); if (((UnusedDeclarationInspection)toolWrapper.getTool()).getSharedLocalInspectionTool().LOCAL_VARIABLE) { List descriptors = new ArrayList<>(); - findUnusedLocalVariablesInCodeBlock(bodySourcePsi, descriptors); + findUnusedLocalVariablesInElement(psiBody, descriptors); if (!descriptors.isEmpty()) { presentation.addProblemElement(refElement, descriptors.toArray(CommonProblemDescriptor.EMPTY_ARRAY)); } } } - private void findUnusedLocalVariablesInCodeBlock(@NotNull PsiCodeBlock codeBlock, @NotNull List descriptors) { + private void findUnusedLocalVariablesInElement(@NotNull PsiElement element, @NotNull List descriptors) { Set usedVariables = new HashSet<>(); - List unusedDefs = DefUseUtil.getUnusedDefs(codeBlock, usedVariables); + List unusedDefs = DefUseUtil.getUnusedDefs(element, usedVariables); if (unusedDefs != null && !unusedDefs.isEmpty()) { for (DefUseUtil.Info varDefInfo : unusedDefs) { PsiElement parent = varDefInfo.getContext(); @@ -306,7 +301,7 @@ public final class UnusedDeclarationInspection extends UnusedDeclarationInspecti } } } - codeBlock.accept(new JavaRecursiveElementWalkingVisitor() { + element.accept(new JavaRecursiveElementWalkingVisitor() { @Override public void visitClass(PsiClass aClass) { // prevent going to local classes @@ -314,16 +309,9 @@ public final class UnusedDeclarationInspection extends UnusedDeclarationInspecti @Override public void visitLambdaExpression(PsiLambdaExpression lambdaExpr) { - RefElement lambdaRef = myContext.getRefManager().getReference(lambdaExpr); - if (lambdaRef instanceof RefFunctionalExpression) { - ULambdaExpression lambda = ObjectUtils.tryCast(((RefFunctionalExpression)lambdaRef).getUastElement(), ULambdaExpression.class); - if (lambda != null) { - PsiCodeBlock lambdaBody = ObjectUtils.tryCast(lambda.getBody().getSourcePsi(), PsiCodeBlock.class); - if (lambdaBody != null) { - findUnusedLocalVariablesInCodeBlock(lambdaBody, descriptors); - } - } - } + final PsiElement body = lambdaExpr.getBody(); + if (body == null) return; + findUnusedLocalVariablesInElement(body, descriptors); } @Override diff --git a/java/java-tests/testData/inspection/deadCode/localVariables/expected.xml b/java/java-tests/testData/inspection/deadCode/localVariables/expected.xml index 050ddf6c3c65..f8c199144f94 100644 --- a/java/java-tests/testData/inspection/deadCode/localVariables/expected.xml +++ b/java/java-tests/testData/inspection/deadCode/localVariables/expected.xml @@ -76,6 +76,21 @@ 29 Variable <code>i3</code> is never used + + Lambda.java + 38 + Variable <code>r</code> is never used + + + Lambda.java + 41 + Variable <code>s</code> is never used + + + Lambda.java + 42 + Variable <code>t</code> is never used + AnonymousClass.java diff --git a/java/java-tests/testData/inspection/deadCode/localVariables/src/Lambda.java b/java/java-tests/testData/inspection/deadCode/localVariables/src/Lambda.java index f40090b52678..95d9f1afb5d8 100644 --- a/java/java-tests/testData/inspection/deadCode/localVariables/src/Lambda.java +++ b/java/java-tests/testData/inspection/deadCode/localVariables/src/Lambda.java @@ -35,6 +35,16 @@ class Test { System.out.println(lambda2); return false; }); + java.util.function.IntSupplier r = () -> + switch (args[0]) { + default -> { + String s = ""; + String t; + String u = ""; + System.out.println(u); + yield 1; + } + }; } static void bar(Unused unused) {