/*
* 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.bugpatterns.inject.dagger;
import static com.google.errorprone.matchers.Matchers.anyOf;
import static com.google.errorprone.matchers.Matchers.hasAnnotation;
import com.google.errorprone.matchers.Matcher;
import com.sun.source.tree.Tree;
/** A utility class for static analysis having to do with Dagger annotations. */
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));
}
// Common Matchers
static <T extends Tree> Matcher<T> isAnyModule() {
return anyOf(isModule(), isProducerModule());
}
static <T extends Tree> Matcher<T> isBindingMethod() {
return anyOf(isProvidesMethod(), isProducesMethod());
}
static <T extends Tree> Matcher<T> isBindingDeclarationMethod() {
return anyOf(isBindsMethod(), isMultibindsMethod());
}
static <T extends Tree> Matcher<T> isAnyBindingDeclaringMethod() {
return anyOf(isBindingMethod(), isBindingDeclarationMethod());
}
private DaggerAnnotations() {}
}