Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

kapt exception 'Unsupported type' using Auto Factory and dagger 2.40.1+ #3075

Closed
shashachu opened this issue Nov 29, 2021 · 4 comments · Fixed by #3082
Closed

kapt exception 'Unsupported type' using Auto Factory and dagger 2.40.1+ #3075

shashachu opened this issue Nov 29, 2021 · 4 comments · Fixed by #3082

Comments

@shashachu
Copy link

This is a regression in 2.40.1 - 2.40 builds fine. We don't have a sample project yet but I figured I'd file the bug in case it's obvious what the problem is.

The basic setup is that we have an Android library module in a large app that has a class annotated with @AutoFactory that is failing to build in 2.40.1+. At the bottom of the stack is (class name changed):

Caused by: java.lang.IllegalStateException: Unsupported type FooClassFactory
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorTypeVisitor.visitUnknown(JvmDescriptorUtils.kt:205)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorTypeVisitor.visitError(JvmDescriptorUtils.kt:199)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorTypeVisitor.visitError(JvmDescriptorUtils.kt:180)
	at jdk.compiler/com.sun.tools.javac.code.Type$ErrorType.accept(Type.java:2394)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt.descriptor(JvmDescriptorUtils.kt:148)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt$descriptor$parameterDescriptors$1.invoke(JvmDescriptorUtils.kt:166)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt$descriptor$parameterDescriptors$1.invoke(JvmDescriptorUtils.kt:166)
	at kotlin.text.StringsKt__AppendableKt.appendElement(Appendable.kt:85)
	at kotlin.collections.CollectionsKt___CollectionsKt.joinTo(_Collections.kt:3344)
	at kotlin.collections.CollectionsKt___CollectionsKt.joinToString(_Collections.kt:3361)
	at kotlin.collections.CollectionsKt___CollectionsKt.joinToString$default(_Collections.kt:3360)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt.descriptor(JvmDescriptorUtils.kt:166)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt.descriptor(JvmDescriptorUtils.kt:57)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.KotlinMetadataElement.getDescriptor(KotlinMetadataElement.kt:53)
	at dagger.shaded.androidx.room.compiler.processing.javac.kotlin.KotlinMetadataElement.getConstructorMetadata(KotlinMetadataElement.kt:81)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement$kotlinMetadata$2.invoke(JavacConstructorElement.kt:46)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement$kotlinMetadata$2.invoke(JavacConstructorElement.kt:45)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement.getKotlinMetadata(JavacConstructorElement.kt:45)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement.getKotlinMetadata(JavacConstructorElement.kt:25)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacExecutableElement$parameters$2$1$1.invoke(JavacExecutableElement.kt:49)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacExecutableElement$parameters$2$1$1.invoke(JavacExecutableElement.kt:49)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter$kotlinMetadata$2.invoke(JavacMethodParameter.kt:34)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter$kotlinMetadata$2.invoke(JavacMethodParameter.kt:34)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter.getKotlinMetadata(JavacMethodParameter.kt:34)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter.getKotlinType(JavacMethodParameter.kt:42)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacVariableElement$type$2.invoke(JavacVariableElement.kt:40)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacVariableElement$type$2.invoke(JavacVariableElement.kt:36)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacVariableElement.getType(JavacVariableElement.kt:36)
	at dagger.shaded.androidx.room.compiler.processing.javac.JavacVariableElement.getType(JavacVariableElement.kt:25)
	at dagger.internal.codegen.validation.InjectValidator.validateDependencyRequest(InjectValidator.java:313)
	at dagger.internal.codegen.validation.InjectValidator.validateConstructorUncached(InjectValidator.java:187)
	at dagger.internal.codegen.base.Util.reentrantComputeIfAbsent(Util.java:33)
	at dagger.internal.codegen.validation.InjectValidator.validateConstructor(InjectValidator.java:139)
	at dagger.internal.codegen.validation.InjectBindingRegistryImpl.tryRegisterConstructor(InjectBindingRegistryImpl.java:270)
	at dagger.internal.codegen.validation.InjectBindingRegistryImpl.getOrFindProvisionBinding(InjectBindingRegistryImpl.java:364)

We worked around it by dropping this particular usage of @AutoFactory and using @AssistedInject instead. There are many other usages of @AutoFactory in our app that are working.

@bcorso
Copy link

bcorso commented Nov 29, 2021

@shashachu is there any more to that stacktrace?

I was expecting to see a line from either the dagger.internal.codegen.ComponentProcessor or one of our processing steps at the bottom.

@techeretic
Copy link

Hello, I'm @shashachu 's colleague, here is the full stack trace

Caused by: java.lang.IllegalStateException: Unsupported type FooClassFactory
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorTypeVisitor.visitUnknown(JvmDescriptorUtils.kt:205)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorTypeVisitor.visitError(JvmDescriptorUtils.kt:199)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorTypeVisitor.visitError(JvmDescriptorUtils.kt:180)
	at jdk.compiler/com.sun.tools.javac.code.Type$ErrorType.accept(Type.java:2394)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt.descriptor(JvmDescriptorUtils.kt:148)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt$descriptor$parameterDescriptors$1.invoke(JvmDescriptorUtils.kt:166)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt$descriptor$parameterDescriptors$1.invoke(JvmDescriptorUtils.kt:166)
	at kotlin.text.StringsKt__AppendableKt.appendElement(Appendable.kt:85)
	at kotlin.collections.CollectionsKt___CollectionsKt.joinTo(_Collections.kt:3344)
	at kotlin.collections.CollectionsKt___CollectionsKt.joinToString(_Collections.kt:3361)
	at kotlin.collections.CollectionsKt___CollectionsKt.joinToString$default(_Collections.kt:3360)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt.descriptor(JvmDescriptorUtils.kt:166)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.JvmDescriptorUtilsKt.descriptor(JvmDescriptorUtils.kt:57)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.KotlinMetadataElement.getDescriptor(KotlinMetadataElement.kt:53)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.kotlin.KotlinMetadataElement.getConstructorMetadata(KotlinMetadataElement.kt:81)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement$kotlinMetadata$2.invoke(JavacConstructorElement.kt:71)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement$kotlinMetadata$2.invoke(JavacConstructorElement.kt:70)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement.getKotlinMetadata(JavacConstructorElement.kt:70)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacConstructorElement.getKotlinMetadata(JavacConstructorElement.kt:28)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacExecutableElement$parameters$2$1$1.invoke(JavacExecutableElement.kt:49)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacExecutableElement$parameters$2$1$1.invoke(JavacExecutableElement.kt:49)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter$kotlinMetadata$2.invoke(JavacMethodParameter.kt:34)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter$kotlinMetadata$2.invoke(JavacMethodParameter.kt:34)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter.getKotlinMetadata(JavacMethodParameter.kt:34)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacMethodParameter.getKotlinType(JavacMethodParameter.kt:42)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacVariableElement$type$2.invoke(JavacVariableElement.kt:40)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacVariableElement$type$2.invoke(JavacVariableElement.kt:36)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacVariableElement.getType(JavacVariableElement.kt:36)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacVariableElement.getType(JavacVariableElement.kt:25)
	at dagger.internal.codegen.validation.InjectValidator.validateDependencyRequest(InjectValidator.java:313)
	at dagger.internal.codegen.validation.InjectValidator.validateConstructorUncached(InjectValidator.java:187)
	at dagger.internal.codegen.base.Util.reentrantComputeIfAbsent(Util.java:33)
	at dagger.internal.codegen.validation.InjectValidator.validateConstructor(InjectValidator.java:139)
	at dagger.internal.codegen.validation.InjectBindingRegistryImpl.tryRegisterConstructor(InjectBindingRegistryImpl.java:269)
	at dagger.internal.codegen.validation.InjectBindingRegistryImpl.getOrFindProvisionBinding(InjectBindingRegistryImpl.java:361)
	at dagger.internal.codegen.binding.BindingGraphFactory$Resolver.lookUpBindings(BindingGraphFactory.java:443)
	at dagger.internal.codegen.binding.BindingGraphFactory$Resolver.resolve(BindingGraphFactory.java:831)
	at dagger.internal.codegen.binding.BindingGraphFactory$Resolver.resolveDependencies(BindingGraphFactory.java:846)
	at dagger.internal.codegen.binding.BindingGraphFactory$Resolver.resolveMembersInjection(BindingGraphFactory.java:789)
	at dagger.internal.codegen.binding.BindingGraphFactory$Resolver.access$1300(BindingGraphFactory.java:318)
	at dagger.internal.codegen.binding.BindingGraphFactory.lambda$createLegacyBindingGraph$4(BindingGraphFactory.java:225)
	at dagger.internal.codegen.binding.BindingGraphFactory.createLegacyBindingGraph(BindingGraphFactory.java:222)
	at dagger.internal.codegen.binding.BindingGraphFactory.createLegacyBindingGraph(BindingGraphFactory.java:251)
	at dagger.internal.codegen.binding.BindingGraphFactory.create(BindingGraphFactory.java:126)
	at dagger.internal.codegen.ComponentProcessingStep.processRootComponent(ComponentProcessingStep.java:110)
	at dagger.internal.codegen.ComponentProcessingStep.process(ComponentProcessingStep.java:88)
	at dagger.internal.codegen.ComponentProcessingStep.process(ComponentProcessingStep.java:50)
	at dagger.internal.codegen.validation.TypeCheckingProcessingStep.lambda$process$0(TypeCheckingProcessingStep.java:65)
	at com.google.common.collect.RegularImmutableMap.forEach(RegularImmutableMap.java:196)
	at dagger.internal.codegen.validation.TypeCheckingProcessingStep.process(TypeCheckingProcessingStep.java:55)
	at dagger.internal.codegen.validation.TypeCheckingProcessingStep.process(TypeCheckingProcessingStep.java:40)
	at dagger.spi.shaded.androidx.room.compiler.processing.CommonProcessorDelegate.processRound(XBasicAnnotationProcessor.kt:114)
	at dagger.spi.shaded.androidx.room.compiler.processing.javac.JavacBasicAnnotationProcessor.process(JavacBasicAnnotationProcessor.kt:63)
	at org.jetbrains.kotlin.kapt3.base.incremental.IncrementalProcessor.process(incrementalProcessors.kt:90)
	at org.jetbrains.kotlin.kapt3.base.ProcessorWrapper.process(annotationProcessing.kt:175)
	at jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:985)
	... 39 more

@bcorso
Copy link

bcorso commented Nov 30, 2021

Thanks, I was able to get a repro of this.

Looks like this issue is from processing an @Inject constructor with a generated type as a parameter before the generated type was actually generated.

While this has been the case for some time, it appears the breakage happens now that we're migrating to XProcessing (for KSP support) which now fails if the parameter type has not been generated yet. We should be able to fix this by delaying processing of the @Inject constructor until all of its parameters have been generated.

I'll work on getting a fix out soon.

@shashachu
Copy link
Author

@bcorso awesome. thanks so much!

copybara-service bot pushed a commit that referenced this issue Dec 1, 2021
This CL refactors the InjectValidator to have a single entry point: `InjectValidator#validate(XTypeElement)` rather than allowing validation on the constructor and members injection types separately.

The main purpose of this refactor is to make it easier to fix #3075 by only needing to add validation at a single entry point.

However, having a single entry point on the TypeElement also allows us to organize the report better (e.g. we now check that there's only 1 @Inject constructor on the type rather than on each individual constructor), and cache on the TypeElement rather than each individual ConstructorElement.

RELNOTES=N/A
PiperOrigin-RevId: 413451893
copybara-service bot pushed a commit that referenced this issue Dec 1, 2021
This ensures that we defer if a generated type has not been generated before trying to do validation on it.

Fixes #3075

RELNOTES=Fixes #3075: ensures that we defer if a generated type has not been generated before trying to do validation on it
PiperOrigin-RevId: 413439235
copybara-service bot pushed a commit that referenced this issue Dec 2, 2021
This ensures that we defer if a generated type has not been generated before trying to do validation on it.

Fixes #3075

RELNOTES=Fixes #3075: ensures that we defer if a generated type has not been generated before trying to do validation on it
PiperOrigin-RevId: 413439235
copybara-service bot pushed a commit that referenced this issue Dec 2, 2021
This ensures that we defer if a generated type has not been generated before trying to do validation on it.

Fixes #3075

RELNOTES=Fixes #3075: ensures that we defer if a generated type has not been generated before trying to do validation on it
PiperOrigin-RevId: 413542073
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
3 participants