Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use shouldKeep to suppress several checks, interpreting Keep as "don't change the modifiers or really anything about this element". #2912

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -18,13 +18,12 @@

import static com.google.common.base.CaseFormat.LOWER_CAMEL;
import static com.google.common.base.CaseFormat.UPPER_UNDERSCORE;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.errorprone.BugPattern.SeverityLevel.SUGGESTION;
import static com.google.errorprone.fixes.SuggestedFixes.addModifiers;
import static com.google.errorprone.matchers.Description.NO_MATCH;
import static com.google.errorprone.util.ASTHelpers.annotationsAmong;
import static com.google.errorprone.util.ASTHelpers.getSymbol;
import static com.google.errorprone.util.ASTHelpers.getType;
import static com.google.errorprone.util.ASTHelpers.shouldKeep;
import static javax.lang.model.element.ElementKind.FIELD;
import static javax.lang.model.element.Modifier.FINAL;
import static javax.lang.model.element.Modifier.STATIC;
Expand All @@ -43,7 +42,6 @@
import com.google.errorprone.bugpatterns.threadsafety.WellKnownMutability;
import com.google.errorprone.fixes.SuggestedFix;
import com.google.errorprone.matchers.Description;
import com.google.errorprone.suppliers.Supplier;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.IdentifierTree;
import com.sun.source.tree.MemberSelectTree;
Expand All @@ -55,10 +53,8 @@
import com.sun.tools.javac.code.Symbol.VarSymbol;
import com.sun.tools.javac.code.Type;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.util.Name;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import javax.lang.model.element.NestingKind;

/** Finds fields which can be safely made static. */
Expand All @@ -69,13 +65,6 @@
severity = SUGGESTION)
public final class FieldCanBeStatic extends BugChecker implements VariableTreeMatcher {

private static final Supplier<ImmutableSet<Name>> EXEMPTING_VARIABLE_ANNOTATIONS =
VisitorState.memoize(
s ->
Stream.of("com.google.inject.testing.fieldbinder.Bind")
.map(s::getName)
.collect(toImmutableSet()));

private final WellKnownMutability wellKnownMutability;
private final ConstantExpressions constantExpressions;

Expand Down Expand Up @@ -112,7 +101,7 @@ public Description matchVariable(VariableTree tree, VisitorState state) {
if (tree.getInitializer() == null || !isPure(tree.getInitializer(), state)) {
return NO_MATCH;
}
if (!annotationsAmong(symbol, EXEMPTING_VARIABLE_ANNOTATIONS.get(state), state).isEmpty()) {
if (shouldKeep(tree)) {
return NO_MATCH;
}
SuggestedFix fix =
Expand Down
Expand Up @@ -21,12 +21,9 @@
import static com.google.common.collect.Streams.stream;
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
import static com.google.errorprone.fixes.SuggestedFixes.qualifyType;
import static com.google.errorprone.matchers.ChildMultiMatcher.MatchType.AT_LEAST_ONE;
import static com.google.errorprone.matchers.Description.NO_MATCH;
import static com.google.errorprone.matchers.InjectMatchers.hasProvidesAnnotation;
import static com.google.errorprone.matchers.Matchers.annotations;
import static com.google.errorprone.matchers.Matchers.anyOf;
import static com.google.errorprone.matchers.Matchers.isType;
import static com.google.errorprone.matchers.Matchers.methodReturns;
import static com.google.errorprone.matchers.Matchers.variableType;
import static com.google.errorprone.predicates.TypePredicates.isDescendantOf;
Expand All @@ -39,6 +36,7 @@
import static com.google.errorprone.util.ASTHelpers.isConsideredFinal;
import static com.google.errorprone.util.ASTHelpers.isSubtype;
import static com.google.errorprone.util.ASTHelpers.methodCanBeOverridden;
import static com.google.errorprone.util.ASTHelpers.shouldKeep;

import com.google.auto.value.AutoValue;
import com.google.common.collect.ArrayListMultimap;
Expand Down Expand Up @@ -119,11 +117,6 @@ public final class PreferredInterfaceType extends BugChecker implements Compilat
.map(bt -> Matchers.typePredicateMatcher(bt.predicate()))
.collect(toImmutableList()));

public static final Matcher<Tree> SHOULD_IGNORE =
anyOf(
hasProvidesAnnotation(),
annotations(AT_LEAST_ONE, anyOf(isType("com.google.inject.testing.fieldbinder.Bind"))));

@Override
public Description matchCompilationUnit(CompilationUnitTree tree, VisitorState state) {
ImmutableMap<Symbol, Tree> fixableTypes = getFixableTypes(state);
Expand Down Expand Up @@ -199,7 +192,7 @@ private boolean variableIsFixable(VariableTree tree, VarSymbol symbol) {
if (symbol.getKind() == ElementKind.PARAMETER) {
return false;
}
if (SHOULD_IGNORE.matches(tree, state)) {
if (hasProvidesAnnotation().matches(tree, state) || shouldKeep(tree)) {
return false;
}
if (symbol.getKind() == ElementKind.FIELD) {
Expand All @@ -219,7 +212,7 @@ public Void visitMethod(MethodTree node, Void unused) {
if (methodReturns(INTERESTING_TYPE).matches(node, state)
&& methodSymbol != null
&& !methodCanBeOverridden(methodSymbol)
&& !SHOULD_IGNORE.matches(node, state)) {
&& !shouldKeep(node)) {
fixableTypes.put(methodSymbol, node.getReturnType());
}
return super.visitMethod(node, null);
Expand Down
Expand Up @@ -125,7 +125,7 @@ public Description matchVariable(VariableTree tree, VisitorState state) {
|| !sym.getModifiers().contains(Modifier.FINAL)) {
return NO_MATCH;
}
if (ASTHelpers.hasAnnotation(tree, "com.google.inject.testing.fieldbinder.Bind", state)) {
if (ASTHelpers.shouldKeep(tree)) {
return NO_MATCH;
}
Tree type = tree.getType();
Expand Down
Expand Up @@ -92,10 +92,6 @@ public final class UnusedMethod extends BugChecker implements CompilationUnitTre
private static final ImmutableSet<String> EXEMPTING_METHOD_ANNOTATIONS =
ImmutableSet.of(
"com.fasterxml.jackson.annotation.JsonCreator",
"com.google.inject.Provides",
"com.google.inject.Inject",
"com.google.inject.multibindings.ProvidesIntoMap",
"com.google.inject.multibindings.ProvidesIntoSet",
"javax.annotation.PreDestroy",
"javax.annotation.PostConstruct",
"javax.inject.Inject",
Expand Down
Expand Up @@ -239,17 +239,19 @@ public void nonFunctionalInterfaceMethod() {
}

@Test
public void variable_bind() {
public void variable_keepAnnotatedMember() {
testHelper
.addInputLines(
"Bind.java",
"package com.google.inject.testing.fieldbinder;",
"import static java.lang.annotation.ElementType.FIELD;",
"import static java.lang.annotation.RetentionPolicy.RUNTIME;",
"import com.google.errorprone.annotations.Keep;",
"import java.lang.annotation.Retention;",
"import java.lang.annotation.Target;",
"@Retention(RUNTIME)",
"@Target({FIELD})",
"@Keep",
"public @interface Bind {}")
.expectUnchanged()
.addInputLines(
Expand Down