Support local classes in reflection
This commit is contained in:
+6
-2
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-3
@@ -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"))
|
||||||
|
|||||||
Reference in New Issue
Block a user