Make retention of 'kotlin.annotation.annotation' to SOURCE. Serialize / deserialize it instead. Some fixed tests.

This commit is contained in:
Mikhail Glukhikh
2015-07-21 13:44:34 +03:00
parent 11f87e6ca1
commit 414c44ade5
10 changed files with 77 additions and 31 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.codegen;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
@@ -52,6 +53,14 @@ public class JvmSerializerExtension extends SerializerExtension {
this.typeMapper = typeMapper;
}
@Override
public void serializeClass(@NotNull ClassDescriptor descriptor, @NotNull ProtoBuf.Class.Builder proto, @NotNull StringTable stringTable) {
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(KotlinBuiltIns.FQ_NAMES.annotation);
if (annotation != null) {
proto.addExtension(JvmProtoBuf.classAnnotation, annotationSerializer.serializeAnnotation(annotation, stringTable));
}
}
@Override
public void serializeCallable(
@NotNull CallableMemberDescriptor callable,
@@ -12,6 +12,7 @@ public final class DebugJvmProtoBuf {
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.implClassName);
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.typeAnnotation);
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.index);
registry.add(org.jetbrains.kotlin.serialization.jvm.DebugJvmProtoBuf.classAnnotation);
}
public interface JvmTypeOrBuilder
extends com.google.protobuf.MessageOrBuilder {
@@ -3785,6 +3786,17 @@ public final class DebugJvmProtoBuf {
.newFileScopedGeneratedExtension(
java.lang.Integer.class,
null);
public static final int CLASS_ANNOTATION_FIELD_NUMBER = 100;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessage.GeneratedExtension<
org.jetbrains.kotlin.serialization.DebugProtoBuf.Class,
java.util.List<org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation>> classAnnotation = com.google.protobuf.GeneratedMessage
.newFileScopedGeneratedExtension(
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.class,
org.jetbrains.kotlin.serialization.DebugProtoBuf.Annotation.getDefaultInstance());
private static com.google.protobuf.Descriptors.Descriptor
internal_static_org_jetbrains_kotlin_serialization_jvm_JvmType_descriptor;
private static
@@ -3853,8 +3865,11 @@ public final class DebugJvmProtoBuf {
"s.kotlin.serialization.Type\030d \003(\0132..org." +
"jetbrains.kotlin.serialization.Annotatio" +
"n:J\n\005index\022;.org.jetbrains.kotlin.serial" +
"ization.Callable.ValueParameter\030d \001(\005B\022B",
"\020DebugJvmProtoBuf"
"ization.Callable.ValueParameter\030d \001(\005:s\n",
"\020class_annotation\022).org.jetbrains.kotlin" +
".serialization.Class\030d \003(\0132..org.jetbrai" +
"ns.kotlin.serialization.AnnotationB\022B\020De" +
"bugJvmProtoBuf"
};
com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
@@ -3890,6 +3905,7 @@ public final class DebugJvmProtoBuf {
implClassName.internalInit(descriptor.getExtensions().get(2));
typeAnnotation.internalInit(descriptor.getExtensions().get(3));
index.internalInit(descriptor.getExtensions().get(4));
classAnnotation.internalInit(descriptor.getExtensions().get(5));
return null;
}
};
@@ -85,7 +85,7 @@ public annotation class target(vararg val allowedTargets: AnnotationTarget)
* @property repeatable true if annotation is repeatable (applicable twice or more on a single code element), otherwise false (default)
*/
target(AnnotationTarget.ANNOTATION_CLASS)
public annotation class annotation (
public annotation(retention = AnnotationRetention.SOURCE) class annotation (
val retention: AnnotationRetention = AnnotationRetention.RUNTIME,
val repeatable: Boolean = false
)
@@ -93,3 +93,7 @@ extend org.jetbrains.kotlin.serialization.Callable.ValueParameter {
// Index of the corresponding parameter of this method in JVM (counting receiver parameters, enum constructor synthetic parameters, etc.)
optional int32 index = 100;
}
extend org.jetbrains.kotlin.serialization.Class {
repeated Annotation class_annotation = 100;
}
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.serialization.deserialization.AnnotationDeserializer
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.types.ErrorUtils
import java.util.ArrayList
@@ -50,6 +51,18 @@ public class BinaryClassAnnotationAndConstantLoaderImpl(
private val annotationDeserializer = AnnotationDeserializer(module)
private val factory = ConstantValueFactory(module.builtIns)
override fun loadClassAnnotations(
classProto: ProtoBuf.Class,
nameResolver: NameResolver
): List<AnnotationDescriptor> {
val binaryAnnotationDescriptors = super.loadClassAnnotations(classProto, nameResolver)
val serializedAnnotations = classProto.getExtension(JvmProtoBuf.classAnnotation).orEmpty()
val serializedAnnotationDescriptors = serializedAnnotations.map {
annotationDeserializer.deserializeAnnotation(it, nameResolver)
}
return binaryAnnotationDescriptors + serializedAnnotationDescriptors
}
override fun loadTypeAnnotation(proto: ProtoBuf.Annotation, nameResolver: NameResolver): AnnotationDescriptor =
annotationDeserializer.deserializeAnnotation(proto, nameResolver)
@@ -12,6 +12,7 @@ public final class JvmProtoBuf {
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.implClassName);
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeAnnotation);
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.index);
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classAnnotation);
}
public interface JvmTypeOrBuilder
extends com.google.protobuf.MessageLiteOrBuilder {
@@ -2880,6 +2881,21 @@ public final class JvmProtoBuf {
null,
100,
com.google.protobuf.WireFormat.FieldType.INT32);
public static final int CLASS_ANNOTATION_FIELD_NUMBER = 100;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessageLite.GeneratedExtension<
org.jetbrains.kotlin.serialization.ProtoBuf.Class,
java.util.List<org.jetbrains.kotlin.serialization.ProtoBuf.Annotation>> classAnnotation = com.google.protobuf.GeneratedMessageLite
.newRepeatedGeneratedExtension(
org.jetbrains.kotlin.serialization.ProtoBuf.Class.getDefaultInstance(),
org.jetbrains.kotlin.serialization.ProtoBuf.Annotation.getDefaultInstance(),
null,
100,
com.google.protobuf.WireFormat.FieldType.MESSAGE,
false);
static {
}
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.serialization.deserialization.AnnotationAndConstantL
import org.jetbrains.kotlin.serialization.deserialization.ClassDataFinder
import org.jetbrains.kotlin.serialization.deserialization.ErrorReporter
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
import org.jetbrains.kotlin.storage.LockBasedStorageManager
class ClsStubBuilderComponents(
@@ -92,6 +93,17 @@ class AnnotationLoaderForStubBuilder(
errorReporter: ErrorReporter
) : AbstractBinaryClassAnnotationAndConstantLoader<ClassId, Unit>(
LockBasedStorageManager.NO_LOCKS, kotlinClassFinder, errorReporter) {
override fun loadClassAnnotations(
classProto: ProtoBuf.Class,
nameResolver: NameResolver
): List<ClassId> {
val binaryAnnotationDescriptors = super.loadClassAnnotations(classProto, nameResolver)
val serializedAnnotations = classProto.getExtension(JvmProtoBuf.classAnnotation).orEmpty()
val serializedAnnotationDescriptors = serializedAnnotations.map { nameResolver.getClassId(it.id) }
return binaryAnnotationDescriptors + serializedAnnotationDescriptors
}
override fun loadTypeAnnotation(proto: ProtoBuf.Annotation, nameResolver: NameResolver): ClassId =
nameResolver.getClassId(proto.getId())
@@ -15,17 +15,6 @@ PsiJetFileStubImpl[package=test.a]
REFERENCE_EXPRESSION:[referencedName=kotlin]
REFERENCE_EXPRESSION:[referencedName=annotation]
REFERENCE_EXPRESSION:[referencedName=annotation]
ANNOTATION_ENTRY:[hasValueArguments=false, shortName=Retention]
CONSTRUCTOR_CALLEE:
TYPE_REFERENCE:
USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false]
REFERENCE_EXPRESSION:[referencedName=java]
REFERENCE_EXPRESSION:[referencedName=lang]
REFERENCE_EXPRESSION:[referencedName=annotation]
REFERENCE_EXPRESSION:[referencedName=Retention]
PRIMARY_CONSTRUCTOR:
MODIFIER_LIST:[public]
VALUE_PARAMETER_LIST:
@@ -123,17 +123,6 @@ PsiJetFileStubImpl[package=test.class_object]
REFERENCE_EXPRESSION:[referencedName=kotlin]
REFERENCE_EXPRESSION:[referencedName=annotation]
REFERENCE_EXPRESSION:[referencedName=annotation]
ANNOTATION_ENTRY:[hasValueArguments=false, shortName=Retention]
CONSTRUCTOR_CALLEE:
TYPE_REFERENCE:
USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false]
USER_TYPE:[isAbsoluteInRootPackage=false]
REFERENCE_EXPRESSION:[referencedName=java]
REFERENCE_EXPRESSION:[referencedName=lang]
REFERENCE_EXPRESSION:[referencedName=annotation]
REFERENCE_EXPRESSION:[referencedName=Retention]
PRIMARY_CONSTRUCTOR:
MODIFIER_LIST:[public]
VALUE_PARAMETER_LIST:
@@ -1,8 +1,6 @@
a kotlin.annotation.annotation 0
a java.lang.annotation.Retention 0
p org.test 0
c 0 0/SomeAnnotation
a java.lang.annotation.Retention 1
c 1 0/SomeAnnotation
a org.test.SomeAnnotation 2
c 2 0/SomeClass
m 2 0/SomeClass annotatedFunction
a org.test.SomeAnnotation 1
c 1 0/SomeClass
m 1 0/SomeClass annotatedFunction