[JS SCRIPT] Use new dependency resolver in script/js subsytem
This commit is contained in:
@@ -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.DescriptorTable
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer
|
import org.jetbrains.kotlin.backend.common.serialization.metadata.DynamicTypeDeserializer
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.CommonConfigurationKeys
|
import org.jetbrains.kotlin.config.*
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
|
||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
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
|
||||||
@@ -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.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.util.ExpectDeclarationRemover
|
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.util.SymbolTable
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||||
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
|
import org.jetbrains.kotlin.js.analyze.TopDownAnalyzerFacadeForJS
|
||||||
@@ -71,7 +69,7 @@ val KotlinLibrary.isBuiltIns: Boolean
|
|||||||
fun loadKlib(klibPath: String) =
|
fun loadKlib(klibPath: String) =
|
||||||
createKotlinLibrary(KFile(KFile(klibPath).absolutePath))
|
createKotlinLibrary(KFile(KFile(klibPath).absolutePath))
|
||||||
|
|
||||||
private val emptyLoggingContext = object : LoggingContext {
|
val emptyLoggingContext = object : LoggingContext {
|
||||||
override var inVerbosePhase = false
|
override var inVerbosePhase = false
|
||||||
|
|
||||||
override fun log(message: () -> String) {}
|
override fun log(message: () -> String) {}
|
||||||
@@ -227,24 +225,22 @@ fun GeneratorContext.generateModuleFragment(files: List<KtFile>, deserializer: I
|
|||||||
|
|
||||||
|
|
||||||
private fun createBuiltIns(storageManager: StorageManager) = object : KotlinBuiltIns(storageManager) {}
|
private fun createBuiltIns(storageManager: StorageManager) = object : KotlinBuiltIns(storageManager) {}
|
||||||
val JsFactories = KlibMetadataFactories(::createBuiltIns, DynamicTypeDeserializer)
|
private val JsFactories = KlibMetadataFactories(::createBuiltIns, DynamicTypeDeserializer)
|
||||||
|
|
||||||
fun getModuleDescriptorByLibrary(
|
fun getModuleDescriptorByLibrary(current: KotlinLibrary, mapping: Map<String, ModuleDescriptorImpl>): ModuleDescriptorImpl {
|
||||||
current: KotlinLibrary
|
val md = JsFactories.DefaultDeserializedDescriptorFactory.createDescriptorOptionalBuiltIns(
|
||||||
): ModuleDescriptorImpl {
|
|
||||||
val parts = loadKlibMetadataParts(current)
|
|
||||||
val isBuiltIns = parts.importedModules.isEmpty()
|
|
||||||
return loadKlibMetadata(
|
|
||||||
parts,
|
|
||||||
current,
|
current,
|
||||||
isBuiltIns,
|
|
||||||
LookupTracker.DO_NOTHING,
|
|
||||||
LockBasedStorageManager("ModulesStructure"),
|
|
||||||
JsKlibMetadataVersion.INSTANCE,
|
|
||||||
LanguageVersionSettingsImpl.DEFAULT,
|
LanguageVersionSettingsImpl.DEFAULT,
|
||||||
|
LockBasedStorageManager.NO_LOCKS,
|
||||||
null,
|
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(
|
private class ModulesStructure(
|
||||||
@@ -254,7 +250,7 @@ private class ModulesStructure(
|
|||||||
val allDependencies: KotlinLibraryResolveResult,
|
val allDependencies: KotlinLibraryResolveResult,
|
||||||
private val friendDependencies: List<KotlinLibrary>
|
private val friendDependencies: List<KotlinLibrary>
|
||||||
) {
|
) {
|
||||||
val moduleDependencies: Map<KotlinLibrary, List<KotlinLibrary>> = {
|
val moduleDependencies: Map<KotlinLibrary, List<KotlinLibrary>> = run {
|
||||||
val result = mutableMapOf<KotlinLibrary, List<KotlinLibrary>>()
|
val result = mutableMapOf<KotlinLibrary, List<KotlinLibrary>>()
|
||||||
|
|
||||||
allDependencies.forEach { klib, _ ->
|
allDependencies.forEach { klib, _ ->
|
||||||
@@ -264,7 +260,7 @@ private class ModulesStructure(
|
|||||||
result.put(klib, dependencies.minus(klib))
|
result.put(klib, dependencies.minus(klib))
|
||||||
}
|
}
|
||||||
result
|
result
|
||||||
}()
|
}
|
||||||
|
|
||||||
val builtInsDep = allDependencies.getFullList().find { it.isBuiltIns }
|
val builtInsDep = allDependencies.getFullList().find { it.isBuiltIns }
|
||||||
|
|
||||||
|
|||||||
+33
-4
@@ -8,24 +8,34 @@ package org.jetbrains.kotlin.scripting.repl.js
|
|||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiFileFactory
|
import com.intellij.psi.PsiFileFactory
|
||||||
import com.intellij.psi.impl.PsiFileFactoryImpl
|
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.CompilerMessageLocation
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
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.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.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
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.getModuleDescriptorByLibrary
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.jsResolveLibraries
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.NameTables
|
import org.jetbrains.kotlin.ir.backend.js.utils.NameTables
|
||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
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.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplCodeAnalyzer
|
import org.jetbrains.kotlin.scripting.compiler.plugin.repl.ReplCodeAnalyzer
|
||||||
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
|
import org.jetbrains.kotlin.scripting.configuration.ScriptingConfigurationKeys
|
||||||
import org.jetbrains.kotlin.scripting.resolve.ScriptLightVirtualFile
|
import org.jetbrains.kotlin.scripting.resolve.ScriptLightVirtualFile
|
||||||
|
import org.jetbrains.kotlin.util.Logger
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
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.nio.charset.Charset
|
||||||
import java.util.concurrent.locks.ReentrantReadWriteLock
|
import java.util.concurrent.locks.ReentrantReadWriteLock
|
||||||
import kotlin.script.experimental.api.*
|
import kotlin.script.experimental.api.*
|
||||||
@@ -96,10 +106,28 @@ class ReplMessageCollector : MessageCollector {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun readLibrariesFromConfiguration(configuration: CompilerConfiguration): List<ModuleDescriptor> {
|
fun readLibrariesFromConfiguration(configuration: CompilerConfiguration): List<ModuleDescriptor> {
|
||||||
|
// TODO: Reimplement this code once we get proper klib dependency resolver
|
||||||
val scriptConfig = configuration[ScriptingConfigurationKeys.SCRIPT_DEFINITIONS]!!
|
val scriptConfig = configuration[ScriptingConfigurationKeys.SCRIPT_DEFINITIONS]!!
|
||||||
val scriptCompilationConfig = scriptConfig.find { (it).platform == "JS" }!!.compilationConfiguration
|
val scriptCompilationConfig = scriptConfig.find { (it).platform == "JS" }!!.compilationConfiguration
|
||||||
val scriptDependencies = scriptCompilationConfig[ScriptCompilationConfiguration.dependencies]!!
|
val scriptDependencies = scriptCompilationConfig[ScriptCompilationConfiguration.dependencies]!!
|
||||||
return scriptDependencies.map { loadKlib((it as JsDependency).path) }.map { getModuleDescriptorByLibrary(it) }
|
val descriptorMap = mutableMapOf<String, ModuleDescriptorImpl>()
|
||||||
|
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)
|
fun createCompileResult(code: String) = createCompileResult(LineId(ReplCodeLine(0, 0, "")), code)
|
||||||
@@ -118,6 +146,7 @@ fun createCompileResult(lineId: LineId, code: String): ReplCompileResult.Compile
|
|||||||
}
|
}
|
||||||
|
|
||||||
class DependencyLoader {
|
class DependencyLoader {
|
||||||
|
// TODO: this should be taken from CompilerConfiguration
|
||||||
private val commonPath = "compiler/ir/serialization.js/build/fullRuntime/klib"
|
private val commonPath = "compiler/ir/serialization.js/build/fullRuntime/klib"
|
||||||
private val mappedNamesPath = "$commonPath/mappedNames.txt"
|
private val mappedNamesPath = "$commonPath/mappedNames.txt"
|
||||||
private val scriptDependencyBinaryPath = "$commonPath/scriptDependencyBinary.js"
|
private val scriptDependencyBinaryPath = "$commonPath/scriptDependencyBinary.js"
|
||||||
|
|||||||
Reference in New Issue
Block a user