From 6475942cedce78d877c1070e3b59d18bdc5ccbf5 Mon Sep 17 00:00:00 2001 From: strangepleasures Date: Tue, 12 Sep 2023 16:58:13 +0000 Subject: [PATCH] [KAPT4] A temporary workaround for KT-60482 --- .../testData/converter/kt32596.fir.txt | 106 ++++++++++++++++++ .../testData/converter/kt32596.kt | 13 ++- .../testData/converter/kt32596.txt | 23 ++++ .../kotlin/kapt4/Kapt4StubGenerator.kt | 34 +++++- 4 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 plugins/kapt3/kapt3-compiler/testData/converter/kt32596.fir.txt diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.fir.txt b/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.fir.txt new file mode 100644 index 00000000000..5b15f48e9f0 --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.fir.txt @@ -0,0 +1,106 @@ +/** + * public final annotation class Anno : kotlin/Annotation { + * + * // signature: (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: ()V + * public constructor() + * + * // module name: main + * } + */ +@kotlin.Metadata() +@ABC() +public final class ErrorMissingAnnotation { + + public ErrorMissingAnnotation() { + super(); + } +} + +//////////////////// + + +/** + * public final class ErrorMultipleMissingAnnotations : kotlin/Any { + * + * // signature: ()V + * public constructor() + * + * // module name: main + * } + */ +@kotlin.Metadata() +@ABC() +@CDE() +public final class ErrorMultipleMissingAnnotations { + + public ErrorMultipleMissingAnnotations() { + super(); + } +} + +//////////////////// + + +/** + * public final class ErrorSomeMissingAnnotations : kotlin/Any { + * + * // signature: ()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: ()V + * public constructor() + * + * // module name: main + * } + */ +@kotlin.Metadata() +@com.example.XYZ() +public final class FullyQualifiedMissingAnnotation { + + public FullyQualifiedMissingAnnotation() { + super(); + } +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.kt b/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.kt index d1146e8fdfd..cda35381bac 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.kt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.kt @@ -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 diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.txt b/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.txt index 4a0e877e041..efbb860c453 100644 --- a/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.txt +++ b/plugins/kapt3/kapt3-compiler/testData/converter/kt32596.txt @@ -91,3 +91,26 @@ public final class ErrorSomeMissingAnnotations { super(); } } + +//////////////////// + + +import kotlin.reflect.KClass; + +@com.example.XYZ() +/** + * public final class FullyQualifiedMissingAnnotation : kotlin/Any { + * + * // signature: ()V + * public constructor() + * + * // module name: main + * } + */ +@kotlin.Metadata() +public final class FullyQualifiedMissingAnnotation { + + public FullyQualifiedMissingAnnotation() { + super(); + } +} diff --git a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4StubGenerator.kt b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4StubGenerator.kt index cdc76b1c633..15c5d770387 100644 --- a/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4StubGenerator.kt +++ b/plugins/kapt4/src/org/jetbrains/kotlin/kapt4/Kapt4StubGenerator.kt @@ -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 + "" -> (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