diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java b/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java index 3f1212795ee..8cd6711bca1 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/UnusedVariable.java @@ -28,6 +28,7 @@ import static com.google.errorprone.util.ASTHelpers.getStartPosition; import static com.google.errorprone.util.ASTHelpers.getSymbol; import static com.google.errorprone.util.ASTHelpers.getType; +import static com.google.errorprone.util.ASTHelpers.hasAnnotation; import static com.google.errorprone.util.ASTHelpers.isStatic; import static com.google.errorprone.util.ASTHelpers.isSubtype; import static com.google.errorprone.util.ASTHelpers.shouldKeep; @@ -141,6 +142,16 @@ public final class UnusedVariable extends BugChecker implements CompilationUnitT "org.apache.beam.sdk.transforms.DoFn.TimerId", "org.apache.beam.sdk.transforms.DoFn.StateId"); + // TODO(ghm): Find a sensible place to dedupe this with UnnecessarilyVisible. + private static final ImmutableSet ANNOTATIONS_INDICATING_PARAMETERS_SHOULD_BE_CHECKED = + ImmutableSet.of( + "com.google.inject.Inject", + "com.google.inject.Provides", + "com.google.inject.multibindings.ProvidesIntoMap", + "com.google.inject.multibindings.ProvidesIntoSet", + "dagger.Provides", + "javax.inject.Inject"); + private final ImmutableSet methodAnnotationsExemptingParameters; /** The set of types exempting a type that is extending or implementing them. */ @@ -640,11 +651,16 @@ private boolean isParameterSubjectToAnalysis(Symbol sym) { Symbol enclosingMethod = sym.owner; for (String annotationName : methodAnnotationsExemptingParameters) { - if (ASTHelpers.hasAnnotation(enclosingMethod, annotationName, state)) { + if (hasAnnotation(enclosingMethod, annotationName, state)) { return false; } } + if (ANNOTATIONS_INDICATING_PARAMETERS_SHOULD_BE_CHECKED.stream() + .anyMatch(a -> hasAnnotation(enclosingMethod, a, state))) { + return true; + } + return enclosingMethod.getModifiers().contains(Modifier.PRIVATE); } diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java index fdca26e23a1..853d37485a1 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/UnusedVariableTest.java @@ -708,6 +708,21 @@ public void unusedInject() { .doTest(); } + @Test + public void unusedInjectConstructorParameter() { + helper + .addSourceLines( + "Test.java", + "package unusedvars;", + "import javax.inject.Inject;", + "public class Test {", + " @Inject Test(", + " // BUG: Diagnostic contains:", + " String foo) {}", + "}") + .doTest(); + } + @Test public void unusedInject_notByDefault() { helper