/*
* Copyright 2016 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.errorprone.matchers;
import static com.google.errorprone.matchers.ChildMultiMatcher.MatchType.AT_LEAST_ONE;
import static com.google.errorprone.matchers.Matchers.annotations;
import static com.google.errorprone.matchers.Matchers.anyOf;
import static com.google.errorprone.matchers.Matchers.enclosingClass;
import static com.google.errorprone.matchers.Matchers.hasAnnotation;
import static com.google.errorprone.matchers.Matchers.isSubtypeOf;
import static com.google.errorprone.matchers.Matchers.isType;
import com.sun.source.tree.AnnotationTree;
import com.sun.source.tree.ClassTree;
import com.sun.source.tree.Tree;
/** Utility constants and matchers related to dependency injection. */
public final class InjectMatchers {
public static final Matcher<Tree> INSIDE_GUICE_MODULE =
enclosingClass(
anyOf(
isSubtypeOf("com.google.inject.Module"),
isSubtypeOf("com.google.gwt.inject.client.GinModule")));
private InjectMatchers() {} // no instantiation
public static final String GUICE_PROVIDES_ANNOTATION = "com.google.inject.Provides";
public static final String DAGGER_PROVIDES_ANNOTATION = "dagger.Provides";
private static final Matcher<Tree> HAS_PROVIDES_ANNOTATION =
annotations(
AT_LEAST_ONE,
anyOf(
isType(GUICE_PROVIDES_ANNOTATION),
isType(DAGGER_PROVIDES_ANNOTATION),
isType("com.google.inject.throwingproviders.CheckedProvides"),
isType("com.google.inject.multibindings.ProvidesIntoMap"),
isType("com.google.inject.multibindings.ProvidesIntoSet"),
isType("com.google.inject.multibindings.ProvidesIntoOptional"),
isType("dagger.producers.Produces")));
@SuppressWarnings("unchecked") // Safe contravariant cast
public static <T extends Tree> Matcher<T> hasProvidesAnnotation() {
return (Matcher<T>) HAS_PROVIDES_ANNOTATION;
}
public static final String ASSISTED_ANNOTATION = "com.google.inject.assistedinject.Assisted";
public static final String ASSISTED_INJECT_ANNOTATION =
"com.google.inject.assistedinject.AssistedInject";
public static final String GUICE_INJECT_ANNOTATION = "com.google.inject.Inject";
public static final String JAVAX_INJECT_ANNOTATION = "javax.inject.Inject";
public static final Matcher<AnnotationTree> IS_APPLICATION_OF_JAVAX_INJECT =
new AnnotationType(JAVAX_INJECT_ANNOTATION);
public static final Matcher<AnnotationTree> IS_APPLICATION_OF_GUICE_INJECT =
new AnnotationType(GUICE_INJECT_ANNOTATION);
public static final Matcher<AnnotationTree> IS_APPLICATION_OF_AT_INJECT =
anyOf(IS_APPLICATION_OF_JAVAX_INJECT, IS_APPLICATION_OF_GUICE_INJECT);
public static final Matcher<Tree> HAS_INJECT_ANNOTATION =
anyOf(hasAnnotation(GUICE_INJECT_ANNOTATION), hasAnnotation(JAVAX_INJECT_ANNOTATION));
@SuppressWarnings("unchecked") // Safe contravariant cast
public static <T extends Tree> Matcher<T> hasInjectAnnotation() {
return (Matcher<T>) HAS_INJECT_ANNOTATION;
}
public static final String GUICE_SCOPE_ANNOTATION = "com.google.inject.ScopeAnnotation";
public static final String JAVAX_SCOPE_ANNOTATION = "javax.inject.Scope";
public static final Matcher<AnnotationTree> IS_SCOPING_ANNOTATION =
anyOf(hasAnnotation(GUICE_SCOPE_ANNOTATION), hasAnnotation(JAVAX_SCOPE_ANNOTATION));
public static final String GUICE_BINDING_ANNOTATION = "com.google.inject.BindingAnnotation";
public static final String JAVAX_QUALIFIER_ANNOTATION = "javax.inject.Qualifier";
public static final Matcher<AnnotationTree> IS_BINDING_ANNOTATION =
anyOf(hasAnnotation(JAVAX_QUALIFIER_ANNOTATION), hasAnnotation(GUICE_BINDING_ANNOTATION));
public static final Matcher<ClassTree> IS_DAGGER_COMPONENT =
anyOf(
hasAnnotation("dagger.Component"),
hasAnnotation("dagger.Subcomponent"),
hasAnnotation("dagger.producers.ProductionComponent"),
hasAnnotation("dagger.producers.ProductionSubcomponent"));
public static final Matcher<ClassTree> IS_DAGGER_COMPONENT_OR_MODULE =
anyOf(IS_DAGGER_COMPONENT, hasAnnotation("dagger.Module"));
}