Support local classes in reflection

This commit is contained in:
Alexander Udalov
2015-02-04 18:13:42 +03:00
parent 64fdb18ad3
commit d1debf586c
4 changed files with 18 additions and 8 deletions
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.di;
import org.jetbrains.kotlin.descriptors.ModuleDescriptor; import org.jetbrains.kotlin.descriptors.ModuleDescriptor;
import org.jetbrains.kotlin.resolve.jvm.JavaDescriptorResolver; 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.ExternalSignatureResolver;
import org.jetbrains.kotlin.load.java.components.MethodSignatureChecker; import org.jetbrains.kotlin.load.java.components.MethodSignatureChecker;
import org.jetbrains.kotlin.load.java.components.JavaResolverCache; 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.LazyJavaPackageFragmentProvider;
import org.jetbrains.kotlin.load.java.lazy.GlobalJavaResolverContext; import org.jetbrains.kotlin.load.java.lazy.GlobalJavaResolverContext;
import org.jetbrains.kotlin.load.kotlin.DeserializedDescriptorResolver; 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.JavaClassDataFinder;
import org.jetbrains.kotlin.load.kotlin.BinaryClassAnnotationAndConstantLoaderImpl; import org.jetbrains.kotlin.load.kotlin.BinaryClassAnnotationAndConstantLoaderImpl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -46,6 +46,7 @@ public class InjectorForRuntimeDescriptorLoader {
private final ClassLoader classLoader; private final ClassLoader classLoader;
private final ModuleDescriptor moduleDescriptor; private final ModuleDescriptor moduleDescriptor;
private final JavaDescriptorResolver javaDescriptorResolver; private final JavaDescriptorResolver javaDescriptorResolver;
private final DeserializationComponentsForJava deserializationComponentsForJava;
private final ExternalSignatureResolver externalSignatureResolver; private final ExternalSignatureResolver externalSignatureResolver;
private final MethodSignatureChecker methodSignatureChecker; private final MethodSignatureChecker methodSignatureChecker;
private final JavaResolverCache javaResolverCache; private final JavaResolverCache javaResolverCache;
@@ -61,7 +62,6 @@ public class InjectorForRuntimeDescriptorLoader {
private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider; private final LazyJavaPackageFragmentProvider lazyJavaPackageFragmentProvider;
private final GlobalJavaResolverContext globalJavaResolverContext; private final GlobalJavaResolverContext globalJavaResolverContext;
private final DeserializedDescriptorResolver deserializedDescriptorResolver; private final DeserializedDescriptorResolver deserializedDescriptorResolver;
private final DeserializationComponentsForJava deserializationComponentsForJava;
private final JavaClassDataFinder javaClassDataFinder; private final JavaClassDataFinder javaClassDataFinder;
private final BinaryClassAnnotationAndConstantLoaderImpl binaryClassAnnotationAndConstantLoader; private final BinaryClassAnnotationAndConstantLoaderImpl binaryClassAnnotationAndConstantLoader;
@@ -109,4 +109,8 @@ public class InjectorForRuntimeDescriptorLoader {
return this.javaDescriptorResolver; return this.javaDescriptorResolver;
} }
public DeserializationComponentsForJava getDeserializationComponentsForJava() {
return this.deserializationComponentsForJava;
}
} }
@@ -16,17 +16,20 @@
package org.jetbrains.kotlin.load.kotlin.reflect package org.jetbrains.kotlin.load.kotlin.reflect
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.di.InjectorForRuntimeDescriptorLoader
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.JavaToKotlinClassMap import org.jetbrains.kotlin.platform.JavaToKotlinClassMap
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolver
import org.jetbrains.kotlin.di.InjectorForRuntimeDescriptorLoader
public class RuntimeModuleData private(private val injector: InjectorForRuntimeDescriptorLoader) { public class RuntimeModuleData private(private val injector: InjectorForRuntimeDescriptorLoader) {
public val module: ModuleDescriptor get() = injector.getModuleDescriptor() 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 { public fun create(classLoader: ClassLoader): RuntimeModuleData {
val module = ModuleDescriptorImpl(Name.special("<runtime module for $classLoader>"), listOf(), JavaToKotlinClassMap.INSTANCE) val module = ModuleDescriptorImpl(Name.special("<runtime module for $classLoader>"), listOf(), JavaToKotlinClassMap.INSTANCE)
module.addDependencyOnModule(module) module.addDependencyOnModule(module)
@@ -38,11 +38,13 @@ class KClassImpl<T>(override val jClass: Class<T>) : KCallableContainerImpl(), K
val descriptor by ReflectProperties.lazySoft {(): ClassDescriptor -> val descriptor by ReflectProperties.lazySoft {(): ClassDescriptor ->
val moduleData = jClass.getOrCreateModule() val moduleData = jClass.getOrCreateModule()
val classId = jClass.classId
val found = moduleData.module.findClassAcrossModuleDependencies(jClass.classId) val descriptor =
if (found != null) return@lazySoft found 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() override val scope: JetScope get() = descriptor.getDefaultType().getMemberScope()
@@ -144,6 +144,7 @@ private fun generatorForRuntimeDescriptorLoader() =
publicParameter<ModuleDescriptor>() publicParameter<ModuleDescriptor>()
publicField<JavaDescriptorResolver>() publicField<JavaDescriptorResolver>()
publicField<DeserializationComponentsForJava>()
field<ExternalSignatureResolver>(init = GetSingleton.byField(javaClass<ExternalSignatureResolver>(), "DO_NOTHING")) field<ExternalSignatureResolver>(init = GetSingleton.byField(javaClass<ExternalSignatureResolver>(), "DO_NOTHING"))
field<MethodSignatureChecker>(init = GetSingleton.byField(javaClass<MethodSignatureChecker>(), "DO_NOTHING")) field<MethodSignatureChecker>(init = GetSingleton.byField(javaClass<MethodSignatureChecker>(), "DO_NOTHING"))