[JS IR] Generate the correct relative paths in source maps
This commit is contained in:
@@ -190,12 +190,9 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
|||||||
val moduleName = arguments.irModuleName ?: FileUtil.getNameWithoutExtension(outputFile)
|
val moduleName = arguments.irModuleName ?: FileUtil.getNameWithoutExtension(outputFile)
|
||||||
configurationJs.put(CommonConfigurationKeys.MODULE_NAME, moduleName)
|
configurationJs.put(CommonConfigurationKeys.MODULE_NAME, moduleName)
|
||||||
|
|
||||||
// TODO: in this method at least 3 different compiler configurations are used (original, env.configuration, jsConfig.configuration)
|
|
||||||
// Such situation seems a bit buggy...
|
|
||||||
val config = JsConfig(projectJs, configurationJs, CompilerEnvironment)
|
|
||||||
val outputDir: File = outputFile.parentFile ?: outputFile.absoluteFile.parentFile!!
|
val outputDir: File = outputFile.parentFile ?: outputFile.absoluteFile.parentFile!!
|
||||||
try {
|
try {
|
||||||
config.configuration.put(JSConfigurationKeys.OUTPUT_DIR, outputDir.canonicalFile)
|
configurationJs.put(JSConfigurationKeys.OUTPUT_DIR, outputDir.canonicalFile)
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
messageCollector.report(ERROR, "Could not resolve output directory", null)
|
messageCollector.report(ERROR, "Could not resolve output directory", null)
|
||||||
return ExitCode.COMPILATION_ERROR
|
return ExitCode.COMPILATION_ERROR
|
||||||
@@ -262,7 +259,7 @@ class K2JsIrCompiler : CLICompiler<K2JSCompilerArguments>() {
|
|||||||
configurationJs,
|
configurationJs,
|
||||||
libraries,
|
libraries,
|
||||||
friendLibraries,
|
friendLibraries,
|
||||||
AnalyzerWithCompilerReport(config.configuration)
|
AnalyzerWithCompilerReport(configurationJs)
|
||||||
)
|
)
|
||||||
val result = sourceModule.jsFrontEndResult.jsAnalysisResult
|
val result = sourceModule.jsFrontEndResult.jsAnalysisResult
|
||||||
if (result is JsAnalysisResult.RetryWithAdditionalRoots) {
|
if (result is JsAnalysisResult.RetryWithAdditionalRoots) {
|
||||||
|
|||||||
+31
-12
@@ -620,10 +620,30 @@ abstract class AbstractKotlin2JsGradlePluginIT(protected val irBackend: Boolean)
|
|||||||
fun testKotlinJsSourceMap(gradleVersion: GradleVersion) {
|
fun testKotlinJsSourceMap(gradleVersion: GradleVersion) {
|
||||||
project("kotlin2JsProjectWithSourceMap", gradleVersion) {
|
project("kotlin2JsProjectWithSourceMap", gradleVersion) {
|
||||||
build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") {
|
build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") {
|
||||||
val mapFilePath = projectPath
|
if (irBackend) {
|
||||||
.resolve("build/js/packages/$projectName-app/kotlin/$projectName-app.js.map")
|
assertFileContains(
|
||||||
|
subProject("app").projectPath
|
||||||
|
.resolve("build/compileSync/main/developmentExecutable/kotlin/$projectName-app.js.map"),
|
||||||
|
"\"../../../../../src/main/kotlin/main.kt\"",
|
||||||
|
"\"../../../../../../lib/src/main/kotlin/foo.kt\"",
|
||||||
|
"\"sourcesContent\":[null",
|
||||||
|
)
|
||||||
|
assertFileContains(
|
||||||
|
subProject("app").projectPath
|
||||||
|
.resolve("build/compileSync/main/developmentExecutable/kotlin/$projectName-lib.js.map"),
|
||||||
|
"\"../../../../../../lib/src/main/kotlin/foo.kt\"",
|
||||||
|
"\"sourcesContent\":[null",
|
||||||
|
)
|
||||||
|
assertFileContains(
|
||||||
|
projectPath
|
||||||
|
.resolve("build/js/packages/$projectName-app/kotlin/$projectName-lib.js.map"),
|
||||||
|
"\"../../../../../lib/src/main/kotlin/foo.kt\"",
|
||||||
|
"\"sourcesContent\":[null",
|
||||||
|
)
|
||||||
|
}
|
||||||
assertFileContains(
|
assertFileContains(
|
||||||
mapFilePath,
|
projectPath
|
||||||
|
.resolve("build/js/packages/$projectName-app/kotlin/$projectName-app.js.map"),
|
||||||
"\"../../../../../app/src/main/kotlin/main.kt\"",
|
"\"../../../../../app/src/main/kotlin/main.kt\"",
|
||||||
"\"../../../../../lib/src/main/kotlin/foo.kt\"",
|
"\"../../../../../lib/src/main/kotlin/foo.kt\"",
|
||||||
"\"sourcesContent\":[null",
|
"\"sourcesContent\":[null",
|
||||||
@@ -669,10 +689,6 @@ abstract class AbstractKotlin2JsGradlePluginIT(protected val irBackend: Boolean)
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DisplayName("path in source maps are remapped for custom outputFile")
|
@DisplayName("path in source maps are remapped for custom outputFile")
|
||||||
@DisabledIf(
|
|
||||||
"org.jetbrains.kotlin.gradle.AbstractKotlin2JsGradlePluginIT#getIrBackend",
|
|
||||||
disabledReason = "Source maps are not supported in IR backend"
|
|
||||||
)
|
|
||||||
@GradleTest
|
@GradleTest
|
||||||
fun testKotlinJsSourceMapCustomOutputFile(gradleVersion: GradleVersion) {
|
fun testKotlinJsSourceMapCustomOutputFile(gradleVersion: GradleVersion) {
|
||||||
project("kotlin2JsProjectWithSourceMap", gradleVersion) {
|
project("kotlin2JsProjectWithSourceMap", gradleVersion) {
|
||||||
@@ -693,11 +709,14 @@ abstract class AbstractKotlin2JsGradlePluginIT(protected val irBackend: Boolean)
|
|||||||
build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") {
|
build(if (irBackend) "compileDevelopmentExecutableKotlinJs" else "compileKotlinJs") {
|
||||||
val mapFilePath = subProject("app").projectPath
|
val mapFilePath = subProject("app").projectPath
|
||||||
.resolve("build/kotlin2js/app.js.map")
|
.resolve("build/kotlin2js/app.js.map")
|
||||||
assertFileContains(
|
assertFileContains(mapFilePath,"\"../../src/main/kotlin/main.kt\"")
|
||||||
mapFilePath,
|
if (irBackend) {
|
||||||
"\"../../src/main/kotlin/main.kt\"",
|
// The IR BE generates correct paths for dependencies
|
||||||
"\"../../../../../lib/src/main/kotlin/foo.kt\"",
|
assertFileContains(mapFilePath, "\"../../../lib/src/main/kotlin/foo.kt\"")
|
||||||
)
|
} else {
|
||||||
|
// The legacy BE doesn't.
|
||||||
|
assertFileContains(mapFilePath, "\"../../../../../lib/src/main/kotlin/foo.kt\"")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-4
@@ -141,12 +141,20 @@ open class RewriteSourceMapFilterReader(
|
|||||||
log.warn("Cannot rewrite paths in JavaScript source maps: $reason")
|
log.warn("Cannot rewrite paths in JavaScript source maps: $reason")
|
||||||
}
|
}
|
||||||
|
|
||||||
protected open fun transformString(value: String): String =
|
protected open fun transformString(value: String): String {
|
||||||
File(srcSourceRoot)
|
val sourceFileResolved = File(srcSourceRoot)
|
||||||
.resolve(value)
|
.resolve(value)
|
||||||
.canonicalFile
|
.canonicalFile
|
||||||
.relativeToOrSelf(File(targetSourceRoot))
|
|
||||||
.path
|
val transformedPath = sourceFileResolved.relativeToOrNull(File(targetSourceRoot))?.path ?: return sourceFileResolved.path
|
||||||
|
|
||||||
|
return if (File.separatorChar == '\\') {
|
||||||
|
transformedPath.replace('\\', '/')
|
||||||
|
} else {
|
||||||
|
transformedPath
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun read(): Int {
|
override fun read(): Int {
|
||||||
maybeReadFirst()
|
maybeReadFirst()
|
||||||
|
|||||||
+14
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsReportAggregatingTestRun
|
|||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec
|
import org.jetbrains.kotlin.gradle.targets.js.binaryen.BinaryenExec
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.*
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.*
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.internal.RewriteSourceMapFilterReader
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||||
@@ -145,6 +146,19 @@ constructor(
|
|||||||
|
|
||||||
task.from(project.tasks.named(compilation.processResourcesTaskName))
|
task.from(project.tasks.named(compilation.processResourcesTaskName))
|
||||||
|
|
||||||
|
// Rewrite relative paths in sourcemaps in the target directory
|
||||||
|
task.eachFile {
|
||||||
|
if (it.name.endsWith(".js.map")) {
|
||||||
|
it.filter(
|
||||||
|
mapOf(
|
||||||
|
"srcSourceRoot" to it.file.parentFile,
|
||||||
|
"targetSourceRoot" to npmProject.dist
|
||||||
|
),
|
||||||
|
RewriteSourceMapFilterReader::class.java
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
task.into(npmProject.dist)
|
task.into(npmProject.dist)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
-11
@@ -128,17 +128,6 @@ open class KotlinJsIrTargetConfigurator() :
|
|||||||
.all { binary ->
|
.all { binary ->
|
||||||
binary.linkTask.configure { linkTask ->
|
binary.linkTask.configure { linkTask ->
|
||||||
linkTask.kotlinOptions.configureOptions()
|
linkTask.kotlinOptions.configureOptions()
|
||||||
|
|
||||||
val rootDir = binary.project.rootDir
|
|
||||||
linkTask.kotlinOptions.freeCompilerArgs += listOf(
|
|
||||||
"-source-map-base-dirs",
|
|
||||||
rootDir.absolutePath
|
|
||||||
)
|
|
||||||
|
|
||||||
linkTask.kotlinOptions.freeCompilerArgs += listOf(
|
|
||||||
"-source-map-prefix",
|
|
||||||
rootDir.toRelativeString(binary.compilation.npmProject.dist) + File.separator
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user