Drop old JVM binary format extensions: static in outer, impl class name
This commit is contained in:
@@ -16,7 +16,10 @@
|
||||
|
||||
package kotlin.reflect.jvm.internal
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.isClassOrEnumClass
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBufUtil
|
||||
import java.lang.reflect.Field
|
||||
import kotlin.reflect.jvm.internal.JvmPropertySignature.JavaField
|
||||
@@ -50,7 +53,10 @@ internal abstract class DescriptorBasedProperty<out R> protected constructor(
|
||||
when (jvmSignature) {
|
||||
is KotlinProperty -> {
|
||||
JvmProtoBufUtil.getJvmFieldSignature(jvmSignature.proto, jvmSignature.nameResolver, jvmSignature.typeTable)?.let {
|
||||
container.findFieldBySignature(jvmSignature.proto, jvmSignature.nameResolver, it.name)
|
||||
val isCompanionOfClass = (descriptor.containingDeclaration as? ClassDescriptor)?.let { containingClass ->
|
||||
isCompanionObject(containingClass) && isClassOrEnumClass(containingClass.containingDeclaration)
|
||||
} ?: false
|
||||
container.findFieldBySignature(it.name, isCompanionOfClass)
|
||||
}
|
||||
}
|
||||
is JavaField -> jvmSignature.field
|
||||
|
||||
@@ -19,16 +19,11 @@ package kotlin.reflect.jvm.internal
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.impl.DeclarationDescriptorVisitorEmptyBodies
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.load.java.structure.reflect.classId
|
||||
import org.jetbrains.kotlin.load.java.structure.reflect.createArrayType
|
||||
import org.jetbrains.kotlin.load.java.structure.reflect.safeClassLoader
|
||||
import org.jetbrains.kotlin.load.kotlin.reflect.RuntimeModuleData
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||
import org.jetbrains.kotlin.serialization.ProtoBuf
|
||||
import org.jetbrains.kotlin.serialization.deserialization.NameResolver
|
||||
import org.jetbrains.kotlin.serialization.jvm.JvmProtoBuf
|
||||
import java.lang.reflect.Constructor
|
||||
import java.lang.reflect.Field
|
||||
import java.lang.reflect.Method
|
||||
@@ -242,16 +237,8 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain
|
||||
}
|
||||
|
||||
// TODO: check resulting field's type
|
||||
fun findFieldBySignature(
|
||||
proto: ProtoBuf.Property,
|
||||
nameResolver: NameResolver,
|
||||
name: String
|
||||
): Field? {
|
||||
val owner = implClassForCallable(nameResolver, proto) ?:
|
||||
if (proto.hasExtension(JvmProtoBuf.propertySignature) &&
|
||||
proto.getExtension(JvmProtoBuf.propertySignature).let { it.hasField() && it.field.isStaticInOuter }) {
|
||||
jClass.enclosingClass ?: throw KotlinReflectionInternalError("Inconsistent metadata for field $name in $jClass")
|
||||
} else jClass
|
||||
fun findFieldBySignature(name: String, isCompanionOfClass: Boolean): Field? {
|
||||
val owner = if (isCompanionOfClass) jClass.enclosingClass else jClass
|
||||
|
||||
return try {
|
||||
owner.getDeclaredField(name)
|
||||
@@ -261,17 +248,6 @@ internal abstract class KDeclarationContainerImpl : ClassBasedDeclarationContain
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the JVM class which contains this callable. This class may be different from the one represented by descriptors
|
||||
// in case of top level functions (their bodies are in package parts), methods with implementations in interfaces, etc.
|
||||
private fun implClassForCallable(nameResolver: NameResolver, proto: ProtoBuf.Property): Class<*>? {
|
||||
if (!proto.hasExtension(JvmProtoBuf.propertyImplClassName)) return null
|
||||
|
||||
val implClassName = nameResolver.getName(proto.getExtension(JvmProtoBuf.propertyImplClassName))
|
||||
// TODO: store fq name of impl class name in jvm_descriptors.proto
|
||||
val classId = ClassId(jClass.classId.packageFqName, implClassName)
|
||||
return jClass.safeClassLoader.loadClass(classId.asSingleFqName().asString())
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val DEFAULT_CONSTRUCTOR_MARKER = Class.forName("kotlin.jvm.internal.DefaultConstructorMarker")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user