diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java index ea8ec4cfc90..743f16ad101 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/FileBasedKotlinClass.java @@ -20,16 +20,15 @@ import com.intellij.openapi.util.Ref; import kotlin.jvm.functions.Function4; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap; import org.jetbrains.kotlin.descriptors.SourceElement; import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader; import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; -import org.jetbrains.org.objectweb.asm.ClassReader; -import org.jetbrains.org.objectweb.asm.ClassVisitor; -import org.jetbrains.org.objectweb.asm.FieldVisitor; -import org.jetbrains.org.objectweb.asm.MethodVisitor; +import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType; +import org.jetbrains.org.objectweb.asm.*; import java.util.*; @@ -173,7 +172,13 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { return new org.jetbrains.org.objectweb.asm.AnnotationVisitor(ASM5) { @Override public void visit(String name, @NotNull Object value) { - v.visit(name == null ? null : Name.identifier(name), value); + if (value instanceof Type) { + ClassLiteralId classLiteralId = resolveKotlinNameByType((Type)value, innerClasses); + v.visitClassLiteral(Name.identifier(name), classLiteralId); + } + else { + v.visit(name == null ? null : Name.identifier(name), value); + } } @Override @@ -182,7 +187,13 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { return arv == null ? null : new org.jetbrains.org.objectweb.asm.AnnotationVisitor(ASM5) { @Override public void visit(String name, @NotNull Object value) { - arv.visit(value); + if (value instanceof Type) { + ClassLiteralId classLiteralId = resolveKotlinNameByType((Type)value, innerClasses); + arv.visitClassLiteral(classLiteralId); + } + else { + arv.visit(value); + } } @Override @@ -270,6 +281,20 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { return resolveNameByInternalName(name, innerClasses); } + @NotNull + private static ClassLiteralId resolveKotlinNameByType(@NotNull Type type, @NotNull InnerClassesInfo innerClasses) { + String typeDesc = type.getDescriptor(); + int nestedness = typeDesc.charAt(0) == '[' ? type.getDimensions() : 0; + String elementDesc = nestedness == 0 ? typeDesc : type.getElementType().getDescriptor(); + JvmPrimitiveType primType = JvmPrimitiveType.getByDesc(elementDesc); + if (primType != null) { + return new ClassLiteralId(ClassId.topLevel(primType.getPrimitiveType().getTypeFqName()), nestedness); + } + ClassId javaClassId = resolveNameByDesc(elementDesc, innerClasses); + ClassId kotlinClassId = JavaToKotlinClassMap.INSTANCE.mapJavaToKotlin(javaClassId.asSingleFqName()); + return new ClassLiteralId(kotlinClassId != null ? kotlinClassId : javaClassId, nestedness); + } + @NotNull private static ClassId resolveNameByInternalName(@NotNull String name, @NotNull InnerClassesInfo innerClasses) { if (!name.contains("$")) { diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt b/compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt new file mode 100644 index 00000000000..b6c1e19f72c --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt @@ -0,0 +1,18 @@ +package test + +import kotlin.reflect.KClass + +annotation class Anno( + val klass: KClass<*>, + val klasses: Array>, + val sarKlass: KClass>, + val d2arKlass: KClass> +) + +@Anno( + String::class, + arrayOf(Int::class, String::class, Float::class), + Array::class, + Array::class +) +class Klass diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.txt b/compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.txt new file mode 100644 index 00000000000..49af901e7df --- /dev/null +++ b/compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.txt @@ -0,0 +1,17 @@ +package test + +public final annotation class Anno : kotlin.Annotation { + /*primary*/ public constructor Anno(/*0*/ klass: kotlin.reflect.KClass<*>, /*1*/ klasses: kotlin.Array>, /*2*/ sarKlass: kotlin.reflect.KClass>, /*3*/ d2arKlass: kotlin.reflect.KClass>) + public final val d2arKlass: kotlin.reflect.KClass> + public final fun (): kotlin.reflect.KClass> + public final val klass: kotlin.reflect.KClass<*> + public final fun (): kotlin.reflect.KClass<*> + public final val klasses: kotlin.Array> + public final fun (): kotlin.Array> + public final val sarKlass: kotlin.reflect.KClass> + public final fun (): kotlin.reflect.KClass> +} + +@test.Anno(d2arKlass = kotlin.Array::class, klass = kotlin.String::class, klasses = {kotlin.Int::class, kotlin.String::class, kotlin.Float::class}, sarKlass = kotlin.Array::class) public final class Klass { + /*primary*/ public constructor Klass() +} diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java index 29be197ce37..bc8b1b96f44 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadJavaTestGenerated.java @@ -1712,6 +1712,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInAnnotationArguments.kt"); } + @TestMetadata("ClassLiteralArguments.kt") + public void testClassLiteralArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt"); + } + @TestMetadata("EnumArgumentWithCustomToString.kt") public void testEnumArgumentWithCustomToString() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/annotations/EnumArgumentWithCustomToString.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java index 38fdf053fc2..f14f5b3294c 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/LoadKotlinWithTypeTableTestGenerated.java @@ -56,6 +56,11 @@ public class LoadKotlinWithTypeTableTestGenerated extends AbstractLoadKotlinWith runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInAnnotationArguments.kt"); } + @TestMetadata("ClassLiteralArguments.kt") + public void testClassLiteralArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt"); + } + @TestMetadata("EnumArgumentWithCustomToString.kt") public void testEnumArgumentWithCustomToString() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/annotations/EnumArgumentWithCustomToString.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java index 4744420fb31..9f61c6d65aa 100644 --- a/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/jvm/compiler/javac/LoadJavaUsingJavacTestGenerated.java @@ -1712,6 +1712,11 @@ public class LoadJavaUsingJavacTestGenerated extends AbstractLoadJavaUsingJavacT runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInAnnotationArguments.kt"); } + @TestMetadata("ClassLiteralArguments.kt") + public void testClassLiteralArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt"); + } + @TestMetadata("EnumArgumentWithCustomToString.kt") public void testEnumArgumentWithCustomToString() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/annotations/EnumArgumentWithCustomToString.kt"); diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt index 163c37d93a5..c5b35c3c17f 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt @@ -16,11 +16,9 @@ package org.jetbrains.kotlin.load.kotlin +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor -import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptorImpl -import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget -import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget +import org.jetbrains.kotlin.descriptors.annotations.* import org.jetbrains.kotlin.load.java.components.DescriptorResolverUtils import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass.AnnotationArrayArgumentVisitor import org.jetbrains.kotlin.metadata.ProtoBuf @@ -30,6 +28,9 @@ import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.constants.* import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer import org.jetbrains.kotlin.storage.StorageManager +import org.jetbrains.kotlin.types.KotlinTypeFactory +import org.jetbrains.kotlin.types.TypeProjectionImpl +import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.compact import java.util.* @@ -103,6 +104,11 @@ class BinaryClassAnnotationAndConstantLoaderImpl( } } + override fun visitClassLiteral(name: Name, classLiteralId: KotlinJvmBinaryClass.ClassLiteralId) { + arguments[name] = classLiteralId.toClassValue() ?: + ErrorValue.create("Error value of annotation argument: $name: class ${classLiteralId.classId.asSingleFqName()} not found") + } + override fun visitEnum(name: Name, enumClassId: ClassId, enumEntryName: Name) { arguments[name] = EnumValue(enumClassId, enumEntryName) } @@ -119,6 +125,13 @@ class BinaryClassAnnotationAndConstantLoaderImpl( elements.add(EnumValue(enumClassId, enumEntryName)) } + override fun visitClassLiteral(classLiteralId: KotlinJvmBinaryClass.ClassLiteralId) { + elements.add( + classLiteralId.toClassValue() + ?: ErrorValue.create("Error array element value of annotation argument: $name: class ${classLiteralId.classId.asSingleFqName()} not found") + ) + } + override fun visitEnd() { val parameter = DescriptorResolverUtils.getAnnotationParameterByName(name, annotationClass) if (parameter != null) { @@ -150,6 +163,21 @@ class BinaryClassAnnotationAndConstantLoaderImpl( } } + private fun KotlinJvmBinaryClass.ClassLiteralId.toClassValue(): KClassValue? = + module.findClassAcrossModuleDependencies(this.classId)?.let { classDescriptor -> + var currentType = classDescriptor.defaultType + for (i in 0 until this.arrayNestedness) { + val nextWrappedType = + (if (i == 0) module.builtIns.getPrimitiveArrayKotlinTypeByPrimitiveKotlinType(currentType) else null) + ?: module.builtIns.getArrayType(Variance.INVARIANT, currentType) + currentType = nextWrappedType + } + val kClass = resolveClass(ClassId.topLevel(KotlinBuiltIns.FQ_NAMES.kClass.toSafe())) + val arguments = listOf(TypeProjectionImpl(currentType)) + val type = KotlinTypeFactory.simpleNotNullType(Annotations.EMPTY, kClass, arguments) + KClassValue(type) + } + private fun resolveClass(classId: ClassId): ClassDescriptor { return module.findNonGenericClassAcrossDependencies(classId, notFoundClasses) } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt index 7c3a4e7d4be..6bf2559cda1 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.kt @@ -53,10 +53,13 @@ interface KotlinJvmBinaryClass { fun visitParameterAnnotation(index: Int, classId: ClassId, source: SourceElement): AnnotationArgumentVisitor? } + class ClassLiteralId(val classId: ClassId, val arrayNestedness: Int) + interface AnnotationArgumentVisitor { - // TODO: class literals fun visit(name: Name?, value: Any?) + fun visitClassLiteral(name: Name, classLiteralId: ClassLiteralId) + fun visitEnum(name: Name, enumClassId: ClassId, enumEntryName: Name) fun visitAnnotation(name: Name, classId: ClassId): AnnotationArgumentVisitor? @@ -71,6 +74,8 @@ interface KotlinJvmBinaryClass { fun visitEnum(enumClassId: ClassId, enumEntryName: Name) + fun visitClassLiteral(classLiteralId: ClassLiteralId) + fun visitEnd() } } diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java index 294c99a05d4..c9f1a2e2755 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java @@ -162,6 +162,10 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } } + @Override + public void visitClassLiteral(@NotNull Name name, @NotNull ClassLiteralId classLiteralId) { + } + @Override @Nullable public AnnotationArrayArgumentVisitor visitArray(@NotNull Name name) { @@ -233,6 +237,10 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor } } + @Override + public void visitClassLiteral(@NotNull Name name, @NotNull ClassLiteralId classLiteralId) { + } + @Override @Nullable public AnnotationArrayArgumentVisitor visitArray(@NotNull Name name) { @@ -301,6 +309,10 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor public void visitEnum(@NotNull ClassId enumClassId, @NotNull Name enumEntryName) { } + @Override + public void visitClassLiteral(@NotNull ClassLiteralId classLiteralId) { + } + @Override public void visitEnd() { //noinspection SSBasedInspection diff --git a/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java b/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java index cc2486dc889..49b388637b4 100644 --- a/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java +++ b/core/descriptors.jvm/src/org/jetbrains/kotlin/resolve/jvm/JvmPrimitiveType.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve.jvm; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.builtins.PrimitiveType; import org.jetbrains.kotlin.name.FqName; @@ -36,16 +37,19 @@ public enum JvmPrimitiveType { private static final Set WRAPPERS_CLASS_NAMES; private static final Map TYPE_BY_NAME; private static final Map TYPE_BY_PRIMITIVE_TYPE; + private static final Map TYPE_BY_DESC; static { WRAPPERS_CLASS_NAMES = new HashSet(); TYPE_BY_NAME = new HashMap(); TYPE_BY_PRIMITIVE_TYPE = new EnumMap(PrimitiveType.class); + TYPE_BY_DESC = new HashMap(); for (JvmPrimitiveType type : values()) { WRAPPERS_CLASS_NAMES.add(type.getWrapperFqName()); TYPE_BY_NAME.put(type.getJavaKeywordName(), type); TYPE_BY_PRIMITIVE_TYPE.put(type.getPrimitiveType(), type); + TYPE_BY_DESC.put(type.getDesc(), type); } } @@ -67,6 +71,11 @@ public enum JvmPrimitiveType { return TYPE_BY_PRIMITIVE_TYPE.get(type); } + @Nullable + public static JvmPrimitiveType getByDesc(@NotNull String desc) { + return TYPE_BY_DESC.get(desc); + } + private final PrimitiveType primitiveType; private final String name; private final String desc; diff --git a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt index fdf5f02e57e..79131bc6c37 100644 --- a/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt +++ b/core/descriptors.runtime/src/kotlin/reflect/jvm/internal/components/ReflectKotlinClass.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.resolve.jvm.JvmPrimitiveType import java.lang.reflect.Constructor import java.lang.reflect.Field import java.lang.reflect.Method @@ -183,9 +184,25 @@ private object ReflectClassStructure { visitor.visitEnd() } + private fun Class<*>.classLiteralId(): KotlinJvmBinaryClass.ClassLiteralId { + var currentClass = this + var nestedness = 0 + while (currentClass.isArray) { + nestedness++ + currentClass = currentClass.componentType + } + val classId = + if (!currentClass.isPrimitive) currentClass.classId + else ClassId.topLevel(JvmPrimitiveType.get(currentClass.name).primitiveType.typeFqName) + return KotlinJvmBinaryClass.ClassLiteralId(classId, nestedness) + } + private fun processAnnotationArgumentValue(visitor: KotlinJvmBinaryClass.AnnotationArgumentVisitor, name: Name, value: Any) { val clazz = value::class.java when { + clazz == Class::class.java -> { + visitor.visitClassLiteral(name, (value as Class<*>).classLiteralId()) + } clazz in TYPES_ELIGIBLE_FOR_SIMPLE_VISIT -> { visitor.visit(name, value) } @@ -208,6 +225,11 @@ private object ReflectClassStructure { v.visitEnum(enumClassId, Name.identifier((element as Enum<*>).name)) } } + else if (componentType == Class::class.java) { + for (element in value as Array<*>) { + v.visitClassLiteral((element as Class<*>).classLiteralId()) + } + } else { for (element in value as Array<*>) { v.visit(element) diff --git a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java index 6cbfede6b83..0ad2a5271f0 100644 --- a/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java +++ b/core/descriptors.runtime/tests/org/jetbrains/kotlin/jvm/runtime/JvmRuntimeDescriptorLoaderTestGenerated.java @@ -58,6 +58,11 @@ public class JvmRuntimeDescriptorLoaderTestGenerated extends AbstractJvmRuntimeD runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInAnnotationArguments.kt"); } + @TestMetadata("ClassLiteralArguments.kt") + public void testClassLiteralArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt"); + } + @TestMetadata("EnumArgumentWithCustomToString.kt") public void testEnumArgumentWithCustomToString() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/annotations/EnumArgumentWithCustomToString.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/LoadJavaClsStubTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/LoadJavaClsStubTestGenerated.java index 2f0d4fc420e..c21753c3862 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/LoadJavaClsStubTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/decompiler/stubBuilder/LoadJavaClsStubTestGenerated.java @@ -56,6 +56,11 @@ public class LoadJavaClsStubTestGenerated extends AbstractLoadJavaClsStubTest { runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInAnnotationArguments.kt"); } + @TestMetadata("ClassLiteralArguments.kt") + public void testClassLiteralArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt"); + } + @TestMetadata("EnumArgumentWithCustomToString.kt") public void testEnumArgumentWithCustomToString() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/annotations/EnumArgumentWithCustomToString.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java index a78cdac4b16..7ef843f6a23 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/stubs/ResolveByStubTestGenerated.java @@ -56,6 +56,11 @@ public class ResolveByStubTestGenerated extends AbstractResolveByStubTest { runTest("compiler/testData/loadJava/compiledKotlin/annotations/AnnotationInAnnotationArguments.kt"); } + @TestMetadata("ClassLiteralArguments.kt") + public void testClassLiteralArguments() throws Exception { + runTest("compiler/testData/loadJava/compiledKotlin/annotations/ClassLiteralArguments.kt"); + } + @TestMetadata("EnumArgumentWithCustomToString.kt") public void testEnumArgumentWithCustomToString() throws Exception { runTest("compiler/testData/loadJava/compiledKotlin/annotations/EnumArgumentWithCustomToString.kt");