Write module name as proto extension instead of another annotation argument

This commit is contained in:
Alexander Udalov
2015-12-30 19:17:02 +03:00
parent d4c4515944
commit a4daa08e5c
20 changed files with 171 additions and 65 deletions
@@ -111,4 +111,11 @@ extend TypeParameter {
extend Class {
repeated Annotation class_annotation = 100;
// If absent, assumed to be JvmAbi.DEFAULT_MODULE_NAME
optional int32 class_module_name = 101 [(string_id_in_table) = true];
}
extend Package {
optional int32 package_module_name = 101 [(string_id_in_table) = true];
}
@@ -49,7 +49,6 @@ public final class JvmAnnotationNames {
public static final String METADATA_MULTIFILE_CLASS_NAME_FIELD_NAME = "xs";
public static final String DATA_FIELD_NAME = "data";
public static final String STRINGS_FIELD_NAME = "strings";
public static final String MODULE_NAME_FIELD_NAME = "moduleName";
public static final Name DEFAULT_ANNOTATION_MEMBER_NAME = Name.identifier("value");
public static final Name DEPRECATED_ANNOTATION_MESSAGE = Name.identifier("message");
public static final Name TARGET_ANNOTATION_MEMBER_NAME = Name.identifier("allowedTargets");
@@ -14,6 +14,8 @@ public final class JvmProtoBuf {
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.isRaw);
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.typeParameterAnnotation);
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classAnnotation);
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.classModuleName);
registry.add(org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf.packageModuleName);
}
public interface StringTableTypesOrBuilder
extends com.google.protobuf.MessageLiteOrBuilder {
@@ -3816,6 +3818,36 @@ public final class JvmProtoBuf {
100,
com.google.protobuf.WireFormat.FieldType.MESSAGE,
false);
public static final int CLASS_MODULE_NAME_FIELD_NUMBER = 101;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Class { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessageLite.GeneratedExtension<
org.jetbrains.kotlin.serialization.ProtoBuf.Class,
java.lang.Integer> classModuleName = com.google.protobuf.GeneratedMessageLite
.newSingularGeneratedExtension(
org.jetbrains.kotlin.serialization.ProtoBuf.Class.getDefaultInstance(),
0,
null,
null,
101,
com.google.protobuf.WireFormat.FieldType.INT32);
public static final int PACKAGE_MODULE_NAME_FIELD_NUMBER = 101;
/**
* <code>extend .org.jetbrains.kotlin.serialization.Package { ... }</code>
*/
public static final
com.google.protobuf.GeneratedMessageLite.GeneratedExtension<
org.jetbrains.kotlin.serialization.ProtoBuf.Package,
java.lang.Integer> packageModuleName = com.google.protobuf.GeneratedMessageLite
.newSingularGeneratedExtension(
org.jetbrains.kotlin.serialization.ProtoBuf.Package.getDefaultInstance(),
0,
null,
null,
101,
com.google.protobuf.WireFormat.FieldType.INT32);
static {
}
@@ -17,12 +17,16 @@
@file:JvmName("ReflectJvmMapping")
package kotlin.reflect.jvm
import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.load.kotlin.reflect.ReflectKotlinClass
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
import java.lang.reflect.*
import java.util.*
import kotlin.jvm.internal.KotlinFileFacade
import kotlin.jvm.internal.Reflection
import kotlin.reflect.*
import kotlin.reflect.jvm.internal.KCallableImpl
import kotlin.reflect.jvm.internal.KTypeImpl
import kotlin.reflect.jvm.internal.asKCallableImpl
import kotlin.reflect.jvm.internal.asKPropertyImpl
@@ -100,9 +104,19 @@ val Field.kotlinProperty: KProperty<*>?
private fun Member.getKPackage(): KDeclarationContainer? {
// TODO: support multifile classes
val fileFacade = declaringClass.getAnnotation(KotlinFileFacade::class.java)
return if (fileFacade != null)
Reflection.getOrCreateKotlinPackage(declaringClass, fileFacade.moduleName)
return if (declaringClass.getAnnotation(KotlinFileFacade::class.java) != null) {
val header = ReflectKotlinClass.create(declaringClass)?.classHeader
if (header != null && header.kind == KotlinClassHeader.Kind.FILE_FACADE && header.metadataVersion.isCompatible()) {
// TODO: avoid reading and parsing metadata twice (here and later in KPackageImpl#descriptor)
val (nameResolver, proto) = JvmProtoBufUtil.readPackageDataFrom(header.data!!, header.strings!!)
val moduleName =
if (proto.hasExtension(JvmProtoBuf.packageModuleName))
nameResolver.getString(proto.getExtension(JvmProtoBuf.packageModuleName))
else JvmAbi.DEFAULT_MODULE_NAME
Reflection.getOrCreateKotlinPackage(declaringClass, moduleName)
}
else null
}
else null
}
@@ -121,7 +135,7 @@ val Method.kotlinFunction: KFunction<*>?
return kotlinPackage.members.filterIsInstance<KFunction<*>>().firstOrNull { it.javaMethod == this }
}
// For static bridge method generated for a jvmStatic function in the companion object, also try to find the latter
// For static bridge method generated for a @JvmStatic function in the companion object, also try to find the latter
val companion = declaringClass.kotlin.companionObject
if (companion != null) {
companion.functions.firstOrNull {
@@ -18,7 +18,6 @@ package kotlin.reflect.jvm.internal
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.builtins.PrimitiveType
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
@@ -28,8 +27,6 @@ import org.jetbrains.kotlin.load.java.descriptors.JavaMethodDescriptor
import org.jetbrains.kotlin.load.java.descriptors.JavaPropertyDescriptor
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
import org.jetbrains.kotlin.load.java.structure.reflect.*
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
import org.jetbrains.kotlin.load.kotlin.reflect.ReflectKotlinClass
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.resolve.DescriptorUtils
@@ -39,6 +36,7 @@ import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
import org.jetbrains.kotlin.serialization.deserialization.TypeTable
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedCallableMemberDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
@@ -46,7 +44,6 @@ import java.lang.reflect.Constructor
import java.lang.reflect.Field
import java.lang.reflect.Member
import java.lang.reflect.Method
import kotlin.jvm.internal.KotlinClass
import kotlin.reflect.KotlinReflectionInternalError
internal sealed class JvmFunctionSignature {
@@ -113,15 +110,16 @@ internal sealed class JvmPropertySignature {
else {
val (name, desc) =
JvmProtoBufUtil.getJvmFieldSignature(proto, nameResolver, typeTable) ?:
throw KotlinReflectionInternalError("No field signature for property: $descriptor")
throw KotlinReflectionInternalError("No field signature for property: $descriptor")
val moduleSuffix =
if (descriptor.visibility == Visibilities.INTERNAL &&
descriptor.containingDeclaration is ClassDescriptor) {
val containingDeclaration = descriptor.containingDeclaration as ClassDescriptor
val sourceElement = containingDeclaration.source as KotlinJvmBinarySourceElement
val klass = (sourceElement.binaryClass as ReflectKotlinClass).klass
val moduleName = klass.getAnnotation(KotlinClass::class.java).moduleName
descriptor.containingDeclaration is DeserializedClassDescriptor) {
val classProto = (descriptor.containingDeclaration as DeserializedClassDescriptor).classProto
val moduleName =
if (classProto.hasExtension(JvmProtoBuf.classModuleName))
nameResolver.getString(classProto.getExtension(JvmProtoBuf.classModuleName))
else JvmAbi.DEFAULT_MODULE_NAME
"$" + JvmAbi.sanitizeAsJavaIdentifier(moduleName)
}
else {