From d1debf586c76844c95365d4c0f7698d4e2ada2e7 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 4 Feb 2015 18:13:42 +0300 Subject: [PATCH] Support local classes in reflection --- .../kotlin/di/InjectorForRuntimeDescriptorLoader.java | 8 ++++++-- .../kotlin/load/kotlin/reflect/RuntimeModuleData.kt | 9 ++++++--- .../src/kotlin/reflect/jvm/internal/KClassImpl.kt | 8 +++++--- .../kotlin/generators/injectors/GenerateInjectors.kt | 1 + 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/di/InjectorForRuntimeDescriptorLoader.java b/core/descriptors.runtime/src/org/jetbrains/kotlin/di/InjectorForRuntimeDescriptorLoader.java index 3c79d0ab25e..96582400f00 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/di/InjectorForRuntimeDescriptorLoader.java +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/di/InjectorForRuntimeDescriptorLoader.java @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.di; import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver; +import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava; import org.jetbrains.kotlin.load.java.components.ExternalSignatureResolver; import org.jetbrains.kotlin.load.java.components.MethodSignatureChecker; import org.jetbrains.kotlin.load.java.components.JavaResolverCache; @@ -33,7 +34,6 @@ import org.jetbrains.kotlin.load.kotlin.reflect.ReflectKotlinClassFinder; import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider; import org.jetbrains.kotlin.load.java.lazy.GlobalJavaResolverContext; import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver; -import org.jetbrains.kotlin.load.kotlin.DeserializationComponentsForJava; import org.jetbrains.kotlin.load.kotlin.JavaClassDataFinder; import org.jetbrains.kotlin.load.kotlin.BinaryClassAnnotationAndConstantLoaderImpl; import org.jetbrains.annotations.NotNull; @@ -46,6 +46,7 @@ public class InjectorForRuntimeDescriptorLoader { private final ClassLoader classLoader; private final ModuleDescriptor moduleDescriptor; private final JavaDescriptorResolver javaDescriptorResolver; + private final DeserializationComponentsForJava deserializationComponentsForJava; private final ExternalSignatureResolver externalSignatureResolver; private final MethodSignatureChecker methodSignatureChecker; private final JavaResolverCache javaResolverCache; @@ -61,7 +62,6 @@ public class InjectorForRuntimeDescriptorLoader { private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; private final GlobalJavaResolverContext globalJavaResolverContext; private final DeserializedDescriptorResolver deserializedDescriptorResolver; - private final DeserializationComponentsForJava deserializationComponentsForJava; private final JavaClassDataFinder javaClassDataFinder; private final BinaryClassAnnotationAndConstantLoaderImpl binaryClassAnnotationAndConstantLoader; @@ -109,4 +109,8 @@ public class InjectorForRuntimeDescriptorLoader { return this.javaDescriptorResolver; } + public DeserializationComponentsForJava getDeserializationComponentsForJava() { + return this.deserializationComponentsForJava; + } + } diff --git a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt index a6416dc2e95..bec84863f9e 100644 --- a/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt +++ b/core/descriptors.runtime/src/org/jetbrains/kotlin/load/kotlin/reflect/RuntimeModuleData.kt @@ -16,17 +16,20 @@ package org.jetbrains.kotlin.load.kotlin.reflect +import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl +import org.jetbrains.kotlin.di.InjectorForRuntimeDescriptorLoader import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.JavaToKotlinClassMap -import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.di.InjectorForRuntimeDescriptorLoader +import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolver public class RuntimeModuleData private(private val injector: InjectorForRuntimeDescriptorLoader) { public val module: ModuleDescriptor get() = injector.getModuleDescriptor() - class object { + public val localClassResolver: LocalClassResolver get() = injector.getDeserializationComponentsForJava().components.localClassResolver + + default object { public fun create(classLoader: ClassLoader): RuntimeModuleData { val module = ModuleDescriptorImpl(Name.special(""), listOf(), JavaToKotlinClassMap.INSTANCE) module.addDependencyOnModule(module) diff --git a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt index ba3b9153d49..944db12ae95 100644 --- a/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt +++ b/core/reflection.jvm/src/kotlin/reflect/jvm/internal/KClassImpl.kt @@ -38,11 +38,13 @@ class KClassImpl(override val jClass: Class) : KCallableContainerImpl(), K val descriptor by ReflectProperties.lazySoft {(): ClassDescriptor -> val moduleData = jClass.getOrCreateModule() + val classId = jClass.classId - val found = moduleData.module.findClassAcrossModuleDependencies(jClass.classId) - if (found != null) return@lazySoft found + val descriptor = + if (classId.isLocal()) moduleData.localClassResolver.resolveLocalClass(classId) + else moduleData.module.findClassAcrossModuleDependencies(classId) - throw KotlinReflectionInternalError("Class not resolved: $jClass") + descriptor ?: throw KotlinReflectionInternalError("Class not resolved: $jClass") } override val scope: JetScope get() = descriptor.getDefaultType().getMemberScope() diff --git a/generators/src/org/jetbrains/kotlin/generators/injectors/GenerateInjectors.kt b/generators/src/org/jetbrains/kotlin/generators/injectors/GenerateInjectors.kt index dc01ebe1e9d..4d0b1d156cc 100644 --- a/generators/src/org/jetbrains/kotlin/generators/injectors/GenerateInjectors.kt +++ b/generators/src/org/jetbrains/kotlin/generators/injectors/GenerateInjectors.kt @@ -144,6 +144,7 @@ private fun generatorForRuntimeDescriptorLoader() = publicParameter() publicField() + publicField() field(init = GetSingleton.byField(javaClass(), "DO_NOTHING")) field(init = GetSingleton.byField(javaClass(), "DO_NOTHING"))