[KAPT4] A temporary workaround for KT-60482

This commit is contained in:
strangepleasures
2023-09-12 16:58:13 +00:00
committed by Space Team
parent 7bc521ab92
commit 6475942ced
4 changed files with 170 additions and 6 deletions
@@ -0,0 +1,106 @@
/**
* public final annotation class Anno : kotlin/Annotation {
*
* // signature: <init>(Lkotlin/reflect/KClass;)V
* public constructor(klass: kotlin/reflect/KClass<*>)
*
* // getter: klass()Ljava/lang/Class;
* public final val klass: kotlin/reflect/KClass<*>
* public final get
*
* // module name: main
* }
*/
@kotlin.Metadata()
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
public abstract @interface Anno {
public abstract java.lang.Class<?> klass();
}
////////////////////
/**
* public final class ErrorMissingAnnotation : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
@ABC()
public final class ErrorMissingAnnotation {
public ErrorMissingAnnotation() {
super();
}
}
////////////////////
/**
* public final class ErrorMultipleMissingAnnotations : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
@ABC()
@CDE()
public final class ErrorMultipleMissingAnnotations {
public ErrorMultipleMissingAnnotations() {
super();
}
}
////////////////////
/**
* public final class ErrorSomeMissingAnnotations : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
@CDE()
@Anno(klass = ABC.class)
@ABC()
public final class ErrorSomeMissingAnnotations {
public ErrorSomeMissingAnnotations() {
super();
}
}
////////////////////
/**
* public final class FullyQualifiedMissingAnnotation : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
@com.example.XYZ()
public final class FullyQualifiedMissingAnnotation {
public FullyQualifiedMissingAnnotation() {
super();
}
}
+8 -5
View File
@@ -1,10 +1,9 @@
// FIR_BLOCKED: KT-60482
// CORRECT_ERROR_TYPES
@file:Suppress("UNRESOLVED_REFERENCE", "ANNOTATION_ARGUMENT_MUST_BE_CONST")
import kotlin.reflect.KClass
@ABC
@ABC(x = 42)
class ErrorMissingAnnotation
@ABC @CDE
@@ -15,6 +14,10 @@ class ErrorSomeMissingAnnotations
annotation class Anno(val klass: KClass<*>)
// EXPECTED_ERROR: (kotlin:10:1) cannot find symbol
// EXPECTED_ERROR: (kotlin:13:1) cannot find symbol
// EXPECTED_ERROR: (kotlin:7:1) cannot find symbol
@com /* ??? */ . example /* ???? */ . // ???
/* ??? */ XYZ ("param")
class FullyQualifiedMissingAnnotation
// EXPECTED_ERROR: (kotlin:12:1) cannot find symbol
// EXPECTED_ERROR: (kotlin:6:1) cannot find symbol
// EXPECTED_ERROR: (kotlin:9:1) cannot find symbol
@@ -91,3 +91,26 @@ public final class ErrorSomeMissingAnnotations {
super();
}
}
////////////////////
import kotlin.reflect.KClass;
@com.example.XYZ()
/**
* public final class FullyQualifiedMissingAnnotation : kotlin/Any {
*
* // signature: <init>()V
* public constructor()
*
* // module name: main
* }
*/
@kotlin.Metadata()
public final class FullyQualifiedMissingAnnotation {
public FullyQualifiedMissingAnnotation() {
super();
}
}
@@ -9,7 +9,9 @@ package org.jetbrains.kotlin.kapt4
import com.google.common.collect.HashMultimap
import com.google.common.collect.Multimap
import com.intellij.lang.ASTNode
import com.intellij.psi.*
import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.sun.tools.javac.code.Flags
import com.sun.tools.javac.code.TypeTag
import com.sun.tools.javac.parser.Tokens
@@ -34,6 +36,7 @@ import org.jetbrains.kotlin.kapt3.base.stubs.KaptStubLineInformation
import org.jetbrains.kotlin.kapt3.base.util.TopLevelJava9Aware
import org.jetbrains.kotlin.kapt3.stubs.MemberData
import org.jetbrains.kotlin.kapt3.stubs.MembersPositionComparator
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.light.classes.symbol.classes.SymbolLightClassForNamedClassLike
import org.jetbrains.kotlin.load.java.JvmAnnotationNames.*
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
@@ -41,6 +44,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.SpecialNames
import org.jetbrains.kotlin.name.isOneSegmentFQN
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.stubs.elements.KtAnnotationEntryElementType
import org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny
import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.addToStdlib.runUnless
@@ -296,7 +300,35 @@ internal class Kapt4StubGenerator {
annotation: PsiAnnotation,
packageFqName: String
): JCAnnotation? {
val rawQualifiedName = annotation.qualifiedName ?: return null
fun collectNameParts(node: ASTNode, builder: StringBuilder, takeNext: Boolean) {
when (node) {
is LeafPsiElement -> {
when (node.elementType) {
KtTokens.IDENTIFIER, KtTokens.DOT -> builder.append((node as ASTNode).text)
}
if (takeNext) node.treeNext?.let { collectNameParts(it, builder, true) }
}
else ->
if (node.elementType is KtAnnotationEntryElementType) {
collectNameParts(node.firstChildNode.treeNext, builder, false)
} else {
collectNameParts(node.firstChildNode, builder, true)
if (takeNext) node.treeNext?.let { collectNameParts(it, builder, true) }
}
}
}
fun qualifiedName(node: ASTNode): String = buildString {
collectNameParts(node, this, false)
}
val rawQualifiedName = when (annotation.qualifiedName) {
// A temporary fix for KT-60482
"<error>" -> (annotation as? KtLightElement<*, *>)?.kotlinOrigin?.node?.let { qualifiedName(it) }
else -> annotation.qualifiedName
} ?: return null
val fqName = treeMaker.getQualifiedName(rawQualifiedName)
if (BLACKLISTED_ANNOTATIONS.any { fqName.startsWith(it) }) return null