[JS IR BE] Migrate JS BE to common klib utils
This commit is contained in:
@@ -28,14 +28,12 @@ import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
|
||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||
import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider
|
||||
import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer
|
||||
import org.jetbrains.kotlin.ir.backend.js.KlibModuleRef
|
||||
import org.jetbrains.kotlin.ir.backend.js.compile
|
||||
import org.jetbrains.kotlin.ir.backend.js.generateKLib
|
||||
import org.jetbrains.kotlin.ir.backend.js.jsPhases
|
||||
import org.jetbrains.kotlin.ir.backend.js.*
|
||||
import org.jetbrains.kotlin.js.config.EcmaVersion
|
||||
import org.jetbrains.kotlin.js.config.JSConfigurationKeys
|
||||
import org.jetbrains.kotlin.js.config.JsConfig
|
||||
import org.jetbrains.kotlin.js.config.SourceMapSourceEmbedding
|
||||
import org.jetbrains.kotlin.library.KotlinLibrary
|
||||
import org.jetbrains.kotlin.metadata.deserialization.BinaryVersion
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.serialization.js.ModuleKind
|
||||
@@ -44,7 +42,6 @@ import org.jetbrains.kotlin.utils.KotlinPaths
|
||||
import org.jetbrains.kotlin.utils.join
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.util.zip.ZipFile
|
||||
|
||||
enum class ProduceKind {
|
||||
DEFAULT, // Determine what to produce based on js-v1 options
|
||||
@@ -61,68 +58,6 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
||||
return K2JSCompilerArguments()
|
||||
}
|
||||
|
||||
private fun extractKlibFromZip(library: String, messageCollector: MessageCollector): File? {
|
||||
val zipLib = ZipFile(library)
|
||||
val tempDir = createTempDir(File(library).name, "klibjar")
|
||||
tempDir.deleteOnExit()
|
||||
var extractedKlibDir: File? = null
|
||||
for (entry in zipLib.entries()) {
|
||||
if (!entry.isDirectory) {
|
||||
zipLib.getInputStream(entry).use { input ->
|
||||
val outputEntryFile = File(tempDir, entry.name)
|
||||
outputEntryFile.parentFile.mkdirs()
|
||||
outputEntryFile.outputStream().use { output ->
|
||||
input.copyTo(output)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (entry.name.endsWith("KLIB/")) {
|
||||
extractedKlibDir = File(tempDir, entry.name)
|
||||
messageCollector.report(INFO, "Klib $library is extracted into $extractedKlibDir")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return extractedKlibDir
|
||||
}
|
||||
|
||||
private fun loadIrLibrary(library: String, messageCollector: MessageCollector): KlibModuleRef? {
|
||||
val libraryFile = File(library)
|
||||
var klibDir = when {
|
||||
FileUtil.isJarOrZip(libraryFile) -> {
|
||||
extractKlibFromZip(library, messageCollector) ?: return null
|
||||
}
|
||||
!libraryFile.isDirectory -> {
|
||||
messageCollector.report(ERROR, "Klib $library must be a directory")
|
||||
return null
|
||||
}
|
||||
else ->
|
||||
libraryFile
|
||||
}
|
||||
|
||||
var klibFiles = klibDir.listFiles()
|
||||
if (klibFiles.isEmpty()) {
|
||||
messageCollector.report(STRONG_WARNING, "Klib $library directory is empty")
|
||||
return null
|
||||
}
|
||||
|
||||
// Sometines gradle gives us a directory with klib directory inside
|
||||
val klibDirInsideDir = klibFiles.find { it.name.endsWith("KLIB") }
|
||||
if (klibDirInsideDir != null) {
|
||||
klibDir = klibDirInsideDir
|
||||
klibFiles = klibDir.listFiles()
|
||||
}
|
||||
|
||||
val metadataFile = klibFiles.find { it.extension == "klm" }
|
||||
|
||||
if (metadataFile == null) {
|
||||
messageCollector.report(STRONG_WARNING, "No metadata file (.klm) for klib: $klibDir")
|
||||
return null
|
||||
}
|
||||
|
||||
return KlibModuleRef(metadataFile.nameWithoutExtension, klibDir.absolutePath)
|
||||
}
|
||||
|
||||
override fun doExecute(
|
||||
arguments: K2JSCompilerArguments,
|
||||
configuration: CompilerConfiguration,
|
||||
@@ -144,7 +79,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
||||
arguments.pluginOptions,
|
||||
configuration
|
||||
)
|
||||
if (pluginLoadResult != ExitCode.OK) return pluginLoadResult
|
||||
if (pluginLoadResult != OK) return pluginLoadResult
|
||||
|
||||
val libraries: List<String> = configureLibraries(arguments.libraries)
|
||||
val friendLibraries: List<String> = configureLibraries(arguments.friendModules)
|
||||
@@ -204,11 +139,11 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
||||
val mainCallArguments = if (K2JsArgumentConstants.NO_CALL == arguments.main) null else emptyList<String>()
|
||||
|
||||
val loadedLibrariesNames = mutableSetOf<String>()
|
||||
val dependencies = mutableListOf<KlibModuleRef>()
|
||||
val friendDependencies = mutableListOf<KlibModuleRef>()
|
||||
val dependencies = mutableListOf<KotlinLibrary>()
|
||||
val friendDependencies = mutableListOf<KotlinLibrary>()
|
||||
|
||||
for (library in libraries) {
|
||||
val irLib = loadIrLibrary(library, messageCollector) ?: continue
|
||||
val irLib = loadKlib(library)
|
||||
if (irLib.moduleName !in loadedLibrariesNames) {
|
||||
dependencies.add(irLib)
|
||||
loadedLibrariesNames.add(irLib.moduleName)
|
||||
@@ -223,6 +158,24 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
||||
messageCollector.report(ERROR, "Unknown produce kind: ${arguments.irProduceOnly}. Valid values are: js, klib")
|
||||
}
|
||||
|
||||
if (produceKind == ProduceKind.KLIB || (produceKind == ProduceKind.DEFAULT && arguments.metaInfo)) {
|
||||
val outputKlibPath =
|
||||
if (arguments.irLegacyGradlePluginCompatimbility)
|
||||
File(outputFilePath).parent
|
||||
else
|
||||
"$outputFilePath.klib"
|
||||
|
||||
generateKLib(
|
||||
project = config.project,
|
||||
files = sourcesFiles,
|
||||
configuration = config.configuration,
|
||||
allDependencies = dependencies,
|
||||
friendDependencies = friendDependencies,
|
||||
outputKlibPath = outputKlibPath,
|
||||
nopack = arguments.irLegacyGradlePluginCompatimbility
|
||||
)
|
||||
}
|
||||
|
||||
if (produceKind == ProduceKind.JS || produceKind == ProduceKind.DEFAULT) {
|
||||
val phaseConfig = createPhaseConfig(jsPhases, arguments, messageCollector)
|
||||
|
||||
@@ -231,7 +184,6 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
||||
sourcesFiles,
|
||||
configuration,
|
||||
phaseConfig,
|
||||
immediateDependencies = dependencies,
|
||||
allDependencies = dependencies,
|
||||
friendDependencies = friendDependencies,
|
||||
mainArguments = mainCallArguments
|
||||
@@ -240,19 +192,6 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
||||
outputFile.writeText(compiledModule)
|
||||
}
|
||||
|
||||
if (produceKind == ProduceKind.KLIB || (produceKind == ProduceKind.DEFAULT && arguments.metaInfo)) {
|
||||
val outputKlibPath = "$outputFilePath.KLIB"
|
||||
generateKLib(
|
||||
project = config.project,
|
||||
files = sourcesFiles,
|
||||
configuration = config.configuration,
|
||||
immediateDependencies = dependencies,
|
||||
allDependencies = dependencies,
|
||||
friendDependencies = friendDependencies,
|
||||
outputKlibPath = outputKlibPath
|
||||
)
|
||||
}
|
||||
|
||||
return OK
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user