diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt index c9131cc476d..15240773946 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/KotlinJpsBuildTest.kt @@ -262,6 +262,13 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { return list.toTypedArray() } + fun testKotlinJavaScriptProjectWithCustomOutputPaths() { + initProject(JS_STDLIB) + buildAllModules().assertSuccessful() + + checkOutputFilesList(File(workDir, "target")) + } + fun testKotlinJavaScriptProjectWithSourceMap() { initProject(JS_STDLIB) buildAllModules().assertSuccessful() @@ -686,7 +693,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { } - private fun checkOutputFilesList() { + private fun checkOutputFilesList(outputDir: File = productionOutputDir) { if (!expectedOutputFile.exists()) { expectedOutputFile.writeText("") throw IllegalStateException("$expectedOutputFile did not exist. Created empty file.") @@ -694,7 +701,7 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { val sb = StringBuilder() val p = Printer(sb, " ") - productionOutputDir.printFilesRecursively(p) + outputDir.printFilesRecursively(p) UsefulTestCase.assertSameLinesWithFile(expectedOutputFile.canonicalPath, sb.toString(), true) } diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/JpsKotlinCompilerSettings.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/JpsKotlinCompilerSettings.kt index f54ec737ba3..512b45fc59a 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/JpsKotlinCompilerSettings.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/JpsKotlinCompilerSettings.kt @@ -115,4 +115,18 @@ class JpsKotlinCompilerSettings : JpsElementBase() { } val JpsModule.targetPlatform: TargetPlatformKind<*>? - get() = kotlinFacetExtension?.settings?.targetPlatformKind \ No newline at end of file + get() = kotlinFacetExtension?.settings?.targetPlatformKind + +val JpsModule.productionOutputFilePath: String? + get() { + val facetSettings = kotlinFacetExtension?.settings ?: return null + if (facetSettings.useProjectSettings) return null + return facetSettings.productionOutputPath + } + +val JpsModule.testOutputFilePath: String? + get() { + val facetSettings = kotlinFacetExtension?.settings ?: return null + if (facetSettings.useProjectSettings) return null + return facetSettings.testOutputPath + } \ No newline at end of file diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt index abd199ac521..fad89465a20 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilder.kt @@ -56,6 +56,8 @@ import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.jps.JpsKotlinCompilerSettings import org.jetbrains.kotlin.jps.build.JpsJsModuleUtils.getOutputMetaFile import org.jetbrains.kotlin.jps.incremental.* +import org.jetbrains.kotlin.jps.productionOutputFilePath +import org.jetbrains.kotlin.jps.testOutputFilePath import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCache import org.jetbrains.kotlin.load.kotlin.incremental.components.IncrementalCompilationComponents import org.jetbrains.kotlin.modules.TargetId @@ -681,7 +683,9 @@ class KotlinBuilder : ModuleLevelBuilder(BuilderCategory.SOURCE_PROCESSOR) { val representativeModule = representativeTarget.module val moduleName = representativeModule.name - val outputFile = JpsJsModuleUtils.getOutputFile(outputDir, moduleName, representativeTarget.isTests) + val isTests = representativeTarget.isTests + val explicitOutputPath = if (isTests) representativeModule.testOutputFilePath else representativeModule.productionOutputFilePath + val outputFile = explicitOutputPath?.let { File(it) } ?: JpsJsModuleUtils.getOutputFile(outputDir, moduleName, isTests) val libraries = JpsJsModuleUtils.getLibraryFilesAndDependencies(representativeTarget) val compilerSettings = JpsKotlinCompilerSettings.getCompilerSettings(representativeModule) val k2JsArguments = JpsKotlinCompilerSettings.getK2JsCompilerArguments(representativeModule) diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.kt index 04b2855d212..47584a2cf2d 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinBuilderModuleScriptGenerator.kt @@ -34,6 +34,8 @@ import org.jetbrains.jps.model.module.JpsSdkDependency import org.jetbrains.kotlin.build.JvmSourceRoot import org.jetbrains.kotlin.config.IncrementalCompilation import org.jetbrains.kotlin.jps.build.JpsUtils.getAllDependencies +import org.jetbrains.kotlin.jps.productionOutputFilePath +import org.jetbrains.kotlin.jps.testOutputFilePath import org.jetbrains.kotlin.modules.KotlinModuleXmlBuilder import org.jetbrains.kotlin.modules.TargetId import org.jetbrains.kotlin.utils.addIfNotNull @@ -161,8 +163,11 @@ object KotlinBuilderModuleScriptGenerator { } } - fun getOutputDirSafe(target: ModuleBuildTarget): File = - target.outputDir ?: throw ProjectBuildException("No output directory found for " + target) + fun getOutputDirSafe(target: ModuleBuildTarget): File { + val explicitOutputPath = if (target.isTests) target.module.testOutputFilePath else target.module.productionOutputFilePath + val explicitOutputDir = explicitOutputPath?.let { File(it).absoluteFile.parentFile } + return explicitOutputDir ?: target.outputDir ?: throw ProjectBuildException("No output directory found for " + target) + } fun getProductionModulesWhichInternalsAreVisible(from: ModuleBuildTarget): List { if (!from.isTests) return emptyList() diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/expected-output.txt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/expected-output.txt new file mode 100644 index 00000000000..2d80d94ec34 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/expected-output.txt @@ -0,0 +1,16 @@ +my_js/ + lib/ + kotlin.js + kotlin.meta.js + myproject/ + root-package.kjsm + myproject.js + myproject.meta.js +my_test-js/ + lib/ + kotlin.js + kotlin.meta.js + myproject-tests/ + root-package.kjsm + myproject-tests.js + myproject-tests.meta.js \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/kotlinProject.iml b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/kotlinProject.iml new file mode 100644 index 00000000000..2b070ee7b93 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/kotlinProject.iml @@ -0,0 +1,32 @@ + + + + + + $MODULE_DIR$/target/my_js/myproject.js + $MODULE_DIR$/target/my_test-js/myproject-tests.js + + + + + + + + + + + + + + + + + + + diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/kotlinProject.ipr b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/kotlinProject.ipr new file mode 100644 index 00000000000..90747786771 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/kotlinProject.ipr @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/main.kt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/main.kt new file mode 100644 index 00000000000..adb5b33c573 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/main.kt @@ -0,0 +1,3 @@ +fun main(args: Array) { + +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/main/kotlin/main.kt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/main/kotlin/main.kt new file mode 100644 index 00000000000..adb5b33c573 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/main/kotlin/main.kt @@ -0,0 +1,3 @@ +fun main(args: Array) { + +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/test/kotlin/test.kt b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/test/kotlin/test.kt new file mode 100644 index 00000000000..442858bd7b3 --- /dev/null +++ b/jps/jps-plugin/testData/general/KotlinJavaScriptProjectWithCustomOutputPaths/src/test/kotlin/test.kt @@ -0,0 +1,3 @@ +fun test() { + +} \ No newline at end of file