Share defaultSourceFolder logic between syncKotlinAndAndroidSourceSets.kt and KotlinSourceSetFactory.kt

This commit is contained in:
sebastian.sellmair
2020-11-24 09:45:34 +01:00
committed by Sebastian Sellmair
parent 7c7eada452
commit 2286498d8d
3 changed files with 34 additions and 37 deletions
@@ -47,9 +47,7 @@ import org.jetbrains.kotlin.statistics.metrics.StringMetrics
import javax.inject.Inject import javax.inject.Inject
import kotlin.reflect.KClass import kotlin.reflect.KClass
abstract class KotlinBasePluginWrapper( abstract class KotlinBasePluginWrapper : Plugin<Project> {
protected val fileResolver: FileResolver
) : Plugin<Project> {
private val log = Logging.getLogger(this.javaClass) private val log = Logging.getLogger(this.javaClass)
val kotlinPluginVersion = loadKotlinVersionFromResource(log) val kotlinPluginVersion = loadKotlinVersionFromResource(log)
@@ -57,7 +55,7 @@ abstract class KotlinBasePluginWrapper(
open val projectExtensionClass: KClass<out KotlinProjectExtension> get() = KotlinProjectExtension::class open val projectExtensionClass: KClass<out KotlinProjectExtension> get() = KotlinProjectExtension::class
internal open fun kotlinSourceSetFactory(project: Project): NamedDomainObjectFactory<KotlinSourceSet> = internal open fun kotlinSourceSetFactory(project: Project): NamedDomainObjectFactory<KotlinSourceSet> =
DefaultKotlinSourceSetFactory(project, fileResolver) DefaultKotlinSourceSetFactory(project)
override fun apply(project: Project) { override fun apply(project: Project) {
val listenerRegistryHolder = BuildEventsListenerRegistryHolder.getInstance(project) val listenerRegistryHolder = BuildEventsListenerRegistryHolder.getInstance(project)
@@ -127,9 +125,8 @@ abstract class KotlinBasePluginWrapper(
} }
open class KotlinPluginWrapper @Inject constructor( open class KotlinPluginWrapper @Inject constructor(
fileResolver: FileResolver,
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper(fileResolver) { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinPlugin(kotlinPluginVersion, registry) KotlinPlugin(kotlinPluginVersion, registry)
@@ -138,9 +135,8 @@ open class KotlinPluginWrapper @Inject constructor(
} }
open class KotlinCommonPluginWrapper @Inject constructor( open class KotlinCommonPluginWrapper @Inject constructor(
fileResolver: FileResolver,
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper(fileResolver) { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinCommonPlugin(kotlinPluginVersion, registry) KotlinCommonPlugin(kotlinPluginVersion, registry)
@@ -149,9 +145,8 @@ open class KotlinCommonPluginWrapper @Inject constructor(
} }
open class KotlinAndroidPluginWrapper @Inject constructor( open class KotlinAndroidPluginWrapper @Inject constructor(
fileResolver: FileResolver,
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper(fileResolver) { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinAndroidPlugin(kotlinPluginVersion, registry) KotlinAndroidPlugin(kotlinPluginVersion, registry)
@@ -160,9 +155,8 @@ open class KotlinAndroidPluginWrapper @Inject constructor(
} }
open class Kotlin2JsPluginWrapper @Inject constructor( open class Kotlin2JsPluginWrapper @Inject constructor(
fileResolver: FileResolver,
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper(fileResolver) { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
Kotlin2JsPlugin(kotlinPluginVersion, registry) Kotlin2JsPlugin(kotlinPluginVersion, registry)
@@ -171,8 +165,7 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
} }
open class KotlinJsPluginWrapper @Inject constructor( open class KotlinJsPluginWrapper @Inject constructor(
fileResolver: FileResolver ) : KotlinBasePluginWrapper() {
) : KotlinBasePluginWrapper(fileResolver) {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinJsPlugin(kotlinPluginVersion) KotlinJsPlugin(kotlinPluginVersion)
@@ -204,9 +197,8 @@ open class KotlinJsPluginWrapper @Inject constructor(
} }
open class KotlinMultiplatformPluginWrapper @Inject constructor( open class KotlinMultiplatformPluginWrapper @Inject constructor(
fileResolver: FileResolver,
private val featurePreviews: FeaturePreviews private val featurePreviews: FeaturePreviews
) : KotlinBasePluginWrapper(fileResolver) { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinMultiplatformPlugin( KotlinMultiplatformPlugin(
kotlinPluginVersion, kotlinPluginVersion,
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.gradle.internal.Kapt3GradleSubplugin
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.AbstractAndroidProjectHandler.Companion.kotlinSourceSetNameForAndroidSourceSet import org.jetbrains.kotlin.gradle.plugin.AbstractAndroidProjectHandler.Companion.kotlinSourceSetNameForAndroidSourceSet
import org.jetbrains.kotlin.gradle.plugin.addConvention import org.jetbrains.kotlin.gradle.plugin.addConvention
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory
import org.jetbrains.kotlin.gradle.plugin.sources.KotlinSourceSetFactory.Companion.defaultSourceFolder
import java.io.File import java.io.File
internal fun syncKotlinAndAndroidSourceSets(target: KotlinAndroidTarget) { internal fun syncKotlinAndAndroidSourceSets(target: KotlinAndroidTarget) {
@@ -107,39 +109,36 @@ private fun syncKotlinAndAndroidResources(
androidSourceSet.resources.srcDirs(*kotlinSourceSet.resources.toList().toTypedArray()) androidSourceSet.resources.srcDirs(*kotlinSourceSet.resources.toList().toTypedArray())
if (androidSourceSet.resources.srcDirs.isNotEmpty()) { if (androidSourceSet.resources.srcDirs.isNotEmpty()) {
androidSourceSet.resources.srcDir(kotlinSourceSet.sourceFolderFor(project, "resources")) androidSourceSet.resources.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "resources"))
kotlinSourceSet.resources.srcDirs(androidSourceSet.resources.srcDirs) kotlinSourceSet.resources.srcDirs(androidSourceSet.resources.srcDirs)
} }
if (androidSourceSet.assets.srcDirs.isNotEmpty()) { if (androidSourceSet.assets.srcDirs.isNotEmpty()) {
androidSourceSet.assets.srcDir(kotlinSourceSet.sourceFolderFor(project, "assets")) androidSourceSet.assets.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "assets"))
} }
if (androidSourceSet.res.srcDirs.isNotEmpty()) { if (androidSourceSet.res.srcDirs.isNotEmpty()) {
androidSourceSet.res.srcDir(kotlinSourceSet.sourceFolderFor(project, "res")) androidSourceSet.res.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "res"))
} }
if (androidSourceSet.aidl.srcDirs.isNotEmpty()) { if (androidSourceSet.aidl.srcDirs.isNotEmpty()) {
androidSourceSet.aidl.srcDir(kotlinSourceSet.sourceFolderFor(project, "aidl")) androidSourceSet.aidl.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "aidl"))
} }
if (androidSourceSet.renderscript.srcDirs.isNotEmpty()) { if (androidSourceSet.renderscript.srcDirs.isNotEmpty()) {
androidSourceSet.renderscript.srcDir(kotlinSourceSet.sourceFolderFor(project, "rs")) androidSourceSet.renderscript.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "rs"))
} }
if (androidSourceSet.jni.srcDirs.isNotEmpty()) { if (androidSourceSet.jni.srcDirs.isNotEmpty()) {
androidSourceSet.jni.srcDir(kotlinSourceSet.sourceFolderFor(project, "jni")) androidSourceSet.jni.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "jni"))
} }
if (androidSourceSet.jniLibs.srcDirs.isNotEmpty()) { if (androidSourceSet.jniLibs.srcDirs.isNotEmpty()) {
androidSourceSet.jniLibs.srcDir(kotlinSourceSet.sourceFolderFor(project, "jniLibs")) androidSourceSet.jniLibs.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "jniLibs"))
} }
if (androidSourceSet.shaders.srcDirs.isNotEmpty()) { if (androidSourceSet.shaders.srcDirs.isNotEmpty()) {
androidSourceSet.shaders.srcDir(kotlinSourceSet.sourceFolderFor(project, "shaders")) androidSourceSet.shaders.srcDir(defaultSourceFolder(project, kotlinSourceSet.name, "shaders"))
} }
} }
private fun KotlinSourceSet.sourceFolderFor(project: Project, type: String): File {
return project.file("src/${this.name}/$type")
}
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnab
import java.io.File import java.io.File
internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal constructor( internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal constructor(
protected val fileResolver: FileResolver,
protected val project: Project protected val project: Project
) : NamedDomainObjectFactory<KotlinSourceSet> { ) : NamedDomainObjectFactory<KotlinSourceSet> {
@@ -29,11 +28,8 @@ internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal con
return result return result
} }
protected open fun defaultSourceLocation(sourceSetName: String): File =
project.file("src/$sourceSetName")
protected open fun setUpSourceSetDefaults(sourceSet: T) { protected open fun setUpSourceSetDefaults(sourceSet: T) {
sourceSet.kotlin.srcDir(File(defaultSourceLocation(sourceSet.name), "kotlin")) sourceSet.kotlin.srcDir(defaultSourceFolder(project, sourceSet.name, "kotlin"))
defineSourceSetConfigurations(project, sourceSet) defineSourceSetConfigurations(project, sourceSet)
} }
@@ -49,19 +45,29 @@ internal abstract class KotlinSourceSetFactory<T : KotlinSourceSet> internal con
} }
protected abstract fun doCreateSourceSet(name: String): T protected abstract fun doCreateSourceSet(name: String): T
companion object {
/**
* @return default location of source folders for a kotlin source set
* e.g. src/jvmMain/kotlin (sourceSetName="jvmMain", type="kotlin")
*/
fun defaultSourceFolder(project: Project, sourceSetName: String, type: String): File {
return project.file("src/$sourceSetName/$type")
}
}
} }
internal class DefaultKotlinSourceSetFactory( internal class DefaultKotlinSourceSetFactory(
project: Project, project: Project
fileResolver: FileResolver ) : KotlinSourceSetFactory<DefaultKotlinSourceSet>(project) {
) : KotlinSourceSetFactory<DefaultKotlinSourceSet>(fileResolver, project) {
override val itemClass: Class<DefaultKotlinSourceSet> override val itemClass: Class<DefaultKotlinSourceSet>
get() = DefaultKotlinSourceSet::class.java get() = DefaultKotlinSourceSet::class.java
override fun setUpSourceSetDefaults(sourceSet: DefaultKotlinSourceSet) { override fun setUpSourceSetDefaults(sourceSet: DefaultKotlinSourceSet) {
super.setUpSourceSetDefaults(sourceSet) super.setUpSourceSetDefaults(sourceSet)
sourceSet.resources.srcDir(File(defaultSourceLocation(sourceSet.name), "resources")) sourceSet.resources.srcDir(defaultSourceFolder(project, sourceSet.name, "resources"))
val dependencyConfigurationWithMetadata = with(sourceSet) { val dependencyConfigurationWithMetadata = with(sourceSet) {
listOf( listOf(