Support instantiation of annotations with type parameters
By ignoring type parameters. Since type parameters in annotations are a very limited feature, their sole use is to be able to specify them as KClass argument: annotation class Foo<T: Any>(val bar: KClass<T>). Since we can encounter type param only as a KClass type argument (and never as a property type), simple approach of ignoring them works fine. In that case, since we simply copy property types to synthetic implementation class, its properties in IR start look like this: annotation class FooImpl(override val bar: KClass<T of Foo>). This IR seems to be not completely correct, since FooImpl.bar type contains T of Foo param, which is out of its scope. However, so far I didn't encounter any problems with this during testing and after MR discussion this approach has been considered possible. #KT-59558 Fixed #KT-59036 Fixed
This commit is contained in:
committed by
Space Team
parent
8c795462e1
commit
648c1f4599
+1
-1
@@ -79,7 +79,6 @@ abstract class AnnotationImplementationTransformer(val context: BackendContext,
|
||||
override fun visitConstructorCall(expression: IrConstructorCall): IrExpression {
|
||||
val constructedClass = expression.type.classOrNull?.owner ?: return super.visitConstructorCall(expression)
|
||||
if (!constructedClass.isAnnotationClass) return super.visitConstructorCall(expression)
|
||||
if (constructedClass.typeParameters.isNotEmpty()) return super.visitConstructorCall(expression) // Not supported yet
|
||||
require(expression.symbol.owner.isPrimary) { "Non-primary constructors of annotations are not supported" }
|
||||
|
||||
val implClass = implementations.getOrPut(constructedClass) { createAnnotationImplementation(constructedClass) }
|
||||
@@ -158,6 +157,7 @@ abstract class AnnotationImplementationTransformer(val context: BackendContext,
|
||||
createImplicitParameterDeclarationWithWrappedDescriptor()
|
||||
superTypes = listOf(annotationClass.defaultType)
|
||||
platformSetup()
|
||||
// Type parameters can be copied from annotationClass, but in fact they are never used by any of the backends.
|
||||
}
|
||||
|
||||
val ctor = subclass.addConstructor {
|
||||
|
||||
Reference in New Issue
Block a user