diff --git a/compiler/util/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt b/compiler/util/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt index e5c32325528..1025ac320b8 100644 --- a/compiler/util/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt +++ b/compiler/util/src/org/jetbrains/kotlin/utils/JsLibraryUtils.kt @@ -30,16 +30,16 @@ object JsLibraryUtils { private val META_INF_RESOURCES = "${LibraryUtils.META_INF}resources/" - @JvmStatic fun copyJsFilesFromLibraries(libraries: List, outputLibraryJsPath: String) { + @JvmStatic fun copyJsFilesFromLibraries(libraries: List, outputLibraryJsPath: String, copySourceMap: Boolean = false) { for (library in libraries) { val file = File(library) assert(file.exists()) { "Library $library not found" } if (file.isDirectory) { - copyJsFilesFromDirectory(file, outputLibraryJsPath) + copyJsFilesFromDirectory(file, outputLibraryJsPath, copySourceMap) } else { - copyJsFilesFromZip(file, outputLibraryJsPath) + copyJsFilesFromZip(file, outputLibraryJsPath, copySourceMap) } } } @@ -68,10 +68,8 @@ object JsLibraryUtils { } } - private fun copyJsFilesFromDirectory(dir: File, outputLibraryJsPath: String) { - traverseDirectory(dir) { (content, path) -> - FileUtil.writeToFile(File(outputLibraryJsPath, path), content) - } + private fun copyJsFilesFromDirectory(dir: File, outputLibraryJsPath: String, copySourceMap: Boolean) { + traverseDirectory(dir) { copyLibrary(outputLibraryJsPath, it, copySourceMap) } } private fun File.contentIfExists(): String? = if (exists()) readText() else null @@ -99,9 +97,16 @@ object JsLibraryUtils { } } - private fun copyJsFilesFromZip(file: File, outputLibraryJsPath: String) { - traverseArchive(file) { library -> - FileUtil.writeToFile(File(outputLibraryJsPath, library.path), library.content) + private fun copyJsFilesFromZip(file: File, outputLibraryJsPath: String, copySourceMap: Boolean) { + traverseArchive(file) { copyLibrary(outputLibraryJsPath, it, copySourceMap) } + } + + private fun copyLibrary(outputPath: String, library: JsLibrary, copySourceMap: Boolean) { + val targetFile = File(outputPath, library.path) + targetFile.parentFile.mkdirs() + targetFile.writeText(library.content) + if (copySourceMap) { + library.sourceMapContent?.let { File(targetFile.parent, targetFile.name + ".map").writeText(it) } } } diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index 7a484fa415f..b360bd55057 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -305,6 +305,9 @@ class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { val sourceMapContent = File(getOutputDir(PROJECT_NAME), "$PROJECT_NAME.js.map").readText() val expectedPath = "prefix-dir/pkg/test1.kt" assertTrue("Source map file should contain relative path ($expectedPath)", sourceMapContent.contains("\"$expectedPath\"")) + + val librarySourceMapFile = File(getOutputDir(PROJECT_NAME), "lib/kotlin.js.map") + assertTrue("Source map for stdlib should be copied to $librarySourceMapFile", librarySourceMapFile.exists()) } fun testKotlinJavaScriptProjectWithTwoModules() { diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index 32328819334..eec33685141 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -679,11 +679,13 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val representativeTarget = chunk.representativeTarget() val outputDir = KotlinBuilderModuleScriptGenerator.getOutputDirSafe(representativeTarget) val compilerSettings = JpsKotlinCompilerSettings.getCompilerSettings(representativeTarget.module) + val k2jsCompilerSettings = JpsKotlinCompilerSettings.getK2JsCompilerArguments(representativeTarget.module) if (compilerSettings.copyJsLibraryFiles) { val outputLibraryRuntimeDirectory = File(outputDir, compilerSettings.outputDirectoryForJsLibraryFiles).absolutePath val libraryFilesToCopy = arrayListOf() JpsJsModuleUtils.getLibraryFiles(representativeTarget, libraryFilesToCopy) - JsLibraryUtils.copyJsFilesFromLibraries(libraryFilesToCopy, outputLibraryRuntimeDirectory) + JsLibraryUtils.copyJsFilesFromLibraries(libraryFilesToCopy, outputLibraryRuntimeDirectory, + copySourceMap = k2jsCompilerSettings.sourceMap) } }