diff --git a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt index 5706d8afe75..f3904c8351e 100644 --- a/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt +++ b/compiler/ir/serialization.js/src/org/jetbrains/kotlin/ir/backend/js/klib.kt @@ -12,10 +12,7 @@ import org.jetbrains.kotlin.backend.common.LoggingContext import org.jetbrains.kotlin.backend.common.serialization.DescriptorTable import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.LanguageVersionSettings -import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.config.* import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl @@ -27,6 +24,7 @@ import org.jetbrains.kotlin.ir.backend.js.lower.serialization.metadata.KlibMetad import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.util.ExpectDeclarationRemover +import org.jetbrains.kotlin.ir.util.IrDeserializer import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS @@ -71,7 +69,7 @@ val KotlinLibrary.isBuiltIns: Boolean fun loadKlib(klibPath: String) = createKotlinLibrary(KFile(KFile(klibPath).absolutePath)) -private val emptyLoggingContext = object : LoggingContext { +val emptyLoggingContext = object : LoggingContext { override var inVerbosePhase = false override fun log(message: () -> String) {} @@ -227,24 +225,22 @@ fun GeneratorContext.generateModuleFragment(files: List, deserializer: I private fun createBuiltIns(storageManager: StorageManager) = object : KotlinBuiltIns(storageManager) {} -val JsFactories = KlibMetadataFactories(::createBuiltIns, DynamicTypeDeserializer) +private val JsFactories = KlibMetadataFactories(::createBuiltIns, DynamicTypeDeserializer) -fun getModuleDescriptorByLibrary( - current: KotlinLibrary -): ModuleDescriptorImpl { - val parts = loadKlibMetadataParts(current) - val isBuiltIns = parts.importedModules.isEmpty() - return loadKlibMetadata( - parts, +fun getModuleDescriptorByLibrary(current: KotlinLibrary, mapping: Map): ModuleDescriptorImpl { + val md = JsFactories.DefaultDeserializedDescriptorFactory.createDescriptorOptionalBuiltIns( current, - isBuiltIns, - LookupTracker.DO_NOTHING, - LockBasedStorageManager("ModulesStructure"), - JsKlibMetadataVersion.INSTANCE, LanguageVersionSettingsImpl.DEFAULT, + LockBasedStorageManager.NO_LOCKS, null, - emptyList() + packageAccessHandler = null // TODO: This is a speed optimization used by Native. Don't bother for now. ) +// if (isBuiltIns) runtimeModule = md + + val dependencies = current.manifestProperties.propertyList(KLIB_PROPERTY_DEPENDS, escapeInQuotes = true).map { mapping.getValue(it) } + + md.setDependencies(listOf(md) + dependencies) + return md } private class ModulesStructure( @@ -254,7 +250,7 @@ private class ModulesStructure( val allDependencies: KotlinLibraryResolveResult, private val friendDependencies: List ) { - val moduleDependencies: Map> = { + val moduleDependencies: Map> = run { val result = mutableMapOf>() allDependencies.forEach { klib, _ -> @@ -264,7 +260,7 @@ private class ModulesStructure( result.put(klib, dependencies.minus(klib)) } result - }() + } val builtInsDep = allDependencies.getFullList().find { it.isBuiltIns } diff --git a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsReplUtils.kt b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsReplUtils.kt index f403beb04df..128db750cb8 100644 --- a/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsReplUtils.kt +++ b/plugins/scripting/scripting-compiler/src/org/jetbrains/kotlin/scripting/repl/js/JsReplUtils.kt @@ -8,24 +8,34 @@ package org.jetbrains.kotlin.scripting.repl.js import com.intellij.openapi.project.Project import com.intellij.psi.PsiFileFactory import com.intellij.psi.impl.PsiFileFactoryImpl +import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.cli.common.messages.CompilerMessageLocation import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity +import org.jetbrains.kotlin.cli.common.messages.GroupingMessageCollector import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.common.repl.* +import org.jetbrains.kotlin.cli.common.repl.LineId +import org.jetbrains.kotlin.cli.common.repl.ReplCodeLine +import org.jetbrains.kotlin.cli.common.repl.ReplCompileResult import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.descriptors.ModuleDescriptor +import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.idea.KotlinLanguage -import org.jetbrains.kotlin.ir.backend.js.loadKlib import org.jetbrains.kotlin.ir.backend.js.getModuleDescriptorByLibrary +import org.jetbrains.kotlin.ir.backend.js.jsResolveLibraries import org.jetbrains.kotlin.ir.backend.js.utils.NameTables import org.jetbrains.kotlin.ir.util.SymbolTable +import org.jetbrains.kotlin.library.resolver.TopologicalLibraryOrder import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplCodeAnalyzer import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys import org.jetbrains.kotlin.scripting.resolve.ScriptLightVirtualFile +import org.jetbrains.kotlin.util.Logger import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull -import java.io.* +import java.io.BufferedReader +import java.io.FileOutputStream +import java.io.FileReader +import java.io.InputStreamReader import java.nio.charset.Charset import java.util.concurrent.locks.ReentrantReadWriteLock import kotlin.script.experimental.api.* @@ -96,10 +106,28 @@ class ReplMessageCollector : MessageCollector { } fun readLibrariesFromConfiguration(configuration: CompilerConfiguration): List { + // TODO: Reimplement this code once we get proper klib dependency resolver val scriptConfig = configuration[ScriptingConfigurationKeys.SCRIPT_DEFINITIONS]!! val scriptCompilationConfig = scriptConfig.find { (it).platform == "JS" }!!.compilationConfiguration val scriptDependencies = scriptCompilationConfig[ScriptCompilationConfiguration.dependencies]!! - return scriptDependencies.map { loadKlib((it as JsDependency).path) }.map { getModuleDescriptorByLibrary(it) } + val descriptorMap = mutableMapOf() + val libraries = scriptDependencies.map { (it as JsDependency).path } + val resolvedLibraries = jsResolveLibraries( + libraries, + object : Logger { + private val collector = configuration[CLIConfigurationKeys.MESSAGE_COLLECTOR_KEY] ?: MessageCollector.NONE + override fun warning(message: String) = collector.report(CompilerMessageSeverity.STRONG_WARNING, message) + override fun error(message: String) = collector.report(CompilerMessageSeverity.ERROR, message) + override fun log(message: String) = collector.report(CompilerMessageSeverity.LOGGING, message) + override fun fatal(message: String): Nothing { + collector.report(CompilerMessageSeverity.ERROR, message) + (collector as? GroupingMessageCollector)?.flush() + kotlin.error(message) + } + } + ) + return resolvedLibraries.getFullList(TopologicalLibraryOrder) + .map { descriptorMap.getOrPut(it.libraryName) { getModuleDescriptorByLibrary(it, descriptorMap) } } } fun createCompileResult(code: String) = createCompileResult(LineId(ReplCodeLine(0, 0, "")), code) @@ -118,6 +146,7 @@ fun createCompileResult(lineId: LineId, code: String): ReplCompileResult.Compile } class DependencyLoader { + // TODO: this should be taken from CompilerConfiguration private val commonPath = "compiler/ir/serialization.js/build/fullRuntime/klib" private val mappedNamesPath = "$commonPath/mappedNames.txt" private val scriptDependencyBinaryPath = "$commonPath/scriptDependencyBinary.js"