1919import static com .google .common .collect .Iterables .getOnlyElement ;
2020import static dagger .internal .codegen .base .Util .reentrantComputeIfAbsent ;
2121import static dagger .internal .codegen .binding .AssistedInjectionAnnotations .assistedInjectedConstructors ;
22+ import static dagger .internal .codegen .binding .AssistedInjectionAnnotations .isAssistedParameter ;
2223import static dagger .internal .codegen .binding .InjectionAnnotations .injectedConstructors ;
2324import static dagger .internal .codegen .binding .SourceFiles .factoryNameForElement ;
2425import static dagger .internal .codegen .binding .SourceFiles .membersInjectorNameForType ;
2526import static dagger .internal .codegen .extension .DaggerStreams .toImmutableList ;
2627import static dagger .internal .codegen .xprocessing .XElements .closestEnclosingTypeElement ;
27- import static dagger .internal .codegen .xprocessing .XElements .getAnyAnnotation ;
2828import static dagger .internal .codegen .xprocessing .XMethodElements .hasTypeParameters ;
29- import static dagger .internal .codegen .xprocessing .XTypeNames .injectTypeNames ;
3029import static dagger .internal .codegen .xprocessing .XTypes .isSubtype ;
3130
32- import androidx .room .compiler .codegen .XClassName ;
3331import androidx .room .compiler .codegen .XTypeName ;
3432import androidx .room .compiler .processing .XAnnotation ;
3533import androidx .room .compiler .processing .XConstructorElement ;
4947import dagger .internal .codegen .compileroption .CompilerOptions ;
5048import dagger .internal .codegen .langmodel .Accessibility ;
5149import dagger .internal .codegen .model .Scope ;
52- import dagger .internal .codegen .xprocessing .XAnnotations ;
5350import dagger .internal .codegen .xprocessing .XTypeNames ;
5451import java .util .HashMap ;
5552import java .util .Map ;
@@ -72,6 +69,7 @@ public final class InjectValidator implements ClearableCache {
7269 private final MethodSignatureFormatter methodSignatureFormatter ;
7370 private final InternalValidator validator ;
7471 private final InternalValidator validatorWhenGeneratingCode ;
72+ private final AssistedValidator assistedValidator ;
7573
7674 @ Inject
7775 InjectValidator (
@@ -80,12 +78,14 @@ public final class InjectValidator implements ClearableCache {
8078 CompilerOptions compilerOptions ,
8179 InjectionAnnotations injectionAnnotations ,
8280 DaggerSuperficialValidation superficialValidation ,
83- MethodSignatureFormatter methodSignatureFormatter ) {
81+ MethodSignatureFormatter methodSignatureFormatter ,
82+ AssistedValidator assistedValidator ) {
8483 this .processingEnv = processingEnv ;
8584 this .dependencyRequestValidator = dependencyRequestValidator ;
8685 this .injectionAnnotations = injectionAnnotations ;
8786 this .superficialValidation = superficialValidation ;
8887 this .methodSignatureFormatter = methodSignatureFormatter ;
88+ this .assistedValidator = assistedValidator ;
8989
9090 // When validating types that require a generated factory class we need to error on private and
9191 // static inject members even if the compiler options are set to not error.
@@ -191,21 +191,24 @@ private ValidationReport validateConstructor(XConstructorElement constructorElem
191191 ValidationReport .Builder builder =
192192 ValidationReport .about (constructorElement .getEnclosingElement ());
193193
194- if (InjectionAnnotations .hasInjectAnnotation (constructorElement )
195- && constructorElement .hasAnnotation (XTypeNames .ASSISTED_INJECT )) {
194+ boolean isInjectConstructor = InjectionAnnotations .hasInjectAnnotation (constructorElement );
195+ boolean isAssistedInjectConstructor =
196+ InjectionAnnotations .hasAssistedInjectAnnotation (constructorElement );
197+ final String injectAnnotationName ;
198+ if (isInjectConstructor && isAssistedInjectConstructor ) {
196199 builder .addError ("Constructors cannot be annotated with both @Inject and @AssistedInject" );
200+ // The rest of the validation assumes that only one of the annotations is present so return
201+ // early if there are both.
202+ return builder .build ();
203+ } else if (isInjectConstructor ) {
204+ injectAnnotationName = "Inject" ;
205+ } else if (isAssistedInjectConstructor ) {
206+ injectAnnotationName = "AssistedInject" ;
207+ } else {
208+ throw new AssertionError (
209+ "No @Inject or @AssistedInject annotation found: " + constructorElement );
197210 }
198211
199- XClassName injectAnnotation =
200- getAnyAnnotation (
201- constructorElement ,
202- ImmutableSet .<XClassName >builder ()
203- .addAll (injectTypeNames ())
204- .add (XTypeNames .ASSISTED_INJECT )
205- .build ())
206- .map (XAnnotations ::asClassName )
207- .get ();
208-
209212 if (constructorElement .isPrivate ()) {
210213 builder .addError (
211214 "Dagger does not support injection into private constructors" , constructorElement );
@@ -221,15 +224,15 @@ private ValidationReport validateConstructor(XConstructorElement constructorElem
221224 builder .addError (
222225 String .format (
223226 "@Qualifier annotations are not allowed on @%s constructors" ,
224- injectAnnotation . getSimpleName () ),
227+ injectAnnotationName ),
225228 constructorElement ,
226229 qualifier );
227230 }
228231
229232 String scopeErrorMsg =
230233 String .format (
231234 "@Scope annotations are not allowed on @%s constructors" ,
232- injectAnnotation . getSimpleName () );
235+ injectAnnotationName );
233236
234237 if (InjectionAnnotations .hasInjectAnnotation (constructorElement )) {
235238 scopeErrorMsg += "; annotate the class instead" ;
@@ -243,14 +246,19 @@ private ValidationReport validateConstructor(XConstructorElement constructorElem
243246
244247 for (XExecutableParameterElement parameter : constructorElement .getParameters ()) {
245248 superficialValidation .validateTypeOf (parameter );
246- validateDependencyRequest (builder , parameter );
249+ if (isAssistedParameter (parameter )) {
250+ builder .addSubreport (assistedValidator .validate (parameter ));
251+ } else {
252+ // Only validate dependency requests for non-assisted parameters.
253+ validateDependencyRequest (builder , parameter );
254+ }
247255 }
248256
249257 if (throwsCheckedExceptions (constructorElement )) {
250258 builder .addItem (
251259 String .format (
252260 "Dagger does not support checked exceptions on @%s constructors" ,
253- injectAnnotation . getSimpleName () ),
261+ injectAnnotationName ),
254262 privateMemberDiagnosticKind ,
255263 constructorElement );
256264 }
@@ -262,7 +270,7 @@ private ValidationReport validateConstructor(XConstructorElement constructorElem
262270 builder .addError (
263271 String .format (
264272 "@%s is nonsense on the constructor of an abstract class" ,
265- injectAnnotation . getSimpleName () ),
273+ injectAnnotationName ),
266274 constructorElement );
267275 }
268276
@@ -271,7 +279,7 @@ private ValidationReport validateConstructor(XConstructorElement constructorElem
271279 String .format (
272280 "@%s constructors are invalid on inner classes. "
273281 + "Did you mean to make the class static?" ,
274- injectAnnotation . getSimpleName () ),
282+ injectAnnotationName ),
275283 constructorElement );
276284 }
277285
0 commit comments