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 6dc04e9b1b5..928c61d8924 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 @@ -298,6 +298,15 @@ class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { checkWhen(touch("src/test1.kt"), null, k2jsOutput(PROJECT_NAME)) } + fun testKotlinJavaScriptProjectWithSourceMap() { + initProject(JS_STDLIB) + buildAllModules().assertSuccessful() + + 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\"")) + } + fun testKotlinJavaScriptProjectWithTwoModules() { initProject(JS_STDLIB) buildAllModules().assertSuccessful() @@ -690,8 +699,7 @@ class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { } private fun contentOfOutputDir(moduleName: String): Set { - val outputDir = "out/production/$moduleName" - val baseDir = File(workDir, outputDir) + val baseDir = getOutputDir(moduleName) val files = FileUtil.findFilesByMask(Pattern.compile(".*"), baseDir) val result = HashSet() for (file in files) { @@ -702,6 +710,8 @@ class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { return result } + private fun getOutputDir(moduleName: String): File = File(workDir, "out/production/$moduleName") + fun testReexportedDependency() { initProject() AbstractKotlinJpsBuildTestCase.addKotlinRuntimeDependency(JpsJavaDependencyScope.COMPILE, ContainerUtil.filter(myProject.modules, object : Condition { diff --git a/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt b/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt index ae6a95339fc..32fe18f2bff 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/compilerRunner/JpsKotlinCompilerRunner.kt @@ -20,7 +20,10 @@ import com.intellij.util.xmlb.XmlSerializerUtil import org.jetbrains.jps.api.GlobalOptions import org.jetbrains.kotlin.cli.common.ExitCode import org.jetbrains.kotlin.cli.common.KOTLIN_COMPILER_ENVIRONMENT_KEEPALIVE_PROPERTY -import org.jetbrains.kotlin.cli.common.arguments.* +import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments +import org.jetbrains.kotlin.cli.common.arguments.mergeBeans import org.jetbrains.kotlin.config.CompilerSettings import org.jetbrains.kotlin.config.additionalArgumentsAsList import org.jetbrains.kotlin.daemon.client.CompileServiceSession @@ -81,6 +84,7 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner() { compilerSettings: CompilerSettings, environment: JpsCompilerEnvironment, sourceFiles: Collection, + sourceRoots: Collection, libraries: List, friendModules: List, outputFile: File @@ -92,6 +96,10 @@ class JpsKotlinCompilerRunner : KotlinCompilerRunner() { log.debug("K2JS: merged arguments: " + ArgumentUtils.convertArgumentsToStringList(arguments)) setupK2JsArguments(outputFile, sourceFiles, libraries, friendModules, arguments) + if (arguments.sourceMap) { + arguments.sourceMapSourceRoots = sourceRoots.joinToString(File.pathSeparator) { it.path } + } + log.debug("K2JS: arguments after setup" + ArgumentUtils.convertArgumentsToStringList(arguments)) withCompilerSettings(compilerSettings) { 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 c1cf1016223..ea124e32e72 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -662,13 +662,16 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val compilerSettings = JpsKotlinCompilerSettings.getCompilerSettings(representativeModule) val k2JsArguments = JpsKotlinCompilerSettings.getK2JsCompilerArguments(representativeModule) + val sourceRoots = KotlinSourceFileCollector.getRelevantSourceRoots(representativeTarget).map { it.file } + val friendPaths = KotlinBuilderModuleScriptGenerator.getProductionModulesWhichInternalsAreVisible(representativeTarget).mapNotNull { val file = getOutputMetaFile(it, false) if (file.exists()) file.absolutePath.toString() else null } val compilerRunner = JpsKotlinCompilerRunner() - compilerRunner.runK2JsCompiler(commonArguments, k2JsArguments, compilerSettings, environment, sourceFiles, libraries, friendPaths, outputFile) + compilerRunner.runK2JsCompiler(commonArguments, k2JsArguments, compilerSettings, environment, sourceFiles, sourceRoots, + libraries, friendPaths, outputFile) return environment.outputItemsCollector } diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.java b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.java index 5fc6f77ddc5..c8323d2f226 100644 --- a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.java +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.java @@ -124,7 +124,7 @@ public class KotlinSourceFileCollector { return result; } - private static Iterable getRelevantSourceRoots(ModuleBuildTarget target) { + public static Iterable getRelevantSourceRoots(ModuleBuildTarget target) { JavaSourceRootType sourceRootType = target.isTests() ? JavaSourceRootType.TEST_SOURCE : JavaSourceRootType.SOURCE; //noinspection unchecked diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/kotlinProject.iml b/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/kotlinProject.iml new file mode 100644 index 00000000000..a0cbe548242 --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/kotlinProject.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/kotlinProject.ipr b/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/kotlinProject.ipr new file mode 100644 index 00000000000..16a88d84040 --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/kotlinProject.ipr @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/src/pkg/test1.kt b/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/src/pkg/test1.kt new file mode 100644 index 00000000000..112bd39189a --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectWithSourceMap/src/pkg/test1.kt @@ -0,0 +1,7 @@ +package pkg + +var log = "" + +fun foo(x: String) { + log += "$x;" +} \ No newline at end of file