1 /* 2 * Copyright (C) 2014 The Dagger Authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package dagger.internal.codegen; 18 19 import static dagger.internal.codegen.BindingElementValidator.AllowsMultibindings.ALLOWS_MULTIBINDINGS; 20 import static dagger.internal.codegen.BindingElementValidator.AllowsScoping.ALLOWS_SCOPING; 21 import static dagger.internal.codegen.BindingMethodValidator.Abstractness.MUST_BE_CONCRETE; 22 import static dagger.internal.codegen.BindingMethodValidator.ExceptionSuperclass.RUNTIME_EXCEPTION; 23 24 import com.google.common.collect.ImmutableSet; 25 import dagger.Module; 26 import dagger.Provides; 27 import dagger.internal.codegen.langmodel.DaggerElements; 28 import dagger.internal.codegen.langmodel.DaggerTypes; 29 import dagger.producers.ProducerModule; 30 import javax.inject.Inject; 31 import javax.lang.model.element.ExecutableElement; 32 import javax.lang.model.element.VariableElement; 33 34 /** A validator for {@link Provides} methods. */ 35 final class ProvidesMethodValidator extends BindingMethodValidator { 36 37 private final DependencyRequestValidator dependencyRequestValidator; 38 39 @Inject ProvidesMethodValidator( DaggerElements elements, DaggerTypes types, DependencyRequestValidator dependencyRequestValidator)40 ProvidesMethodValidator( 41 DaggerElements elements, 42 DaggerTypes types, 43 DependencyRequestValidator dependencyRequestValidator) { 44 super( 45 elements, 46 types, 47 Provides.class, 48 ImmutableSet.of(Module.class, ProducerModule.class), 49 dependencyRequestValidator, 50 MUST_BE_CONCRETE, 51 RUNTIME_EXCEPTION, 52 ALLOWS_MULTIBINDINGS, 53 ALLOWS_SCOPING); 54 this.dependencyRequestValidator = dependencyRequestValidator; 55 } 56 57 @Override elementValidator(ExecutableElement element)58 protected ElementValidator elementValidator(ExecutableElement element) { 59 return new Validator(element); 60 } 61 62 private class Validator extends MethodValidator { Validator(ExecutableElement element)63 Validator(ExecutableElement element) { 64 super(element); 65 } 66 67 @Override checkAdditionalMethodProperties()68 protected void checkAdditionalMethodProperties() { 69 } 70 71 /** Adds an error if a {@link Provides @Provides} method depends on a producer type. */ 72 @Override checkParameter(VariableElement parameter)73 protected void checkParameter(VariableElement parameter) { 74 super.checkParameter(parameter); 75 dependencyRequestValidator.checkNotProducer(report, parameter); 76 } 77 } 78 } 79