Lazy module name propagation

This commit is contained in:
Michael Bogdanov
2015-08-28 12:14:14 +03:00
parent c274ceffe8
commit 9f0662468f
10 changed files with 57 additions and 33 deletions
@@ -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)
}
}
}
@@ -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()
}
}