From 21772d2a14b1237e352fe87a8d23a720a65dda43 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 4 Apr 2018 12:35:41 +0300 Subject: [PATCH] Configuration: Introduce special source roots for non-JVM Kotlin modules #KT-5948 Fixed #KT-23672 Fixed Original commit: 9fa26c83b600191135b5da5e3bd51e5d54661a89 --- jps/jps-common/build.gradle.kts | 1 + ...tlinCommonJpsModelSerializerExtension.java | 26 ++++++ .../kotlin/config/KotlinResourceRootType.kt | 20 +++++ .../kotlin/config/KotlinSourceRootType.kt | 19 +++++ .../moduleSourceRootPropertiesSerializers.kt | 85 +++++++++++++++++++ .../jps/build/KotlinSourceFileCollector.kt | 3 - .../platforms/KotlinModuleBuilderTarget.kt | 31 ++++--- 7 files changed, 172 insertions(+), 13 deletions(-) create mode 100644 jps/jps-common/src/org/jetbrains/kotlin/config/KotlinCommonJpsModelSerializerExtension.java create mode 100644 jps/jps-common/src/org/jetbrains/kotlin/config/KotlinResourceRootType.kt create mode 100644 jps/jps-common/src/org/jetbrains/kotlin/config/KotlinSourceRootType.kt create mode 100644 jps/jps-common/src/org/jetbrains/kotlin/config/moduleSourceRootPropertiesSerializers.kt diff --git a/jps/jps-common/build.gradle.kts b/jps/jps-common/build.gradle.kts index d8b043d5136..469913e8e29 100644 --- a/jps/jps-common/build.gradle.kts +++ b/jps/jps-common/build.gradle.kts @@ -11,6 +11,7 @@ dependencies { compile(project(":compiler:cli-common")) compile(project(":compiler:frontend.java")) compileOnly(intellijDep()) + compileOnly(intellijDep("jps-standalone")) { includeJars("jps-model") } } sourceSets { diff --git a/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinCommonJpsModelSerializerExtension.java b/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinCommonJpsModelSerializerExtension.java new file mode 100644 index 00000000000..f421a872dc5 --- /dev/null +++ b/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinCommonJpsModelSerializerExtension.java @@ -0,0 +1,26 @@ +/* + * 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.config; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.serialization.JpsModelSerializerExtension; +import org.jetbrains.jps.model.serialization.module.JpsModuleSourceRootPropertiesSerializer; + +import java.util.Arrays; +import java.util.List; + +public class KotlinCommonJpsModelSerializerExtension extends JpsModelSerializerExtension { + @NotNull + @Override + public List> getModuleSourceRootPropertiesSerializers() { + return Arrays.asList( + KotlinSourceRootPropertiesSerializer.Source.INSTANCE, + KotlinSourceRootPropertiesSerializer.TestSource.INSTANCE, + KotlinResourceRootPropertiesSerializer.Resource.INSTANCE, + KotlinResourceRootPropertiesSerializer.TestResource.INSTANCE + ); + } +} \ No newline at end of file diff --git a/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinResourceRootType.kt b/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinResourceRootType.kt new file mode 100644 index 00000000000..757957c14df --- /dev/null +++ b/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinResourceRootType.kt @@ -0,0 +1,20 @@ +/* + * 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.config + +import org.jetbrains.jps.model.ex.JpsElementTypeBase +import org.jetbrains.jps.model.java.JavaResourceRootProperties +import org.jetbrains.jps.model.java.JpsJavaExtensionService +import org.jetbrains.jps.model.module.JpsModuleSourceRootType + +sealed class KotlinResourceRootType : JpsElementTypeBase(), + JpsModuleSourceRootType { + object Resource : KotlinResourceRootType() + object TestResource : KotlinResourceRootType() + + override fun createDefaultProperties() = + JpsJavaExtensionService.getInstance().createResourceRootProperties("", false) +} \ No newline at end of file diff --git a/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinSourceRootType.kt b/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinSourceRootType.kt new file mode 100644 index 00000000000..680ffeaa67c --- /dev/null +++ b/jps/jps-common/src/org/jetbrains/kotlin/config/KotlinSourceRootType.kt @@ -0,0 +1,19 @@ +/* + * 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.config + +import org.jetbrains.jps.model.ex.JpsElementTypeBase +import org.jetbrains.jps.model.java.JavaSourceRootProperties +import org.jetbrains.jps.model.java.JpsJavaExtensionService +import org.jetbrains.jps.model.module.JpsModuleSourceRootType + +sealed class KotlinSourceRootType : JpsElementTypeBase(), JpsModuleSourceRootType { + object Source : KotlinSourceRootType() + object TestSource : KotlinSourceRootType() + + override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("") +} + diff --git a/jps/jps-common/src/org/jetbrains/kotlin/config/moduleSourceRootPropertiesSerializers.kt b/jps/jps-common/src/org/jetbrains/kotlin/config/moduleSourceRootPropertiesSerializers.kt new file mode 100644 index 00000000000..77d487c457d --- /dev/null +++ b/jps/jps-common/src/org/jetbrains/kotlin/config/moduleSourceRootPropertiesSerializers.kt @@ -0,0 +1,85 @@ +/* + * 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.config + +import org.jdom.Element +import org.jetbrains.jps.model.java.JavaResourceRootProperties +import org.jetbrains.jps.model.java.JavaSourceRootProperties +import org.jetbrains.jps.model.java.JpsJavaExtensionService +import org.jetbrains.jps.model.module.JpsModuleSourceRootType +import org.jetbrains.jps.model.serialization.module.JpsModuleRootModelSerializer +import org.jetbrains.jps.model.serialization.module.JpsModuleSourceRootPropertiesSerializer + +private val IS_GENERATED_ATTRIBUTE = "generated" +private val RELATIVE_OUTPUT_PATH_ATTRIBUTE = "relativeOutputPath" + +val KOTLIN_SOURCE_ROOT_TYPE_ID = "kotlin-source" +val KOTLIN_TEST_ROOT_TYPE_ID = "kotlin-test" +val KOTLIN_RESOURCE_ROOT_TYPE_ID = "kotlin-resource" +val KOTLIN_TEST_RESOURCE_ROOT_TYPE_ID = "kotlin-test-resource" + +// Based on org.jetbrains.jps.model.serialization.java.JpsJavaModelSerializerExtension.JavaSourceRootPropertiesSerializer class +sealed class KotlinSourceRootPropertiesSerializer( + type: JpsModuleSourceRootType, + typeId: String +) : JpsModuleSourceRootPropertiesSerializer(type, typeId) { + object Source : KotlinSourceRootPropertiesSerializer( + KotlinSourceRootType.Source, + KOTLIN_SOURCE_ROOT_TYPE_ID + ) + + object TestSource : KotlinSourceRootPropertiesSerializer( + KotlinSourceRootType.TestSource, + KOTLIN_TEST_ROOT_TYPE_ID + ) + + override fun loadProperties(sourceRootTag: Element): JavaSourceRootProperties { + val packagePrefix = sourceRootTag.getAttributeValue(JpsModuleRootModelSerializer.PACKAGE_PREFIX_ATTRIBUTE) ?: "" + val isGenerated = sourceRootTag.getAttributeValue(IS_GENERATED_ATTRIBUTE)?.toBoolean() ?: false + return JpsJavaExtensionService.getInstance().createSourceRootProperties(packagePrefix, isGenerated) + } + + override fun saveProperties(properties: JavaSourceRootProperties, sourceRootTag: Element) { + val packagePrefix = properties.packagePrefix + if (packagePrefix.isNotEmpty()) { + sourceRootTag.setAttribute(JpsModuleRootModelSerializer.PACKAGE_PREFIX_ATTRIBUTE, packagePrefix) + } + if (properties.isForGeneratedSources) { + sourceRootTag.setAttribute(IS_GENERATED_ATTRIBUTE, "true") + } + } +} + +// Based on org.jetbrains.jps.model.serialization.java.JpsJavaModelSerializerExtension.JavaResourceRootPropertiesSerializer +sealed class KotlinResourceRootPropertiesSerializer( + type: JpsModuleSourceRootType, + typeId: String +) : JpsModuleSourceRootPropertiesSerializer(type, typeId) { + object Resource : KotlinResourceRootPropertiesSerializer( + KotlinResourceRootType.Resource, + KOTLIN_RESOURCE_ROOT_TYPE_ID + ) + object TestResource : KotlinResourceRootPropertiesSerializer( + KotlinResourceRootType.TestResource, + KOTLIN_TEST_RESOURCE_ROOT_TYPE_ID + ) + + override fun loadProperties(sourceRootTag: Element): JavaResourceRootProperties { + val relativeOutputPath = sourceRootTag.getAttributeValue(RELATIVE_OUTPUT_PATH_ATTRIBUTE) ?: "" + val isGenerated = sourceRootTag.getAttributeValue(IS_GENERATED_ATTRIBUTE)?.toBoolean() ?: false + return JpsJavaExtensionService.getInstance().createResourceRootProperties(relativeOutputPath, isGenerated) + } + + override fun saveProperties(properties: JavaResourceRootProperties, sourceRootTag: Element) { + val relativeOutputPath = properties.relativeOutputPath + if (relativeOutputPath.isNotEmpty()) { + sourceRootTag.setAttribute(RELATIVE_OUTPUT_PATH_ATTRIBUTE, relativeOutputPath) + } + if (properties.isForGeneratedSources) { + sourceRootTag.setAttribute(IS_GENERATED_ATTRIBUTE, "true") + } + } +} \ No newline at end of file diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.kt index 742fb4fdde6..f5e38e66f5a 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/build/KotlinSourceFileCollector.kt @@ -21,9 +21,6 @@ import com.intellij.util.containers.MultiMap import org.jetbrains.jps.builders.DirtyFilesHolder import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor import org.jetbrains.jps.incremental.ModuleBuildTarget -import org.jetbrains.jps.model.java.JavaSourceRootProperties -import org.jetbrains.jps.model.java.JavaSourceRootType -import org.jetbrains.jps.model.module.JpsModuleSourceRoot import java.io.File diff --git a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuilderTarget.kt b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuilderTarget.kt index 0eb6112c94d..d911e923906 100644 --- a/jps/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuilderTarget.kt +++ b/jps/jps-plugin/src/org/jetbrains/kotlin/jps/platforms/KotlinModuleBuilderTarget.kt @@ -16,10 +16,12 @@ import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.java.JpsJavaClasspathKind import org.jetbrains.jps.model.java.JpsJavaExtensionService import org.jetbrains.jps.model.module.JpsModule +import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.jps.util.JpsPathUtil import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.compilerRunner.JpsCompilerEnvironment +import org.jetbrains.kotlin.config.KotlinSourceRootType import org.jetbrains.kotlin.jps.build.FSOperationsHelper import org.jetbrains.kotlin.jps.build.KotlinSourceFileCollector import org.jetbrains.kotlin.jps.model.kotlinFacet @@ -33,6 +35,13 @@ import java.io.File * Properties and actions for Kotlin test / production module build target. */ abstract class KotlinModuleBuilderTarget(val context: CompileContext, val jpsModuleBuildTarget: ModuleBuildTarget) { + val sourceRootTypes: Collection> + get() = if (isTests) { + listOf(JavaSourceRootType.TEST_SOURCE, KotlinSourceRootType.TestSource) + } else { + listOf(JavaSourceRootType.SOURCE, KotlinSourceRootType.Source) + } + val module: JpsModule get() = jpsModuleBuildTarget.module @@ -116,16 +125,18 @@ abstract class KotlinModuleBuilderTarget(val context: CompileContext, val jpsMod .getOrCreateCompilerConfiguration(module.project) .compilerExcludes - val sourceRootType = if (isTests) JavaSourceRootType.TEST_SOURCE else JavaSourceRootType.SOURCE - module.getSourceRoots(sourceRootType).forEach { - it.file.walkTopDown() - .onEnter { it !in moduleExcludes } - .filterTo(receiver) { - !compilerExcludes.isExcluded(it) && - it.isFile && - KotlinSourceFileCollector.isKotlinSourceFile(it) - } - } + module + .sourceRoots + .filter { it.rootType in sourceRootTypes } + .forEach { + it.file.walkTopDown() + .onEnter { it !in moduleExcludes } + .filterTo(receiver) { + !compilerExcludes.isExcluded(it) && + it.isFile && + KotlinSourceFileCollector.isKotlinSourceFile(it) + } + } } override fun toString() = jpsModuleBuildTarget.toString()