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 14c558291e2..a5c392f88ce 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 @@ -26,10 +26,7 @@ import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVi 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.org.objectweb.asm.*; import java.util.*; @@ -187,6 +184,12 @@ public abstract class FileBasedKotlinClass implements KotlinJvmBinaryClass { }; } + @Override + public org.jetbrains.org.objectweb.asm.AnnotationVisitor visitAnnotation(String name, @NotNull String desc) { + AnnotationArgumentVisitor arv = v.visitAnnotation(Name.guess(name), resolveNameByDesc(desc, innerClasses)); + return arv == null ? null : convertAnnotationVisitor(arv, innerClasses); + } + @Override public void visitEnum(String name, @NotNull String desc, @NotNull String value) { v.visitEnum(Name.identifier(name), resolveNameByDesc(desc, innerClasses), Name.identifier(value)); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt index 3f1075a2a45..78504d9db8b 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/BinaryClassAnnotationAndConstantLoaderImpl.kt @@ -113,6 +113,17 @@ public class BinaryClassAnnotationAndConstantLoaderImpl( } } + override fun visitAnnotation(name: Name, classId: ClassId): KotlinJvmBinaryClass.AnnotationArgumentVisitor? { + val list = ArrayList() + val visitor = loadAnnotation(classId, list)!! + return object: KotlinJvmBinaryClass.AnnotationArgumentVisitor by visitor { + override fun visitEnd() { + visitor.visitEnd() + setArgumentValueByName(name, AnnotationValue(list.single())) + } + } + } + // NOTE: see analogous code in AnnotationDeserializer private fun enumEntryValue(enumClassId: ClassId, name: Name): CompileTimeConstant<*> { val enumClass = resolveClass(enumClassId) diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java index 9dc298c3776..c5d452be9e5 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmBinaryClass.java @@ -67,6 +67,9 @@ public interface KotlinJvmBinaryClass { void visitEnum(@NotNull Name name, @NotNull ClassId enumClassId, @NotNull Name enumEntryName); + @Nullable + AnnotationArgumentVisitor visitAnnotation(@NotNull Name name, @NotNull ClassId classId); + @Nullable AnnotationArrayArgumentVisitor visitArray(@NotNull Name name); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java index 2ef14721a66..8d378365ded 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/kotlin/header/ReadKotlinClassHeaderAnnotationVisitor.java @@ -149,6 +149,12 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor return null; } + @Nullable + @Override + public AnnotationArgumentVisitor visitAnnotation(@NotNull Name name, @NotNull ClassId classId) { + return null; + } + @NotNull private AnnotationArrayArgumentVisitor stringArrayVisitor() { final List strings = new ArrayList(1);