From dcc47fd8ef32c140ecbf67ef15d002ac48be3e79 Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Fri, 23 Nov 2018 12:02:59 +0300 Subject: [PATCH] JPS: support KotlinResourceSourceRootType Implementation is similar to KotlinSourceRootProvider. This workaround is required since ResourcesTarget.computeRootDescriptors supports only JavaResourceRoots. #KT-27622 Fixed --- .../kotlin/jps/build/KotlinJpsBuildTest.kt | 7 +++ ...ps.builders.AdditionalRootsProviderService | 3 +- .../jps/build/KotlinResourcesRootProvider.kt | 49 +++++++++++++++++++ .../assets/resource.txt | 1 + .../expected-output.txt | 9 ++++ .../kotlinProject.iml | 13 +++++ .../kotlinProject.ipr | 14 ++++++ .../src/Main.kt | 3 ++ 8 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinResourcesRootProvider.kt create mode 100755 jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/assets/resource.txt create mode 100644 jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/expected-output.txt create mode 100644 jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.iml create mode 100644 jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.ipr create mode 100755 jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/src/Main.kt 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 f2ac3589757..61f550c2efb 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 @@ -268,6 +268,13 @@ open class KotlinJpsBuildTest : AbstractKotlinJpsBuildTestCase() { return list.toTypedArray() } + fun testKotlinJavaScriptProjectNewSourceRootTypes() { + initProject(JS_STDLIB) + buildAllModules().assertSuccessful() + + checkOutputFilesList() + } + fun testKotlinJavaScriptProjectWithCustomOutputPaths() { initProject(JS_STDLIB) buildAllModules().assertSuccessful() diff --git a/jps-plugin/src/META-INF/services/org.jetbrains.jps.builders.AdditionalRootsProviderService b/jps-plugin/src/META-INF/services/org.jetbrains.jps.builders.AdditionalRootsProviderService index efe8f6601cb..775a989618d 100644 --- a/jps-plugin/src/META-INF/services/org.jetbrains.jps.builders.AdditionalRootsProviderService +++ b/jps-plugin/src/META-INF/services/org.jetbrains.jps.builders.AdditionalRootsProviderService @@ -1 +1,2 @@ -org.jetbrains.kotlin.jps.build.KotlinSourceRootProvider \ No newline at end of file +org.jetbrains.kotlin.jps.build.KotlinSourceRootProvider +org.jetbrains.kotlin.jps.build.KotlinResourcesRootProvider \ No newline at end of file diff --git a/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinResourcesRootProvider.kt b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinResourcesRootProvider.kt new file mode 100644 index 00000000000..cd6be0fbc51 --- /dev/null +++ b/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinResourcesRootProvider.kt @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.jps.build + +import org.jetbrains.jps.builders.AdditionalRootsProviderService +import org.jetbrains.jps.builders.BuildTarget +import org.jetbrains.jps.builders.java.ResourceRootDescriptor +import org.jetbrains.jps.builders.java.ResourcesTargetType +import org.jetbrains.jps.builders.storage.BuildDataPaths +import org.jetbrains.jps.incremental.ResourcesTarget +import org.jetbrains.jps.model.java.JavaResourceRootProperties +import org.jetbrains.kotlin.config.KotlinResourceRootType + +class KotlinResourcesRootProvider : AdditionalRootsProviderService(ResourcesTargetType.ALL_TYPES) { + override fun getAdditionalRoots( + target: BuildTarget, + dataPaths: BuildDataPaths? + ): List { + val moduleBuildTarget = target as? ResourcesTarget ?: return listOf() + val module = moduleBuildTarget.module + + val result = mutableListOf() + + // Add source roots with type KotlinResourceRootType. + // See the note in KotlinSourceRootProvider + val kotlinResourceRootType = if (target.isTests) KotlinResourceRootType.TestResource else KotlinResourceRootType.Resource + module.getSourceRoots(kotlinResourceRootType).forEach { + result.add( + ResourceRootDescriptor( + it.file, + target, + it.properties.packagePrefix, + setOf() + ) + ) + } + + return result + } +} + +/** + * Copied from implementation of org.jetbrains.jps.incremental.ResourcesTarget.computeRootDescriptors + */ +private val JavaResourceRootProperties.packagePrefix: String + get() = relativeOutputPath.replace('/', '.') \ No newline at end of file diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/assets/resource.txt b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/assets/resource.txt new file mode 100755 index 00000000000..30d74d25844 --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/assets/resource.txt @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/expected-output.txt b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/expected-output.txt new file mode 100644 index 00000000000..ed929602d07 --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/expected-output.txt @@ -0,0 +1,9 @@ +kotlinProject/ + kotlinProject/ + root-package.kjsm + kotlinProject.js + kotlinProject.meta.js + lib/ + kotlin.js + kotlin.meta.js + resource.txt \ No newline at end of file diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.iml b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.iml new file mode 100644 index 00000000000..2bc53878496 --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.iml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.ipr b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.ipr new file mode 100644 index 00000000000..cfe9e11ba2e --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/kotlinProject.ipr @@ -0,0 +1,14 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/src/Main.kt b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/src/Main.kt new file mode 100755 index 00000000000..174582e286c --- /dev/null +++ b/jps-plugin/testData/general/KotlinJavaScriptProjectNewSourceRootTypes/src/Main.kt @@ -0,0 +1,3 @@ +fun main(args: Array) { + println("Hello") +}