From 5ea38437c2a05374f106c3687b9738d5e62f22db Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 22 Jul 2013 19:23:30 +0400 Subject: [PATCH] KotlinClassFileHeader determines what kind of annotation it contains Add some stronger assertions about class file format --- .../java/resolver/KotlinClassFileHeader.java | 37 +++++++++++++++++-- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/KotlinClassFileHeader.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/KotlinClassFileHeader.java index 27e79129085..16f3bc8e916 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/KotlinClassFileHeader.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/resolver/KotlinClassFileHeader.java @@ -12,6 +12,7 @@ import org.jetbrains.jet.descriptors.serialization.JavaProtoBufUtil; import org.jetbrains.jet.descriptors.serialization.PackageData; import org.jetbrains.jet.lang.resolve.java.AbiVersionUtil; import org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames; +import org.jetbrains.jet.lang.resolve.java.JvmClassName; import org.jetbrains.jet.utils.ExceptionUtils; import java.io.IOException; @@ -53,17 +54,36 @@ public final class KotlinClassFileHeader { } } + public enum HeaderType { + CLASS(JvmAnnotationNames.KOTLIN_CLASS), + PACKAGE(JvmAnnotationNames.KOTLIN_PACKAGE), + NONE(null); + + @Nullable + private final JvmClassName correspondingAnnotation; + + HeaderType(@Nullable JvmClassName annotation) { + correspondingAnnotation = annotation; + } + } + private int version = AbiVersionUtil.INVALID_VERSION; @Nullable private String[] annotationData = null; + @NotNull + HeaderType type = HeaderType.NONE; + public int getVersion() { return version; } @Nullable public String[] getAnnotationData() { + if (annotationData == null && type != HeaderType.NONE) { + throw new IllegalStateException("Data for annotations " + type.correspondingAnnotation + " was not read."); + } return annotationData; } @@ -75,11 +95,22 @@ public final class KotlinClassFileHeader { @Override public AnnotationVisitor visitAnnotation(final String desc, boolean visible) { - if (!desc.equals(JvmAnnotationNames.KOTLIN_CLASS.getDescriptor()) && - !desc.equals(JvmAnnotationNames.KOTLIN_PACKAGE.getDescriptor())) { + for (HeaderType headerType : HeaderType.values()) { + JvmClassName annotation = headerType.correspondingAnnotation; + if (annotation == null) { + continue; + } + if (desc.equals(annotation.getDescriptor())) { + if (type != HeaderType.NONE) { + throw new IllegalStateException( + "Both " + type.correspondingAnnotation + " and " + headerType.correspondingAnnotation + " present!"); + } + type = headerType; + } + } + if (type == HeaderType.NONE) { return null; } - return new AnnotationVisitor(Opcodes.ASM4) { @Override public void visit(String name, Object value) {