Configuration: Introduce special source roots for non-JVM Kotlin modules

#KT-5948 Fixed
 #KT-23672 Fixed
This commit is contained in:
Alexey Sedunov
2018-04-04 12:35:41 +03:00
parent 1fb1431257
commit 9fa26c83b6
37 changed files with 772 additions and 42 deletions
+1
View File
@@ -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 {
@@ -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("")
}
@@ -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")
}
}
}