square / anvil

A Kotlin compiler plugin to make dependency injection with Dagger 2 easier.
Apache License 2.0
1.31k stars 81 forks source link

AnvilMergeAnnotationDetectorCheck failure after upgrading to Anvil 2.4.0 #607

Closed quiro91 closed 2 years ago

quiro91 commented 2 years ago

After upgrading from Anvil 2.3.11-1-6-10 to 2.4.0 (Dagger 2.42, Kotlin 1.6.10), I'm seeing this error:

java.lang.AssertionError: Recursion detected on input: SuppressWarnings under LockBasedStorageManager@b5fc8ec (TopDownAnalyzer for JVM)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope.getContributedClassifier(AbstractLazyMemberScope.kt:75)
    at org.jetbrains.kotlin.resolve.scopes.InnerClassesScopeWrapper.getContributedClassifier(InnerClassesScopeWrapper.kt:29)
    at org.jetbrains.kotlin.resolve.AllUnderImportScope.getContributedClassifier(AllUnderImportScope.kt:86)
    at org.jetbrains.kotlin.resolve.lazy.LazyImportScope$getClassifier$1.invoke(LazyImportScope.kt:256)
    at org.jetbrains.kotlin.resolve.lazy.LazyImportScope$getClassifier$1.invoke(LazyImportScope.kt:251)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager.compute(LockBasedStorageManager.java:290)
    at org.jetbrains.kotlin.resolve.lazy.LazyImportScope.getClassifier(LazyImportScope.kt:251)
    at org.jetbrains.kotlin.resolve.lazy.LazyImportScope.getContributedClassifier(LazyImportScope.kt:247)
    at org.jetbrains.kotlin.resolve.scopes.ResolutionScope$DefaultImpls.getContributedClassifierIncludeDeprecated(ResolutionScope.kt:40)
    at org.jetbrains.kotlin.resolve.scopes.HierarchicalScope$DefaultImpls.getContributedClassifierIncludeDeprecated(Scopes.kt:27)
    at org.jetbrains.kotlin.resolve.scopes.ImportingScope$DefaultImpls.getContributedClassifierIncludeDeprecated(Scopes.kt:110)
    at org.jetbrains.kotlin.resolve.lazy.LazyImportScope.getContributedClassifierIncludeDeprecated(LazyImportScope.kt:220)
    at org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt.findFirstClassifierWithDeprecationStatus(ScopeUtils.kt:117)
    at org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.findClassifierAndReportDeprecationIfNeeded(QualifiedExpressionResolver.kt:82)
    at org.jetbrains.kotlin.resolve.QualifiedExpressionResolver.resolveDescriptorForType(QualifiedExpressionResolver.kt:106)
    at org.jetbrains.kotlin.resolve.TypeResolver.resolveDescriptorForType(TypeResolver.kt:992)
    at org.jetbrains.kotlin.resolve.TypeResolver$resolveTypeElement$1.visitUserType(TypeResolver.kt:245)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:933)
    at org.jetbrains.kotlin.psi.KtVisitorVoid.visitUserType(KtVisitorVoid.java:21)
    at org.jetbrains.kotlin.psi.KtUserType.accept(KtUserType.java:42)
    at org.jetbrains.kotlin.psi.KtElementImplStub.accept(KtElementImplStub.java:49)
    at org.jetbrains.kotlin.resolve.TypeResolver.resolveTypeElement(TypeResolver.kt:243)
    at org.jetbrains.kotlin.resolve.TypeResolver.resolvePossiblyBareType(TypeResolver.kt:122)
    at org.jetbrains.kotlin.resolve.TypeResolver.resolveType(TypeResolver.kt:112)
    at org.jetbrains.kotlin.resolve.TypeResolver.resolveType(TypeResolver.kt:83)
    at org.jetbrains.kotlin.resolve.AnnotationResolverImpl.resolveAnnotationType(AnnotationResolverImpl.java:122)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor$type$2.invoke(LazyAnnotations.kt:86)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor$type$2.invoke(LazyAnnotations.kt:84)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedLazyValue.invoke(LockBasedStorageManager.java:408)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$LockBasedNotNullLazyValue.invoke(LockBasedStorageManager.java:527)
    at org.jetbrains.kotlin.storage.StorageKt.getValue(storage.kt:42)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor.getType(LazyAnnotations.kt:84)
    at org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.getAnnotationClass(DescriptorUtils.kt:391)
    at org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor$DefaultImpls.getFqName(AnnotationDescriptor.kt:34)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotationDescriptor.getFqName(LazyAnnotations.kt:75)
    at org.jetbrains.kotlin.descriptors.annotations.Annotations$DefaultImpls.findAnnotation(Annotations.kt:29)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotations.findAnnotation(LazyAnnotations.kt:55)
    at org.jetbrains.kotlin.descriptors.annotations.Annotations$DefaultImpls.hasAnnotation(Annotations.kt:31)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyAnnotations.hasAnnotation(LazyAnnotations.kt:55)
    at org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializationUtilKt.getHasSerializableAnnotation(KSerializationUtil.kt:137)
    at org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializationUtilKt.isSerializableEnum(KSerializationUtil.kt:118)
    at org.jetbrains.kotlinx.serialization.compiler.resolve.KSerializationUtilKt.getShouldHaveGeneratedMethodsInCompanion(KSerializationUtil.kt:104)
    at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationResolveExtension.getSyntheticCompanionObjectNameIfNeeded(SerializationResolveExtension.kt:77)
    at org.jetbrains.kotlin.resolve.extensions.SyntheticResolveExtension$Companion$getInstance$1.getSyntheticCompanionObjectNameIfNeeded(SyntheticResolveExtension.kt:82)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassMemberScope.generateSyntheticCompanionObject(LazyClassMemberScope.kt:385)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassMemberScope.getNonDeclaredClasses(LazyClassMemberScope.kt:270)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope.doGetClasses(AbstractLazyMemberScope.kt:68)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope.access$doGetClasses(AbstractLazyMemberScope.kt:36)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope$classDescriptors$1.invoke(AbstractLazyMemberScope.kt:47)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope$classDescriptors$1.invoke(AbstractLazyMemberScope.kt:47)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$MapBasedMemoizedFunction.invoke(LockBasedStorageManager.java:578)
    at org.jetbrains.kotlin.storage.LockBasedStorageManager$MapBasedMemoizedFunctionToNotNull.invoke(LockBasedStorageManager.java:651)
    at org.jetbrains.kotlin.resolve.lazy.descriptors.AbstractLazyMemberScope.getContributedClassifier(AbstractLazyMemberScope.kt:75)
    at org.jetbrains.kotlin.resolve.scopes.InnerClassesScopeWrapper.getContributedClassifier(InnerClassesScopeWrapper.kt:29)
    at org.jetbrains.kotlin.descriptors.DescriptorUtilKt.resolveClassByFqName(descriptorUtil.kt:29)
    at com.squareup.anvil.compiler.codegen.reference.RealAnvilModuleDescriptor.resolveFqNameOrNull(RealAnvilModuleDescriptor.kt:82)
    at com.squareup.anvil.compiler.internal.reference.AnvilModuleDescriptor$DefaultImpls.resolveFqNameOrNull$default(AnvilModuleDescriptor.kt:20)
    at com.squareup.anvil.compiler.codegen.reference.RealAnvilModuleDescriptor.resolveClassIdOrNull(RealAnvilModuleDescriptor.kt:72)
    at com.squareup.anvil.compiler.internal.reference.AnvilModuleDescriptorKt.canResolveFqName(AnvilModuleDescriptor.kt:46)
    at com.squareup.anvil.compiler.internal.PsiUtilsKt.requireFqName(PsiUtils.kt:215)
    at com.squareup.anvil.compiler.internal.PsiUtilsKt.requireFqName(PsiUtils.kt:118)
    at com.squareup.anvil.compiler.internal.PsiUtilsKt.requireFqName(PsiUtils.kt:128)
    at com.squareup.anvil.compiler.internal.reference.AnnotationReferenceKt.toAnnotationReference(AnnotationReference.kt:227)
    at com.squareup.anvil.compiler.internal.reference.ClassReference$Psi$annotations$2.invoke(ClassReference.kt:148)
    at com.squareup.anvil.compiler.internal.reference.ClassReference$Psi$annotations$2.invoke(ClassReference.kt:147)
    at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81)
    at com.squareup.anvil.compiler.internal.reference.ClassReference$Psi.getAnnotations(ClassReference.kt:147)
    at com.squareup.anvil.compiler.internal.reference.AnnotatedReference$DefaultImpls.isAnnotatedWith(AnnotatedReference.kt:14)
    at com.squareup.anvil.compiler.internal.reference.ClassReference.isAnnotatedWith(ClassReference.kt:53)
    at com.squareup.anvil.compiler.codegen.dagger.AnvilMergeAnnotationDetectorCheck.generateCodePrivate(AnvilMergeAnnotationDetectorCheck.kt:30)
    at com.squareup.anvil.compiler.codegen.PrivateCodeGenerator.generateCode(PrivateCodeGenerator.kt:21)
    at com.squareup.anvil.compiler.codegen.CodeGenerationExtension.analysisCompleted$generateCode(CodeGenerationExtension.kt:104)
    at com.squareup.anvil.compiler.codegen.CodeGenerationExtension.analysisCompleted(CodeGenerationExtension.kt:151)
    at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM$analyzeFilesWithJavaIntegration$2.invoke(TopDownAnalyzerFacadeForJVM.kt:112)
    at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration(TopDownAnalyzerFacadeForJVM.kt:122)
    at org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration$default(TopDownAnalyzerFacadeForJVM.kt:96)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:262)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler$analyze$1.invoke(KotlinToJVMBytecodeCompiler.kt:53)
    at org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport.analyzeAndReport(AnalyzerWithCompilerReport.kt:113)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.analyze(KotlinToJVMBytecodeCompiler.kt:253)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:100)
    at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:58)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:170)
    at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:52)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:92)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
    at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
    at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1618)
    at jdk.internal.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)

Worth noting I'm configuring Anvil as:

target.plugins.apply(ANVIL) {
    target.extensions.configure(AnvilExtension::class.java) {
         it.generateDaggerFactories.set(true)
         it.generateDaggerFactoriesOnly.set(true)
    }
}

I'm adding Anvil compiler-api artifact to a module which is then implemented by downstream modules. Not sure about how to provide additional information but I'm happy to help in any way possible.

vRallev commented 2 years ago

Hm, this sounds like a special setup. I'd love to write a test case for this, but for that I'd need a sample to reproduce the issue first. Can you provide one, please?

vRallev commented 2 years ago

Closing due to inactivity.