Write module name as proto extension instead of another annotation argument
This commit is contained in:
@@ -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");
|
||||
|
||||
+32
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user