Loading of annotation class arguments from compiled classes

This commit is contained in:
Valentin Kipyatkov
2015-05-21 20:11:31 +03:00
parent b256329287
commit 281acb860e
4 changed files with 27 additions and 4 deletions
@@ -26,10 +26,7 @@ import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVi
import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.ClassId;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.org.objectweb.asm.ClassReader; import org.jetbrains.org.objectweb.asm.*;
import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor;
import org.jetbrains.org.objectweb.asm.MethodVisitor;
import java.util.*; 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 @Override
public void visitEnum(String name, @NotNull String desc, @NotNull String value) { public void visitEnum(String name, @NotNull String desc, @NotNull String value) {
v.visitEnum(Name.identifier(name), resolveNameByDesc(desc, innerClasses), Name.identifier(value)); v.visitEnum(Name.identifier(name), resolveNameByDesc(desc, innerClasses), Name.identifier(value));
@@ -113,6 +113,17 @@ public class BinaryClassAnnotationAndConstantLoaderImpl(
} }
} }
override fun visitAnnotation(name: Name, classId: ClassId): KotlinJvmBinaryClass.AnnotationArgumentVisitor? {
val list = ArrayList<AnnotationDescriptor>()
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 // NOTE: see analogous code in AnnotationDeserializer
private fun enumEntryValue(enumClassId: ClassId, name: Name): CompileTimeConstant<*> { private fun enumEntryValue(enumClassId: ClassId, name: Name): CompileTimeConstant<*> {
val enumClass = resolveClass(enumClassId) val enumClass = resolveClass(enumClassId)
@@ -67,6 +67,9 @@ public interface KotlinJvmBinaryClass {
void visitEnum(@NotNull Name name, @NotNull ClassId enumClassId, @NotNull Name enumEntryName); void visitEnum(@NotNull Name name, @NotNull ClassId enumClassId, @NotNull Name enumEntryName);
@Nullable
AnnotationArgumentVisitor visitAnnotation(@NotNull Name name, @NotNull ClassId classId);
@Nullable @Nullable
AnnotationArrayArgumentVisitor visitArray(@NotNull Name name); AnnotationArrayArgumentVisitor visitArray(@NotNull Name name);
@@ -149,6 +149,12 @@ public class ReadKotlinClassHeaderAnnotationVisitor implements AnnotationVisitor
return null; return null;
} }
@Nullable
@Override
public AnnotationArgumentVisitor visitAnnotation(@NotNull Name name, @NotNull ClassId classId) {
return null;
}
@NotNull @NotNull
private AnnotationArrayArgumentVisitor stringArrayVisitor() { private AnnotationArrayArgumentVisitor stringArrayVisitor() {
final List<String> strings = new ArrayList<String>(1); final List<String> strings = new ArrayList<String>(1);