Lazy module name propagation
This commit is contained in:
+6
-5
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||
import org.jetbrains.kotlin.load.java.components.*
|
||||
import org.jetbrains.kotlin.load.java.lazy.JavaResolverComponents
|
||||
import org.jetbrains.kotlin.load.java.lazy.LazyJavaPackageFragmentProvider
|
||||
import org.jetbrains.kotlin.descriptors.PackageFacadeProvider
|
||||
import org.jetbrains.kotlin.load.java.lazy.SingleModuleClassResolver
|
||||
import org.jetbrains.kotlin.load.java.reflect.ReflectJavaClassFinder
|
||||
import org.jetbrains.kotlin.load.java.structure.JavaPropertyInitializerEvaluator
|
||||
@@ -39,12 +38,12 @@ import org.jetbrains.kotlin.serialization.deserialization.DeserializationCompone
|
||||
import org.jetbrains.kotlin.serialization.deserialization.LocalClassResolver
|
||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||
|
||||
public class RuntimeModuleData private constructor(public val deserialization: DeserializationComponents) {
|
||||
public class RuntimeModuleData private constructor(public val deserialization: DeserializationComponents, val packageFacadeProvider: RuntimePackageFacadeProvider) {
|
||||
public val module: ModuleDescriptor get() = deserialization.moduleDescriptor
|
||||
public val localClassResolver: LocalClassResolver get() = deserialization.localClassResolver
|
||||
|
||||
companion object {
|
||||
public fun create(classLoader: ClassLoader, moduleName: String?): RuntimeModuleData {
|
||||
public fun create(classLoader: ClassLoader): RuntimeModuleData {
|
||||
val storageManager = LockBasedStorageManager()
|
||||
val module = ModuleDescriptorImpl(Name.special("<runtime module for $classLoader>"), storageManager,
|
||||
ModuleParameters(listOf(), JavaToKotlinClassMap.INSTANCE))
|
||||
@@ -52,12 +51,14 @@ public class RuntimeModuleData private constructor(public val deserialization: D
|
||||
val reflectKotlinClassFinder = ReflectKotlinClassFinder(classLoader)
|
||||
val deserializedDescriptorResolver = DeserializedDescriptorResolver(RuntimeErrorReporter)
|
||||
val singleModuleClassResolver = SingleModuleClassResolver()
|
||||
val runtimePackageFacadeProvider = RuntimePackageFacadeProvider(classLoader)
|
||||
val globalJavaResolverContext = JavaResolverComponents(
|
||||
storageManager, ReflectJavaClassFinder(classLoader), reflectKotlinClassFinder, deserializedDescriptorResolver,
|
||||
ExternalAnnotationResolver.EMPTY, ExternalSignatureResolver.DO_NOTHING, RuntimeErrorReporter, JavaResolverCache.EMPTY,
|
||||
JavaPropertyInitializerEvaluator.DoNothing, SamConversionResolver, RuntimeSourceElementFactory, singleModuleClassResolver,
|
||||
if (moduleName == null) PackageFacadeProvider.EMPTY else RuntimePackageFacadeProvider(moduleName, classLoader)
|
||||
runtimePackageFacadeProvider
|
||||
)
|
||||
|
||||
val lazyJavaPackageFragmentProvider =
|
||||
LazyJavaPackageFragmentProvider(globalJavaResolverContext, module, ReflectionTypes(module))
|
||||
val javaDescriptorResolver = JavaDescriptorResolver(lazyJavaPackageFragmentProvider, module)
|
||||
@@ -70,7 +71,7 @@ public class RuntimeModuleData private constructor(public val deserialization: D
|
||||
module.setDependencies(module, KotlinBuiltIns.getInstance().getBuiltInsModule())
|
||||
module.initialize(javaDescriptorResolver.packageFragmentProvider)
|
||||
|
||||
return RuntimeModuleData(deserializationComponentsForJava.components)
|
||||
return RuntimeModuleData(deserializationComponentsForJava.components, runtimePackageFacadeProvider)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+19
-19
@@ -18,31 +18,31 @@ package org.jetbrains.kotlin.load.kotlin.reflect
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.PackageFacadeProvider
|
||||
import org.jetbrains.kotlin.load.kotlin.ModuleMapping
|
||||
import org.jetbrains.kotlin.load.kotlin.PackageFacades
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.InputStream
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
class RuntimePackageFacadeProvider(val moduleName: String, val classLoader : ClassLoader) : PackageFacadeProvider {
|
||||
class RuntimePackageFacadeProvider(val classLoader : ClassLoader) : PackageFacadeProvider {
|
||||
|
||||
val mapping: ModuleMapping by lazy {
|
||||
val resourceAsStream = classLoader.getResourceAsStream("META-INF/$moduleName.kotlin_module") ?: return@lazy ModuleMapping("")
|
||||
val module2Mapping = ConcurrentHashMap<String, Lazy<ModuleMapping>>()
|
||||
|
||||
try {
|
||||
val out = ByteArrayOutputStream(4096)
|
||||
val buffer = ByteArray(4096)
|
||||
while (true) {
|
||||
val r = resourceAsStream.read(buffer)
|
||||
if (r == -1) break
|
||||
out.write(buffer, 0, r)
|
||||
fun registerModule(moduleName: String?) {
|
||||
if (moduleName == null) return
|
||||
|
||||
module2Mapping.putIfAbsent(moduleName, lazy {
|
||||
val resourceAsStream: InputStream = classLoader.getResourceAsStream("META-INF/$moduleName.kotlin_module") ?: return@lazy ModuleMapping("")
|
||||
|
||||
try {
|
||||
val bytes = resourceAsStream.readBytes()
|
||||
return@lazy ModuleMapping(String(bytes, "UTF-8"))
|
||||
}
|
||||
|
||||
val ret = out.toByteArray()
|
||||
return@lazy ModuleMapping(String(ret, "UTF-8"))
|
||||
} finally {
|
||||
resourceAsStream.close()
|
||||
}
|
||||
catch (e: Exception) {
|
||||
return@lazy ModuleMapping("")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
override fun findPackageFacades(packageInternalName: String): List<String> {
|
||||
return mapping.package2MiniFacades.getOrElse (packageInternalName, { PackageFacades("default") }).parts.toList()
|
||||
return module2Mapping.values().map { it.value.findPackageParts(packageInternalName) }.filterNotNull().flatMap { it.parts }.distinct()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user