Skip to content

Commit f868aa3

Browse files
udalovSpace Team
authored andcommitted
K2 kapt: generate full error type FQ name in annotation arguments
#KT-79136 Fixed
1 parent 6e3e0ed commit f868aa3

File tree

7 files changed

+104
-20
lines changed

7 files changed

+104
-20
lines changed

compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirCallResolver.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -827,7 +827,7 @@ class FirCallResolver(
827827
explicitReceiver.resolvedType,
828828
)
829829
reference is FirSuperReference && (reference.superTypeRef.firClassLike(session) as? FirClass)?.isInterface == true -> ConeNoConstructorError
830-
else -> ConeUnresolvedNameError(name, operatorToken)
830+
else -> ConeUnresolvedNameError(name, operatorToken, explicitReceiver?.resolvedType)
831831
}
832832
}
833833

compiler/fir/semantics/src/org/jetbrains/kotlin/fir/resolve/diagnostics/ConeDiagnostics.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ class ConeUnresolvedTypeQualifierError(val qualifiers: List<FirQualifierPart>) :
7373
class ConeUnresolvedNameError(
7474
val name: Name,
7575
val operatorToken: String? = null,
76+
val receiverType: ConeKotlinType? = null,
7677
) : ConeUnresolvedError {
7778
override val qualifier: String get() = name.asString()
7879
override val reason: String get() = "Unresolved name: $prettyReference"

plugins/kapt/kapt-compiler/src/org/jetbrains/kotlin/kapt/stubs/KaptStubConverter.kt

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import org.jetbrains.kotlin.fir.references.impl.FirPropertyFromParameterResolved
4949
import org.jetbrains.kotlin.fir.references.resolved
5050
import org.jetbrains.kotlin.fir.references.toResolvedEnumEntrySymbol
5151
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedError
52+
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError
5253
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
5354
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
5455
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
@@ -1570,26 +1571,32 @@ class KaptStubConverter(val kaptContext: KaptContextForStubGeneration, val gener
15701571

15711572
private fun convertFirType(originalType: ConeKotlinType): JCExpression? {
15721573
val type = originalType.fullyExpandedType(kaptContext.firSession!!)
1573-
val fqName = when (type) {
1574-
is ConeErrorType -> (type.diagnostic as? ConeUnresolvedError)?.qualifier
1575-
is ConeLookupTagBasedType -> {
1576-
val classId = (type.lookupTag as? ConeClassLikeLookupTag)?.classId ?: return null
1577-
val fqName = classId.asSingleFqName()
1578-
if (classId.packageFqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME) {
1579-
val primitiveType = PrimitiveType.getByShortName(classId.relativeClassName.asString())
1580-
if (primitiveType != null) {
1581-
return treeMaker.Type(Type.getType(JvmPrimitiveType.get(primitiveType).desc))
1582-
}
1583-
val primitiveArrayType = PrimitiveType.getByShortArrayName(classId.relativeClassName.asString())
1584-
if (primitiveArrayType != null) {
1585-
return treeMaker.Type(Type.getType("[" + JvmPrimitiveType.get(primitiveArrayType).desc))
1586-
}
1587-
}
1588-
JavaToKotlinClassMap.mapKotlinToJava(fqName.toUnsafe())?.asSingleFqName()?.asString() ?: fqName.asString()
1574+
if (type is ConeErrorType) {
1575+
val diagnostic = type.diagnostic as? ConeUnresolvedError
1576+
val simpleName = diagnostic?.qualifier ?: return null
1577+
val outerType = (diagnostic as? ConeUnresolvedNameError)?.receiverType
1578+
return if (outerType == null) {
1579+
treeMaker.SimpleName(simpleName)
1580+
} else {
1581+
treeMaker.Select(convertFirType(outerType), treeMaker.name(simpleName))
15891582
}
1590-
else -> null
1591-
} ?: return null
1592-
return treeMaker.FqName(fqName)
1583+
}
1584+
if (type !is ConeLookupTagBasedType) return null
1585+
val classId = (type.lookupTag as? ConeClassLikeLookupTag)?.classId ?: return null
1586+
val fqName = classId.asSingleFqName()
1587+
if (classId.packageFqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME) {
1588+
val primitiveType = PrimitiveType.getByShortName(classId.relativeClassName.asString())
1589+
if (primitiveType != null) {
1590+
return treeMaker.Type(Type.getType(JvmPrimitiveType.get(primitiveType).desc))
1591+
}
1592+
val primitiveArrayType = PrimitiveType.getByShortArrayName(classId.relativeClassName.asString())
1593+
if (primitiveArrayType != null) {
1594+
return treeMaker.Type(Type.getType("[" + JvmPrimitiveType.get(primitiveArrayType).desc))
1595+
}
1596+
}
1597+
return treeMaker.FqName(
1598+
JavaToKotlinClassMap.mapKotlinToJava(fqName.toUnsafe())?.asSingleFqName()?.asString() ?: fqName.asString()
1599+
)
15931600
}
15941601

15951602
private fun convertAnnotationArgumentWithName(
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
@file:Suppress("UNRESOLVED_REFERENCE", "ANNOTATION_ARGUMENT_MUST_BE_CONST", "NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION")
2+
package test
3+
4+
import kotlin.reflect.KClass
5+
6+
annotation class Anno(val value: Array<KClass<*>>)
7+
8+
@Anno(value = [
9+
A::class,
10+
A.B::class,
11+
A.B.C::class,
12+
])
13+
class Klass {
14+
private lateinit var x: A.B
15+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package test;
2+
3+
@java.lang.annotation.Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
4+
/**
5+
* public final annotation class test/Anno : kotlin/Annotation {
6+
*
7+
* // signature: <init>(Lkotlin/Array;)V
8+
* public constructor(value: kotlin/Array<kotlin/reflect/KClass<*>>)
9+
*
10+
* // getter: value()[Ljava/lang/Class;
11+
* public final val value: kotlin/Array<kotlin/reflect/KClass<*>>
12+
* public final get
13+
*
14+
* // module name: main
15+
* }
16+
*/
17+
@kotlin.Metadata()
18+
public abstract @interface Anno {
19+
20+
public abstract java.lang.Class<?>[] value();
21+
}
22+
23+
////////////////////
24+
25+
package test;
26+
27+
@Anno(value = {A.class, A.B.class, A.B.C.class})
28+
/**
29+
* public final class test/Klass : kotlin/Any {
30+
*
31+
* // signature: <init>()V
32+
* public constructor()
33+
*
34+
* // field: x:Lerror/NonExistentClass;
35+
* private final lateinit var x: error/NonExistentClass
36+
* private final get
37+
* private final set
38+
*
39+
* // module name: main
40+
* }
41+
*/
42+
@kotlin.Metadata()
43+
public final class Klass {
44+
private error.NonExistentClass x;
45+
46+
public Klass() {
47+
super();
48+
}
49+
}

plugins/kapt/kapt-compiler/tests-gen/org/jetbrains/kotlin/kapt/test/FirKaptStubConverterTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

plugins/kapt/kapt-compiler/tests-gen/org/jetbrains/kotlin/kapt/test/runners/KaptStubConverterTestGenerated.java

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)