Do not create additional module for built-ins in reflection

This commit is contained in:
Alexander Udalov
2017-07-14 23:40:21 +03:00
parent ed86757817
commit c32d7ef116
2 changed files with 17 additions and 5 deletions
@@ -16,11 +16,13 @@
package kotlin.reflect.jvm.internal.components
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.load.java.structure.JavaClass
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder.Result.KotlinClass
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
import java.io.InputStream
class ReflectKotlinClassFinder(private val classLoader: ClassLoader) : KotlinClassFinder {
@@ -41,8 +43,11 @@ class ReflectKotlinClassFinder(private val classLoader: ClassLoader) : KotlinCla
// TODO
override fun hasMetadataPackage(fqName: FqName): Boolean = false
// TODO: load built-ins from classLoader
override fun findBuiltInsData(packageFqName: FqName): InputStream? = null
override fun findBuiltInsData(packageFqName: FqName): InputStream? {
if (!packageFqName.startsWith(KotlinBuiltIns.BUILT_INS_PACKAGE_NAME)) return null
return classLoader.getResourceAsStream(BuiltInSerializerProtocol.getBuiltInsFilePath(packageFqName))
}
}
private fun ClassId.toRuntimeFqName(): String {
@@ -18,9 +18,11 @@ package kotlin.reflect.jvm.internal.components
import org.jetbrains.kotlin.builtins.ReflectionTypes
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltIns
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsPackageFragmentProvider
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.NotFoundClasses
import org.jetbrains.kotlin.descriptors.SupertypeLoopChecker
import org.jetbrains.kotlin.descriptors.impl.CompositePackageFragmentProvider
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.load.java.AnnotationTypeQualifierResolver
@@ -55,8 +57,9 @@ class RuntimeModuleData private constructor(
companion object {
fun create(classLoader: ClassLoader): RuntimeModuleData {
val storageManager = LockBasedStorageManager("RuntimeModuleData")
val builtIns = JvmBuiltIns(storageManager)
val builtIns = JvmBuiltIns(storageManager, false)
val module = ModuleDescriptorImpl(Name.special("<runtime module for $classLoader>"), storageManager, builtIns)
builtIns.builtInsModule = module
val reflectKotlinClassFinder = ReflectKotlinClassFinder(classLoader)
val deserializedDescriptorResolver = DeserializedDescriptorResolver()
@@ -89,12 +92,16 @@ class RuntimeModuleData private constructor(
binaryClassAnnotationAndConstantLoader, lazyJavaPackageFragmentProvider, notFoundClasses,
RuntimeErrorReporter, LookupTracker.DO_NOTHING, ContractDeserializer.DEFAULT
)
val builtinsProvider = JvmBuiltInsPackageFragmentProvider(
storageManager, reflectKotlinClassFinder, module, notFoundClasses, builtIns.settings, builtIns.settings,
DeserializationConfiguration.Default
)
singleModuleClassResolver.resolver = javaDescriptorResolver
deserializedDescriptorResolver.setComponents(deserializationComponentsForJava)
module.setDependencies(module, builtIns.builtInsModule)
module.initialize(javaDescriptorResolver.packageFragmentProvider)
module.setDependencies(module)
module.initialize(CompositePackageFragmentProvider(listOf(javaDescriptorResolver.packageFragmentProvider, builtinsProvider)))
return RuntimeModuleData(deserializationComponentsForJava.components, runtimePackagePartProvider)
}