Skip to content

Commit

Permalink
InterfaceWithOnlyStatics: match ProducerModule too.
Browse files Browse the repository at this point in the history
Also pull out constants for the Dagger matchers, so they don't get reallocated for each potential match.

RELNOTES: N/A

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=227350413
  • Loading branch information
graememorgan authored and eaftan committed Jan 3, 2019
1 parent 703fad0 commit 11a1dfe
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 46 deletions.
Expand Up @@ -17,8 +17,8 @@
package com.google.errorprone.bugpatterns;

import static com.google.common.collect.Iterables.getLast;
import static com.google.errorprone.bugpatterns.inject.dagger.DaggerAnnotations.isAnyModule;
import static com.google.errorprone.util.ASTHelpers.getSymbol;
import static com.google.errorprone.util.ASTHelpers.hasAnnotation;

import com.google.common.collect.ImmutableList;
import com.google.errorprone.BugPattern;
Expand Down Expand Up @@ -60,7 +60,7 @@ public Description matchClass(ClassTree tree, VisitorState state) {
if (!tree.getImplementsClause().isEmpty()) {
return Description.NO_MATCH;
}
if (hasAnnotation(tree, "dagger.Module", state)) {
if (isAnyModule().matches(tree, state)) {
return Description.NO_MATCH;
}
List<? extends Tree> members = tree.getMembers();
Expand Down
Expand Up @@ -22,70 +22,43 @@
import com.sun.source.tree.Tree;

/** A utility class for static analysis having to do with Dagger annotations. */
final class DaggerAnnotations {
public final class DaggerAnnotations {

// Dagger types
static final String BINDS_CLASS_NAME = "dagger.Binds";
static final String PROVIDES_CLASS_NAME = "dagger.Provides";
static final String MODULE_CLASS_NAME = "dagger.Module";
static final String MULTIBINDS_CLASS_NAME = "dagger.multibindings.Multibinds";

// Dagger matchers
static <T extends Tree> Matcher<T> isModule() {
return hasAnnotation(MODULE_CLASS_NAME);
}

static <T extends Tree> Matcher<T> isProvidesMethod() {
return hasAnnotation(PROVIDES_CLASS_NAME);
}

static <T extends Tree> Matcher<T> isBindsMethod() {
return hasAnnotation(BINDS_CLASS_NAME);
}

static <T extends Tree> Matcher<T> isMultibindsMethod() {
return hasAnnotation(MULTIBINDS_CLASS_NAME);
}

// Dagger Producers types
static final String PRODUCES_CLASS_NAME = "dagger.producers.Produces";
static final String PRODUCER_MODULE_CLASS_NAME = "dagger.producers.ProducerModule";

// Dagger Producers matchers
static <T extends Tree> Matcher<T> isProducerModule() {
return hasAnnotation(PRODUCER_MODULE_CLASS_NAME);
}

static <T extends Tree> Matcher<T> isProducesMethod() {
return hasAnnotation(PRODUCES_CLASS_NAME);
}

// Multibinding types
static final String INTO_SET_CLASS_NAME = "dagger.multibindings.IntoSet";
static final String ELEMENTS_INTO_SET_CLASS_NAME = "dagger.multibindings.ElementsIntoSet";
static final String INTO_MAP_CLASS_NAME = "dagger.multibindings.IntoMap";

static <T extends Tree> Matcher<T> isMultibindingMethod() {
return anyOf(
hasAnnotation(INTO_SET_CLASS_NAME),
hasAnnotation(ELEMENTS_INTO_SET_CLASS_NAME),
hasAnnotation(INTO_MAP_CLASS_NAME));
}
private static final Matcher<Tree> ANY_MODULE =
anyOf(hasAnnotation(MODULE_CLASS_NAME), hasAnnotation(PRODUCER_MODULE_CLASS_NAME));

// Common Matchers
static <T extends Tree> Matcher<T> isAnyModule() {
return anyOf(isModule(), isProducerModule());
}
private static final Matcher<Tree> BINDING_METHOD =
anyOf(hasAnnotation(PROVIDES_CLASS_NAME), hasAnnotation(PRODUCES_CLASS_NAME));

static <T extends Tree> Matcher<T> isBindingMethod() {
return anyOf(isProvidesMethod(), isProducesMethod());
private static final Matcher<Tree> BINDING_DECLARATION_METHOD =
anyOf(hasAnnotation(BINDS_CLASS_NAME), hasAnnotation(MULTIBINDS_CLASS_NAME));

// Common Matchers
public static Matcher<Tree> isAnyModule() {
return ANY_MODULE;
}

static <T extends Tree> Matcher<T> isBindingDeclarationMethod() {
return anyOf(isBindsMethod(), isMultibindsMethod());
static Matcher<Tree> isBindingMethod() {
return BINDING_METHOD;
}

static <T extends Tree> Matcher<T> isAnyBindingDeclaringMethod() {
return anyOf(isBindingMethod(), isBindingDeclarationMethod());
static Matcher<Tree> isBindingDeclarationMethod() {
return BINDING_DECLARATION_METHOD;
}

private DaggerAnnotations() {}
Expand Down
Expand Up @@ -92,19 +92,30 @@ public void negative_extends() {
}

@Test
public void negative_module() {
public void negative_daggerModules() {
testHelper
.addSourceLines(
"Module.java", //
"package dagger;",
"public @interface Module {}")
.addSourceLines(
"ProducerModule.java", //
"package dagger.producers;",
"public @interface ProducerModule {}")
.addSourceLines(
"Test.java", //
"import dagger.Module;",
"@Module",
"interface Test {",
" public static final int foo = 42;",
"}")
.addSourceLines(
"Test.java", //
"import dagger.producers.ProducerModule;",
"@ProducerModule",
"interface Test {",
" public static final int foo = 42;",
"}")
.doTest();
}

Expand Down

0 comments on commit 11a1dfe

Please sign in to comment.