Configuration: Introduce special source roots for non-JVM Kotlin modules
#KT-5948 Fixed
#KT-23672 Fixed
Original commit: 9fa26c83b6
This commit is contained in:
@@ -11,6 +11,7 @@ dependencies {
|
|||||||
compile(project(":compiler:cli-common"))
|
compile(project(":compiler:cli-common"))
|
||||||
compile(project(":compiler:frontend.java"))
|
compile(project(":compiler:frontend.java"))
|
||||||
compileOnly(intellijDep())
|
compileOnly(intellijDep())
|
||||||
|
compileOnly(intellijDep("jps-standalone")) { includeJars("jps-model") }
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
|
|||||||
+26
@@ -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<? extends JpsModuleSourceRootPropertiesSerializer<?>> getModuleSourceRootPropertiesSerializers() {
|
||||||
|
return Arrays.asList(
|
||||||
|
KotlinSourceRootPropertiesSerializer.Source.INSTANCE,
|
||||||
|
KotlinSourceRootPropertiesSerializer.TestSource.INSTANCE,
|
||||||
|
KotlinResourceRootPropertiesSerializer.Resource.INSTANCE,
|
||||||
|
KotlinResourceRootPropertiesSerializer.TestResource.INSTANCE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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<JavaResourceRootProperties>(),
|
||||||
|
JpsModuleSourceRootType<JavaResourceRootProperties> {
|
||||||
|
object Resource : KotlinResourceRootType()
|
||||||
|
object TestResource : KotlinResourceRootType()
|
||||||
|
|
||||||
|
override fun createDefaultProperties() =
|
||||||
|
JpsJavaExtensionService.getInstance().createResourceRootProperties("", false)
|
||||||
|
}
|
||||||
@@ -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<JavaSourceRootProperties>(), JpsModuleSourceRootType<JavaSourceRootProperties> {
|
||||||
|
object Source : KotlinSourceRootType()
|
||||||
|
object TestSource : KotlinSourceRootType()
|
||||||
|
|
||||||
|
override fun createDefaultProperties() = JpsJavaExtensionService.getInstance().createSourceRootProperties("")
|
||||||
|
}
|
||||||
|
|
||||||
+85
@@ -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<JavaSourceRootProperties>,
|
||||||
|
typeId: String
|
||||||
|
) : JpsModuleSourceRootPropertiesSerializer<JavaSourceRootProperties>(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<JavaResourceRootProperties>,
|
||||||
|
typeId: String
|
||||||
|
) : JpsModuleSourceRootPropertiesSerializer<JavaResourceRootProperties>(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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,9 +21,6 @@ import com.intellij.util.containers.MultiMap
|
|||||||
import org.jetbrains.jps.builders.DirtyFilesHolder
|
import org.jetbrains.jps.builders.DirtyFilesHolder
|
||||||
import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor
|
import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor
|
||||||
import org.jetbrains.jps.incremental.ModuleBuildTarget
|
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
|
import java.io.File
|
||||||
|
|
||||||
|
|||||||
+21
-10
@@ -16,10 +16,12 @@ import org.jetbrains.jps.model.java.JavaSourceRootType
|
|||||||
import org.jetbrains.jps.model.java.JpsJavaClasspathKind
|
import org.jetbrains.jps.model.java.JpsJavaClasspathKind
|
||||||
import org.jetbrains.jps.model.java.JpsJavaExtensionService
|
import org.jetbrains.jps.model.java.JpsJavaExtensionService
|
||||||
import org.jetbrains.jps.model.module.JpsModule
|
import org.jetbrains.jps.model.module.JpsModule
|
||||||
|
import org.jetbrains.jps.model.module.JpsModuleSourceRootType
|
||||||
import org.jetbrains.jps.util.JpsPathUtil
|
import org.jetbrains.jps.util.JpsPathUtil
|
||||||
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
|
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
|
||||||
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
|
||||||
import org.jetbrains.kotlin.compilerRunner.JpsCompilerEnvironment
|
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.FSOperationsHelper
|
||||||
import org.jetbrains.kotlin.jps.build.KotlinSourceFileCollector
|
import org.jetbrains.kotlin.jps.build.KotlinSourceFileCollector
|
||||||
import org.jetbrains.kotlin.jps.model.kotlinFacet
|
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.
|
* Properties and actions for Kotlin test / production module build target.
|
||||||
*/
|
*/
|
||||||
abstract class KotlinModuleBuilderTarget(val context: CompileContext, val jpsModuleBuildTarget: ModuleBuildTarget) {
|
abstract class KotlinModuleBuilderTarget(val context: CompileContext, val jpsModuleBuildTarget: ModuleBuildTarget) {
|
||||||
|
val sourceRootTypes: Collection<JpsModuleSourceRootType<*>>
|
||||||
|
get() = if (isTests) {
|
||||||
|
listOf(JavaSourceRootType.TEST_SOURCE, KotlinSourceRootType.TestSource)
|
||||||
|
} else {
|
||||||
|
listOf(JavaSourceRootType.SOURCE, KotlinSourceRootType.Source)
|
||||||
|
}
|
||||||
|
|
||||||
val module: JpsModule
|
val module: JpsModule
|
||||||
get() = jpsModuleBuildTarget.module
|
get() = jpsModuleBuildTarget.module
|
||||||
|
|
||||||
@@ -116,16 +125,18 @@ abstract class KotlinModuleBuilderTarget(val context: CompileContext, val jpsMod
|
|||||||
.getOrCreateCompilerConfiguration(module.project)
|
.getOrCreateCompilerConfiguration(module.project)
|
||||||
.compilerExcludes
|
.compilerExcludes
|
||||||
|
|
||||||
val sourceRootType = if (isTests) JavaSourceRootType.TEST_SOURCE else JavaSourceRootType.SOURCE
|
module
|
||||||
module.getSourceRoots(sourceRootType).forEach {
|
.sourceRoots
|
||||||
it.file.walkTopDown()
|
.filter { it.rootType in sourceRootTypes }
|
||||||
.onEnter { it !in moduleExcludes }
|
.forEach {
|
||||||
.filterTo(receiver) {
|
it.file.walkTopDown()
|
||||||
!compilerExcludes.isExcluded(it) &&
|
.onEnter { it !in moduleExcludes }
|
||||||
it.isFile &&
|
.filterTo(receiver) {
|
||||||
KotlinSourceFileCollector.isKotlinSourceFile(it)
|
!compilerExcludes.isExcluded(it) &&
|
||||||
}
|
it.isFile &&
|
||||||
}
|
KotlinSourceFileCollector.isKotlinSourceFile(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun toString() = jpsModuleBuildTarget.toString()
|
override fun toString() = jpsModuleBuildTarget.toString()
|
||||||
|
|||||||
Reference in New Issue
Block a user