Get rid of kotlinPluginVersion in the constructors throughout the plugin

We passed the kotlinPluginVersion which was only used for a single
purpose in countless constructors.

In fact, the plugin version is easy to load at the call site, as it gets
loaded from the plugin's resources.

So rework the plugin version loading code so that it doesn't rely on the
applied plugin, and don't pass the plugin version in all those
constructors.
This commit is contained in:
Sergey Igushkin
2021-03-31 13:06:31 +03:00
parent 2a5d511b66
commit 4cb6303fa8
21 changed files with 124 additions and 177 deletions
@@ -180,8 +180,7 @@ internal abstract class KotlinSourceSetProcessor<T : AbstractKotlinCompile<*>>(
internal class Kotlin2JvmSourceSetProcessor( internal class Kotlin2JvmSourceSetProcessor(
tasksProvider: KotlinTasksProvider, tasksProvider: KotlinTasksProvider,
kotlinCompilation: KotlinCompilationData<*>, kotlinCompilation: KotlinCompilationData<*>
private val kotlinPluginVersion: String
) : KotlinSourceSetProcessor<KotlinCompile>( ) : KotlinSourceSetProcessor<KotlinCompile>(
tasksProvider, "Compiles the $kotlinCompilation.", kotlinCompilation tasksProvider, "Compiles the $kotlinCompilation.", kotlinCompilation
) { ) {
@@ -200,7 +199,7 @@ internal class Kotlin2JvmSourceSetProcessor(
ScriptingGradleSubplugin.configureForSourceSet(project, kotlinCompilation.compilationPurpose) ScriptingGradleSubplugin.configureForSourceSet(project, kotlinCompilation.compilationPurpose)
project.whenEvaluated { project.whenEvaluated {
val subpluginEnvironment = SubpluginEnvironment.loadSubplugins(project, kotlinPluginVersion) val subpluginEnvironment = SubpluginEnvironment.loadSubplugins(project)
if (kotlinCompilation is KotlinCompilation<*>) // FIXME support compiler plugins with PM20 if (kotlinCompilation is KotlinCompilation<*>) // FIXME support compiler plugins with PM20
subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation) subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation)
@@ -233,8 +232,7 @@ internal fun KotlinCompilationOutput.addClassesDir(classesDirProvider: () -> Fil
internal class Kotlin2JsSourceSetProcessor( internal class Kotlin2JsSourceSetProcessor(
tasksProvider: KotlinTasksProvider, tasksProvider: KotlinTasksProvider,
kotlinCompilation: KotlinCompilationData<*>, kotlinCompilation: KotlinCompilationData<*>
private val kotlinPluginVersion: String
) : KotlinSourceSetProcessor<Kotlin2JsCompile>( ) : KotlinSourceSetProcessor<Kotlin2JsCompile>(
tasksProvider, tasksProvider,
taskDescription = "Compiles the Kotlin sources in $kotlinCompilation to JavaScript.", taskDescription = "Compiles the Kotlin sources in $kotlinCompilation to JavaScript.",
@@ -290,7 +288,7 @@ internal class Kotlin2JsSourceSetProcessor(
} }
} }
val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project, kotlinPluginVersion) val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project)
if (kotlinCompilation is KotlinCompilation<*>) { // FIXME support compiler plugins with PM20 if (kotlinCompilation is KotlinCompilation<*>) { // FIXME support compiler plugins with PM20
subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation) subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation)
} }
@@ -300,8 +298,7 @@ internal class Kotlin2JsSourceSetProcessor(
internal class KotlinJsIrSourceSetProcessor( internal class KotlinJsIrSourceSetProcessor(
tasksProvider: KotlinTasksProvider, tasksProvider: KotlinTasksProvider,
kotlinCompilation: AbstractKotlinCompilation<*>, kotlinCompilation: AbstractKotlinCompilation<*>
private val kotlinPluginVersion: String
) : KotlinSourceSetProcessor<Kotlin2JsCompile>( ) : KotlinSourceSetProcessor<Kotlin2JsCompile>(
tasksProvider, taskDescription = "Compiles the Kotlin sources in $kotlinCompilation to JavaScript.", tasksProvider, taskDescription = "Compiles the Kotlin sources in $kotlinCompilation to JavaScript.",
kotlinCompilation = kotlinCompilation kotlinCompilation = kotlinCompilation
@@ -350,7 +347,7 @@ internal class KotlinJsIrSourceSetProcessor(
} }
project.whenEvaluated { project.whenEvaluated {
val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project, kotlinPluginVersion) val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project)
subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation) subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation)
} }
} }
@@ -358,8 +355,7 @@ internal class KotlinJsIrSourceSetProcessor(
internal class KotlinCommonSourceSetProcessor( internal class KotlinCommonSourceSetProcessor(
compilation: KotlinCompilationData<*>, compilation: KotlinCompilationData<*>,
tasksProvider: KotlinTasksProvider, tasksProvider: KotlinTasksProvider
private val kotlinPluginVersion: String
) : KotlinSourceSetProcessor<KotlinCompileCommon>( ) : KotlinSourceSetProcessor<KotlinCompileCommon>(
tasksProvider, taskDescription = "Compiles the kotlin sources in $compilation to Metadata.", kotlinCompilation = compilation tasksProvider, taskDescription = "Compiles the kotlin sources in $compilation to Metadata.", kotlinCompilation = compilation
) { ) {
@@ -372,7 +368,7 @@ internal class KotlinCommonSourceSetProcessor(
if (kotlinCompilation is AbstractKotlinCompilation<*>) { if (kotlinCompilation is AbstractKotlinCompilation<*>) {
project.whenEvaluated { project.whenEvaluated {
val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project, kotlinPluginVersion) val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project)
subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation) subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation)
} }
} }
@@ -389,24 +385,23 @@ internal class KotlinCommonSourceSetProcessor(
internal abstract class AbstractKotlinPlugin( internal abstract class AbstractKotlinPlugin(
val tasksProvider: KotlinTasksProvider, val tasksProvider: KotlinTasksProvider,
protected val kotlinPluginVersion: String,
val registry: ToolingModelBuilderRegistry val registry: ToolingModelBuilderRegistry
) : Plugin<Project> { ) : Plugin<Project> {
internal abstract fun buildSourceSetProcessor( internal abstract fun buildSourceSetProcessor(
project: Project, project: Project,
compilation: AbstractKotlinCompilation<*>, compilation: AbstractKotlinCompilation<*>
kotlinPluginVersion: String
): KotlinSourceSetProcessor<*> ): KotlinSourceSetProcessor<*>
override fun apply(project: Project) { override fun apply(project: Project) {
val kotlinPluginVersion = project.getKotlinPluginVersion()
project.plugins.apply(JavaPlugin::class.java) project.plugins.apply(JavaPlugin::class.java)
val target = (project.kotlinExtension as KotlinSingleJavaTargetExtension).target val target = (project.kotlinExtension as KotlinSingleJavaTargetExtension).target
configureTarget( configureTarget(
target, target,
{ compilation -> buildSourceSetProcessor(project, compilation, kotlinPluginVersion) } { compilation -> buildSourceSetProcessor(project, compilation) }
) )
applyUserDefinedAttributes(target) applyUserDefinedAttributes(target)
@@ -601,16 +596,15 @@ internal abstract class AbstractKotlinPlugin(
} }
internal open class KotlinPlugin( internal open class KotlinPlugin(
kotlinPluginVersion: String,
registry: ToolingModelBuilderRegistry registry: ToolingModelBuilderRegistry
) : AbstractKotlinPlugin(KotlinTasksProvider(), kotlinPluginVersion, registry) { ) : AbstractKotlinPlugin(KotlinTasksProvider(), registry) {
companion object { companion object {
private const val targetName = "" // use empty suffix for the task names private const val targetName = "" // use empty suffix for the task names
} }
override fun buildSourceSetProcessor(project: Project, compilation: AbstractKotlinCompilation<*>, kotlinPluginVersion: String) = override fun buildSourceSetProcessor(project: Project, compilation: AbstractKotlinCompilation<*>) =
Kotlin2JvmSourceSetProcessor(tasksProvider, compilation, kotlinPluginVersion) Kotlin2JvmSourceSetProcessor(tasksProvider, compilation)
override fun apply(project: Project) { override fun apply(project: Project) {
val target = val target =
@@ -632,9 +626,8 @@ internal open class KotlinPlugin(
} }
internal open class KotlinCommonPlugin( internal open class KotlinCommonPlugin(
kotlinPluginVersion: String,
registry: ToolingModelBuilderRegistry registry: ToolingModelBuilderRegistry
) : AbstractKotlinPlugin(KotlinTasksProvider(), kotlinPluginVersion, registry) { ) : AbstractKotlinPlugin(KotlinTasksProvider(), registry) {
companion object { companion object {
private const val targetName = "common" private const val targetName = "common"
@@ -642,10 +635,9 @@ internal open class KotlinCommonPlugin(
override fun buildSourceSetProcessor( override fun buildSourceSetProcessor(
project: Project, project: Project,
compilation: AbstractKotlinCompilation<*>, compilation: AbstractKotlinCompilation<*>
kotlinPluginVersion: String
): KotlinSourceSetProcessor<*> = ): KotlinSourceSetProcessor<*> =
KotlinCommonSourceSetProcessor(compilation, tasksProvider, kotlinPluginVersion) KotlinCommonSourceSetProcessor(compilation, tasksProvider)
override fun apply(project: Project) { override fun apply(project: Project) {
val target = KotlinWithJavaTarget<KotlinMultiplatformCommonOptions>( val target = KotlinWithJavaTarget<KotlinMultiplatformCommonOptions>(
@@ -661,9 +653,8 @@ internal open class KotlinCommonPlugin(
} }
internal open class Kotlin2JsPlugin( internal open class Kotlin2JsPlugin(
kotlinPluginVersion: String,
registry: ToolingModelBuilderRegistry registry: ToolingModelBuilderRegistry
) : AbstractKotlinPlugin(KotlinTasksProvider(), kotlinPluginVersion, registry) { ) : AbstractKotlinPlugin(KotlinTasksProvider(), registry) {
companion object { companion object {
private const val targetName = "2Js" private const val targetName = "2Js"
@@ -672,12 +663,9 @@ internal open class Kotlin2JsPlugin(
override fun buildSourceSetProcessor( override fun buildSourceSetProcessor(
project: Project, project: Project,
compilation: AbstractKotlinCompilation<*>, compilation: AbstractKotlinCompilation<*>
kotlinPluginVersion: String
): KotlinSourceSetProcessor<*> = ): KotlinSourceSetProcessor<*> =
Kotlin2JsSourceSetProcessor( Kotlin2JsSourceSetProcessor(tasksProvider, compilation)
tasksProvider, compilation, kotlinPluginVersion
)
override fun apply(project: Project) { override fun apply(project: Project) {
if (!PropertiesProvider(project).noWarn2JsPlugin) { if (!PropertiesProvider(project).noWarn2JsPlugin) {
@@ -691,7 +679,6 @@ internal open class Kotlin2JsPlugin(
} }
internal open class KotlinAndroidPlugin( internal open class KotlinAndroidPlugin(
private val kotlinPluginVersion: String,
private val registry: ToolingModelBuilderRegistry private val registry: ToolingModelBuilderRegistry
) : Plugin<Project> { ) : Plugin<Project> {
@@ -701,20 +688,19 @@ internal open class KotlinAndroidPlugin(
val androidTarget = KotlinAndroidTarget("", project) val androidTarget = KotlinAndroidTarget("", project)
(project.kotlinExtension as KotlinAndroidProjectExtension).target = androidTarget (project.kotlinExtension as KotlinAndroidProjectExtension).target = androidTarget
applyToTarget(kotlinPluginVersion, androidTarget) applyToTarget(androidTarget)
applyUserDefinedAttributes(androidTarget) applyUserDefinedAttributes(androidTarget)
customizeKotlinDependencies(project) customizeKotlinDependencies(project)
registry.register(KotlinModelBuilder(kotlinPluginVersion, androidTarget)) registry.register(KotlinModelBuilder(project.getKotlinPluginVersion(), androidTarget))
project.whenEvaluated { project.components.addAll(androidTarget.components) } project.whenEvaluated { project.components.addAll(androidTarget.components) }
} }
companion object { companion object {
fun androidTargetHandler( fun androidTargetHandler(
kotlinPluginVersion: String,
androidTarget: KotlinAndroidTarget androidTarget: KotlinAndroidTarget
): AbstractAndroidProjectHandler { ): AbstractAndroidProjectHandler {
val tasksProvider = AndroidTasksProvider() val tasksProvider = AndroidTasksProvider()
@@ -727,25 +713,22 @@ internal open class KotlinAndroidPlugin(
} }
val kotlinTools = KotlinConfigurationTools( val kotlinTools = KotlinConfigurationTools(
tasksProvider, tasksProvider
kotlinPluginVersion
) )
return Android25ProjectHandler(kotlinTools) return Android25ProjectHandler(kotlinTools)
} }
fun applyToTarget( fun applyToTarget(
kotlinPluginVersion: String,
kotlinTarget: KotlinAndroidTarget kotlinTarget: KotlinAndroidTarget
) { ) {
androidTargetHandler(kotlinPluginVersion, kotlinTarget).configureTarget(kotlinTarget) androidTargetHandler(kotlinTarget).configureTarget(kotlinTarget)
} }
} }
} }
class KotlinConfigurationTools internal constructor( class KotlinConfigurationTools internal constructor(
val kotlinTasksProvider: KotlinTasksProvider, val kotlinTasksProvider: KotlinTasksProvider
val kotlinPluginVersion: String
) )
abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTools: KotlinConfigurationTools) { abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTools: KotlinConfigurationTools) {
@@ -827,7 +810,7 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
val compilation = kotlinAndroidTarget.compilations.getByName(getVariantName(variant)) val compilation = kotlinAndroidTarget.compilations.getByName(getVariantName(variant))
postprocessVariant(variant, compilation, project, ext, plugin) postprocessVariant(variant, compilation, project, ext, plugin)
val subpluginEnvironment = SubpluginEnvironment.loadSubplugins(project, kotlinConfigurationTools.kotlinPluginVersion) val subpluginEnvironment = SubpluginEnvironment.loadSubplugins(project)
subpluginEnvironment.addSubpluginOptions(project, compilation) subpluginEnvironment.addSubpluginOptions(project, compilation)
} }
checkAndroidAnnotationProcessorDependencyUsage(project) checkAndroidAnnotationProcessorDependencyUsage(project)
@@ -53,7 +53,6 @@ import kotlin.reflect.KClass
abstract class KotlinBasePluginWrapper : Plugin<Project> { abstract class KotlinBasePluginWrapper : Plugin<Project> {
private val log = Logging.getLogger(this.javaClass) private val log = Logging.getLogger(this.javaClass)
val kotlinPluginVersion = loadKotlinVersionFromResource(log)
open val projectExtensionClass: KClass<out KotlinTopLevelExtension> get() = KotlinProjectExtension::class open val projectExtensionClass: KClass<out KotlinTopLevelExtension> get() = KotlinProjectExtension::class
@@ -61,6 +60,8 @@ abstract class KotlinBasePluginWrapper : Plugin<Project> {
DefaultKotlinSourceSetFactory(project) DefaultKotlinSourceSetFactory(project)
override fun apply(project: Project) { override fun apply(project: Project) {
val kotlinPluginVersion = project.getKotlinPluginVersion()
val listenerRegistryHolder = BuildEventsListenerRegistryHolder.getInstance(project) val listenerRegistryHolder = BuildEventsListenerRegistryHolder.getInstance(project)
val statisticsReporter = KotlinBuildStatsService.getOrCreateInstance(project, listenerRegistryHolder) val statisticsReporter = KotlinBuildStatsService.getOrCreateInstance(project, listenerRegistryHolder)
statisticsReporter?.report(StringMetrics.KOTLIN_COMPILER_VERSION, kotlinPluginVersion) statisticsReporter?.report(StringMetrics.KOTLIN_COMPILER_VERSION, kotlinPluginVersion)
@@ -116,7 +117,7 @@ abstract class KotlinBasePluginWrapper : Plugin<Project> {
.maybeCreate(COMPILER_CLASSPATH_CONFIGURATION_NAME) .maybeCreate(COMPILER_CLASSPATH_CONFIGURATION_NAME)
.defaultDependencies { .defaultDependencies {
it.add( it.add(
project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_COMPILER_EMBEDDABLE:$kotlinPluginVersion") project.dependencies.create("$KOTLIN_MODULE_GROUP:$KOTLIN_COMPILER_EMBEDDABLE:${project.getKotlinPluginVersion()}")
) )
} }
project project
@@ -151,7 +152,7 @@ open class KotlinPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper() { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinPlugin(kotlinPluginVersion, registry) KotlinPlugin(registry)
override val projectExtensionClass: KClass<out KotlinJvmProjectExtension> override val projectExtensionClass: KClass<out KotlinJvmProjectExtension>
get() = KotlinJvmProjectExtension::class get() = KotlinJvmProjectExtension::class
@@ -161,7 +162,7 @@ open class KotlinCommonPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper() { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinCommonPlugin(kotlinPluginVersion, registry) KotlinCommonPlugin(registry)
override val projectExtensionClass: KClass<out KotlinCommonProjectExtension> override val projectExtensionClass: KClass<out KotlinCommonProjectExtension>
get() = KotlinCommonProjectExtension::class get() = KotlinCommonProjectExtension::class
@@ -171,7 +172,7 @@ open class KotlinAndroidPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper() { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinAndroidPlugin(kotlinPluginVersion, registry) KotlinAndroidPlugin(registry)
override val projectExtensionClass: KClass<out KotlinAndroidProjectExtension> override val projectExtensionClass: KClass<out KotlinAndroidProjectExtension>
get() = KotlinAndroidProjectExtension::class get() = KotlinAndroidProjectExtension::class
@@ -181,7 +182,7 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
protected val registry: ToolingModelBuilderRegistry protected val registry: ToolingModelBuilderRegistry
) : KotlinBasePluginWrapper() { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
Kotlin2JsPlugin(kotlinPluginVersion, registry) Kotlin2JsPlugin(registry)
override val projectExtensionClass: KClass<out Kotlin2JsProjectExtension> override val projectExtensionClass: KClass<out Kotlin2JsProjectExtension>
get() = Kotlin2JsProjectExtension::class get() = Kotlin2JsProjectExtension::class
@@ -190,7 +191,7 @@ open class Kotlin2JsPluginWrapper @Inject constructor(
open class KotlinJsPluginWrapper @Inject constructor( open class KotlinJsPluginWrapper @Inject constructor(
) : KotlinBasePluginWrapper() { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinJsPlugin(kotlinPluginVersion) KotlinJsPlugin(project.getKotlinPluginVersion())
override val projectExtensionClass: KClass<out KotlinJsProjectExtension> override val projectExtensionClass: KClass<out KotlinJsProjectExtension>
get() = KotlinJsProjectExtension::class get() = KotlinJsProjectExtension::class
@@ -222,7 +223,7 @@ open class KotlinJsPluginWrapper @Inject constructor(
open class KotlinMultiplatformPluginWrapper @Inject constructor( open class KotlinMultiplatformPluginWrapper @Inject constructor(
) : KotlinBasePluginWrapper() { ) : KotlinBasePluginWrapper() {
override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> = override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin<Project> =
KotlinMultiplatformPlugin(kotlinPluginVersion) KotlinMultiplatformPlugin()
override val projectExtensionClass: KClass<out KotlinMultiplatformExtension> override val projectExtensionClass: KClass<out KotlinMultiplatformExtension>
get() = KotlinMultiplatformExtension::class get() = KotlinMultiplatformExtension::class
@@ -251,12 +252,17 @@ open class KotlinPm20PluginWrapper @Inject constructor(private val objectFactory
get() = KotlinPm20ProjectExtension::class get() = KotlinPm20ProjectExtension::class
} }
fun Project.getKotlinPluginVersion(): String? = fun Project.getKotlinPluginVersion(): String {
plugins.asSequence().mapNotNull { (it as? KotlinBasePluginWrapper)?.kotlinPluginVersion }.firstOrNull() if (!kotlinPluginVersionFromResources.isInitialized()) {
project.logger.kotlinDebug("Loading version information")
fun Plugin<*>.loadKotlinVersionFromResource(log: Logger): String { project.logger.kotlinDebug("Found project version [${kotlinPluginVersionFromResources.value}")
log.kotlinDebug("Loading version information") }
val projectVersion = loadPropertyFromResources("project.properties", "project.version") return kotlinPluginVersionFromResources.value
log.kotlinDebug("Found project version [$projectVersion]")
return projectVersion
} }
private fun loadKotlinPluginVersionFromResourcesOf(any: Any) =
any.loadPropertyFromResources("project.properties", "project.version")
private val kotlinPluginVersionFromResources = lazy {
loadKotlinPluginVersionFromResourcesOf(object {})
}
@@ -370,8 +370,7 @@ internal val KotlinTarget.testTaskName: String
abstract class KotlinOnlyTargetConfigurator<KotlinCompilationType : KotlinCompilation<*>, KotlinTargetType : KotlinOnlyTarget<KotlinCompilationType>>( abstract class KotlinOnlyTargetConfigurator<KotlinCompilationType : KotlinCompilation<*>, KotlinTargetType : KotlinOnlyTarget<KotlinCompilationType>>(
createDefaultSourceSets: Boolean, createDefaultSourceSets: Boolean,
createTestCompilation: Boolean, createTestCompilation: Boolean
val kotlinPluginVersion: String
) : AbstractKotlinTargetConfigurator<KotlinTargetType>( ) : AbstractKotlinTargetConfigurator<KotlinTargetType>(
createDefaultSourceSets, createDefaultSourceSets,
createTestCompilation createTestCompilation
@@ -20,8 +20,9 @@ class SubpluginEnvironment(
private val kotlinPluginVersion: String private val kotlinPluginVersion: String
) { ) {
companion object { companion object {
fun loadSubplugins(project: Project, kotlinPluginVersion: String): SubpluginEnvironment = fun loadSubplugins(project: Project): SubpluginEnvironment {
try { val kotlinPluginVersion = project.getKotlinPluginVersion()
return try {
@Suppress("DEPRECATION") // support for the deprecated plugin API @Suppress("DEPRECATION") // support for the deprecated plugin API
val klass = KotlinGradleSubplugin::class.java val klass = KotlinGradleSubplugin::class.java
val buildscriptClassloader = project.buildscript.classLoader val buildscriptClassloader = project.buildscript.classLoader
@@ -51,6 +52,7 @@ class SubpluginEnvironment(
project.logger.error("Could not load subplugins", e) project.logger.error("Could not load subplugins", e)
SubpluginEnvironment(listOf(), kotlinPluginVersion) SubpluginEnvironment(listOf(), kotlinPluginVersion)
} }
}
} }
fun addSubpluginOptions( fun addSubpluginOptions(
@@ -136,7 +138,6 @@ internal class LegacyKotlinCompilerPluginSupportPlugin(
val androidProjectHandlerOrNull: AbstractAndroidProjectHandler? = if (kotlinCompilation is KotlinJvmAndroidCompilation) val androidProjectHandlerOrNull: AbstractAndroidProjectHandler? = if (kotlinCompilation is KotlinJvmAndroidCompilation)
KotlinAndroidPlugin.androidTargetHandler( KotlinAndroidPlugin.androidTargetHandler(
checkNotNull(project.getKotlinPluginVersion()),
kotlinCompilation.target as KotlinAndroidTarget kotlinCompilation.target as KotlinAndroidTarget
) else null ) else null
@@ -44,9 +44,7 @@ import org.jetbrains.kotlin.konan.target.KonanTarget.*
import org.jetbrains.kotlin.konan.target.presetName import org.jetbrains.kotlin.konan.target.presetName
import org.jetbrains.kotlin.statistics.metrics.StringMetrics import org.jetbrains.kotlin.statistics.metrics.StringMetrics
class KotlinMultiplatformPlugin( class KotlinMultiplatformPlugin : Plugin<Project> {
private val kotlinPluginVersion: String
) : Plugin<Project> {
private class TargetFromPresetExtension(val targetsContainer: KotlinTargetsContainerWithPresets) { private class TargetFromPresetExtension(val targetsContainer: KotlinTargetsContainerWithPresets) {
fun <T : KotlinTarget> fromPreset(preset: KotlinTargetPreset<T>, name: String, configureClosure: Closure<*>): T = fun <T : KotlinTarget> fromPreset(preset: KotlinTargetPreset<T>, name: String, configureClosure: Closure<*>): T =
@@ -93,7 +91,7 @@ class KotlinMultiplatformPlugin(
// set up metadata publishing // set up metadata publishing
targetsFromPreset.fromPreset( targetsFromPreset.fromPreset(
KotlinMetadataTargetPreset(project, kotlinPluginVersion), KotlinMetadataTargetPreset(project),
METADATA_TARGET_NAME METADATA_TARGET_NAME
) )
configurePublishingWithMavenPublish(project) configurePublishingWithMavenPublish(project)
@@ -176,20 +174,17 @@ class KotlinMultiplatformPlugin(
fun setupDefaultPresets(project: Project) { fun setupDefaultPresets(project: Project) {
with(project.multiplatformExtension.presets) { with(project.multiplatformExtension.presets) {
add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmTargetPreset(project))
add(KotlinJsTargetPreset(project, kotlinPluginVersion).apply { irPreset = null }) add(KotlinJsTargetPreset(project).apply { irPreset = null })
add(KotlinJsIrTargetPreset(project, kotlinPluginVersion).apply { mixedMode = false }) add(KotlinJsIrTargetPreset(project).apply { mixedMode = false })
add( add(
KotlinJsTargetPreset( KotlinJsTargetPreset(project).apply {
project, irPreset = KotlinJsIrTargetPreset(project)
kotlinPluginVersion
).apply {
irPreset = KotlinJsIrTargetPreset(project, kotlinPluginVersion)
.apply { mixedMode = true } .apply { mixedMode = true }
} }
) )
add(KotlinAndroidTargetPreset(project, kotlinPluginVersion)) add(KotlinAndroidTargetPreset(project))
add(KotlinJvmWithJavaTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmWithJavaTargetPreset(project))
// Note: modifying these sets should also be reflected in the DSL code generator, see 'presetEntries.kt' // Note: modifying these sets should also be reflected in the DSL code generator, see 'presetEntries.kt'
val nativeTargetsWithHostTests = setOf(LINUX_X64, MACOS_X64, MINGW_X64) val nativeTargetsWithHostTests = setOf(LINUX_X64, MACOS_X64, MINGW_X64)
@@ -199,10 +194,10 @@ class KotlinMultiplatformPlugin(
.forEach { (_, konanTarget) -> .forEach { (_, konanTarget) ->
val targetToAdd = when (konanTarget) { val targetToAdd = when (konanTarget) {
in nativeTargetsWithHostTests -> in nativeTargetsWithHostTests ->
KotlinNativeTargetWithHostTestsPreset(konanTarget.presetName, project, konanTarget, kotlinPluginVersion) KotlinNativeTargetWithHostTestsPreset(konanTarget.presetName, project, konanTarget)
in nativeTargetsWithSimulatorTests -> in nativeTargetsWithSimulatorTests ->
KotlinNativeTargetWithSimulatorTestsPreset(konanTarget.presetName, project, konanTarget, kotlinPluginVersion) KotlinNativeTargetWithSimulatorTestsPreset(konanTarget.presetName, project, konanTarget)
else -> KotlinNativeTargetPreset(konanTarget.presetName, project, konanTarget, kotlinPluginVersion) else -> KotlinNativeTargetPreset(konanTarget.presetName, project, konanTarget)
} }
add(targetToAdd) add(targetToAdd)
@@ -12,8 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset
abstract class KotlinOnlyTargetPreset<R : KotlinOnlyTarget<T>, T : KotlinCompilation<*>>( abstract class KotlinOnlyTargetPreset<R : KotlinOnlyTarget<T>, T : KotlinCompilation<*>>(
protected val project: Project, protected val project: Project
protected val kotlinPluginVersion: String
) : KotlinTargetPreset<R> { ) : KotlinTargetPreset<R> {
protected abstract fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<T, R> protected abstract fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<T, R>
@@ -72,7 +72,7 @@ open class KotlinAndroidTarget(
} }
val variantNames = val variantNames =
KotlinAndroidPlugin.androidTargetHandler(project.getKotlinPluginVersion()!!, this) KotlinAndroidPlugin.androidTargetHandler(this)
.getLibraryVariantNames() .getLibraryVariantNames()
val missingVariants = val missingVariants =
@@ -90,7 +90,7 @@ open class KotlinAndroidTarget(
override val kotlinComponents by lazy { override val kotlinComponents by lazy {
checkPublishLibraryVariantsExist() checkPublishLibraryVariantsExist()
KotlinAndroidPlugin.androidTargetHandler(project.getKotlinPluginVersion()!!, this).doCreateComponents() KotlinAndroidPlugin.androidTargetHandler(this).doCreateComponents()
} }
private fun isVariantPublished(variant: BaseVariant): Boolean { private fun isVariantPublished(variant: BaseVariant): Boolean {
@@ -11,8 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinAndroidPlugin
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset import org.jetbrains.kotlin.gradle.plugin.KotlinTargetPreset
class KotlinAndroidTargetPreset( class KotlinAndroidTargetPreset(
private val project: Project, private val project: Project
private val kotlinPluginVersion: String
) : KotlinTargetPreset<KotlinAndroidTarget> { ) : KotlinTargetPreset<KotlinAndroidTarget> {
override fun getName(): String = PRESET_NAME override fun getName(): String = PRESET_NAME
@@ -23,7 +22,7 @@ class KotlinAndroidTargetPreset(
preset = this@KotlinAndroidTargetPreset preset = this@KotlinAndroidTargetPreset
} }
KotlinAndroidPlugin.applyToTarget(kotlinPluginVersion, result) KotlinAndroidPlugin.applyToTarget(result)
return result return result
} }
@@ -42,8 +42,8 @@ open class KotlinJsPlugin(
customizeKotlinDependencies(project) customizeKotlinDependencies(project)
kotlinExtension.apply { kotlinExtension.apply {
irPreset = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion) irPreset = KotlinJsIrSingleTargetPreset(project)
legacyPreset = KotlinJsSingleTargetPreset(project, kotlinPluginVersion) legacyPreset = KotlinJsSingleTargetPreset(project)
defaultJsCompilerType = PropertiesProvider(project).jsCompiler defaultJsCompilerType = PropertiesProvider(project).jsCompiler
} }
@@ -20,8 +20,8 @@ import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.testing.testTaskName
import java.util.concurrent.Callable import java.util.concurrent.Callable
open class KotlinJsTargetConfigurator(kotlinPluginVersion: String) : open class KotlinJsTargetConfigurator :
KotlinOnlyTargetConfigurator<KotlinJsCompilation, KotlinJsTarget>(true, true, kotlinPluginVersion), KotlinOnlyTargetConfigurator<KotlinJsCompilation, KotlinJsTarget>(true, true),
KotlinTargetWithTestsConfigurator<KotlinJsReportAggregatingTestRun, KotlinJsTarget> { KotlinTargetWithTestsConfigurator<KotlinJsReportAggregatingTestRun, KotlinJsTarget> {
override val testRunClass: Class<KotlinJsReportAggregatingTestRun> get() = KotlinJsReportAggregatingTestRun::class.java override val testRunClass: Class<KotlinJsReportAggregatingTestRun> get() = KotlinJsReportAggregatingTestRun::class.java
@@ -51,7 +51,7 @@ open class KotlinJsTargetConfigurator(kotlinPluginVersion: String) :
override fun buildCompilationProcessor(compilation: KotlinJsCompilation): KotlinSourceSetProcessor<*> { override fun buildCompilationProcessor(compilation: KotlinJsCompilation): KotlinSourceSetProcessor<*> {
val tasksProvider = KotlinTasksProvider() val tasksProvider = KotlinTasksProvider()
return Kotlin2JsSourceSetProcessor(tasksProvider, compilation, kotlinPluginVersion) return Kotlin2JsSourceSetProcessor(tasksProvider, compilation)
} }
override fun configureCompilationDefaults(target: KotlinJsTarget) { override fun configureCompilationDefaults(target: KotlinJsTarget) {
@@ -18,11 +18,9 @@ import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.statistics.metrics.StringMetrics import org.jetbrains.kotlin.statistics.metrics.StringMetrics
open class KotlinJsTargetPreset( open class KotlinJsTargetPreset(
project: Project, project: Project
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset<KotlinJsTarget, KotlinJsCompilation>( ) : KotlinOnlyTargetPreset<KotlinJsTarget, KotlinJsCompilation>(
project, project
kotlinPluginVersion
) { ) {
var irPreset: KotlinJsIrTargetPreset? = null var irPreset: KotlinJsIrTargetPreset? = null
internal set internal set
@@ -84,9 +82,7 @@ open class KotlinJsTargetPreset(
} }
} }
override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator( override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator()
kotlinPluginVersion
)
override fun getName(): String { override fun getName(): String {
return lowerCamelCaseName( return lowerCamelCaseName(
@@ -105,11 +101,9 @@ open class KotlinJsTargetPreset(
} }
class KotlinJsSingleTargetPreset( class KotlinJsSingleTargetPreset(
project: Project, project: Project
kotlinPluginVersion: String
) : KotlinJsTargetPreset( ) : KotlinJsTargetPreset(
project, project
kotlinPluginVersion
) { ) {
override val isMpp: Boolean override val isMpp: Boolean
get() = false get() = false
@@ -125,7 +119,5 @@ class KotlinJsSingleTargetPreset(
?.decapitalize() ?.decapitalize()
} }
override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator( override fun createKotlinTargetConfigurator() = KotlinJsTargetConfigurator()
kotlinPluginVersion
)
} }
@@ -21,8 +21,8 @@ import org.jetbrains.kotlin.gradle.utils.isParentOf
import org.jetbrains.kotlin.gradle.utils.klibModuleName import org.jetbrains.kotlin.gradle.utils.klibModuleName
import java.io.File import java.io.File
open class KotlinJsIrTargetConfigurator(kotlinPluginVersion: String) : open class KotlinJsIrTargetConfigurator() :
KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget>(true, true, kotlinPluginVersion), KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget>(true, true),
KotlinTargetWithTestsConfigurator<KotlinJsReportAggregatingTestRun, KotlinJsIrTarget> { KotlinTargetWithTestsConfigurator<KotlinJsReportAggregatingTestRun, KotlinJsIrTarget> {
override val testRunClass: Class<KotlinJsReportAggregatingTestRun> get() = KotlinJsReportAggregatingTestRun::class.java override val testRunClass: Class<KotlinJsReportAggregatingTestRun> get() = KotlinJsReportAggregatingTestRun::class.java
@@ -55,7 +55,7 @@ open class KotlinJsIrTargetConfigurator(kotlinPluginVersion: String) :
override fun buildCompilationProcessor(compilation: KotlinJsIrCompilation): KotlinSourceSetProcessor<*> { override fun buildCompilationProcessor(compilation: KotlinJsIrCompilation): KotlinSourceSetProcessor<*> {
val tasksProvider = KotlinTasksProvider() val tasksProvider = KotlinTasksProvider()
return KotlinJsIrSourceSetProcessor(tasksProvider, compilation, kotlinPluginVersion) return KotlinJsIrSourceSetProcessor(tasksProvider, compilation)
} }
override fun createArchiveTasks(target: KotlinJsIrTarget): TaskProvider<out Zip> { override fun createArchiveTasks(target: KotlinJsIrTarget): TaskProvider<out Zip> {
@@ -13,11 +13,9 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinJsIrTargetPreset( open class KotlinJsIrTargetPreset(
project: Project, project: Project
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>( ) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>(
project, project
kotlinPluginVersion
) { ) {
internal var mixedMode: Boolean? = null internal var mixedMode: Boolean? = null
@@ -53,7 +51,7 @@ open class KotlinJsIrTargetPreset(
} }
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> = override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> =
KotlinJsIrTargetConfigurator(kotlinPluginVersion) KotlinJsIrTargetConfigurator()
override fun getName(): String = PRESET_NAME override fun getName(): String = PRESET_NAME
@@ -72,11 +70,9 @@ open class KotlinJsIrTargetPreset(
} }
class KotlinJsIrSingleTargetPreset( class KotlinJsIrSingleTargetPreset(
project: Project, project: Project
kotlinPluginVersion: String
) : KotlinJsIrTargetPreset( ) : KotlinJsIrTargetPreset(
project, project
kotlinPluginVersion
) { ) {
override val isMpp: Boolean override val isMpp: Boolean
get() = false get() = false
@@ -93,5 +89,5 @@ class KotlinJsIrSingleTargetPreset(
} }
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> = override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> =
KotlinJsIrTargetConfigurator(kotlinPluginVersion) KotlinJsIrTargetConfigurator()
} }
@@ -19,8 +19,8 @@ import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.testing.testTaskName import org.jetbrains.kotlin.gradle.testing.testTaskName
class KotlinJvmTargetConfigurator(kotlinPluginVersion: String) : class KotlinJvmTargetConfigurator :
KotlinOnlyTargetConfigurator<KotlinJvmCompilation, KotlinJvmTarget>(true, true, kotlinPluginVersion), KotlinOnlyTargetConfigurator<KotlinJvmCompilation, KotlinJvmTarget>(true, true),
KotlinTargetWithTestsConfigurator<KotlinJvmTestRun, KotlinJvmTarget> { KotlinTargetWithTestsConfigurator<KotlinJvmTestRun, KotlinJvmTarget> {
override fun configurePlatformSpecificModel(target: KotlinJvmTarget) { override fun configurePlatformSpecificModel(target: KotlinJvmTarget) {
@@ -74,6 +74,6 @@ class KotlinJvmTargetConfigurator(kotlinPluginVersion: String) :
override fun buildCompilationProcessor(compilation: KotlinJvmCompilation): KotlinSourceSetProcessor<*> { override fun buildCompilationProcessor(compilation: KotlinJvmCompilation): KotlinSourceSetProcessor<*> {
val tasksProvider = KotlinTasksProvider() val tasksProvider = KotlinTasksProvider()
return Kotlin2JvmSourceSetProcessor(tasksProvider, compilation, kotlinPluginVersion) return Kotlin2JvmSourceSetProcessor(tasksProvider, compilation)
} }
} }
@@ -12,11 +12,9 @@ import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTarget
import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTargetConfigurator import org.jetbrains.kotlin.gradle.targets.jvm.KotlinJvmTargetConfigurator
class KotlinJvmTargetPreset( class KotlinJvmTargetPreset(
project: Project, project: Project
kotlinPluginVersion: String
) : KotlinOnlyTargetPreset<KotlinJvmTarget, KotlinJvmCompilation>( ) : KotlinOnlyTargetPreset<KotlinJvmTarget, KotlinJvmCompilation>(
project, project
kotlinPluginVersion
) { ) {
override fun instantiateTarget(name: String): KotlinJvmTarget { override fun instantiateTarget(name: String): KotlinJvmTarget {
return project.objects.newInstance(KotlinJvmTarget::class.java, project) return project.objects.newInstance(KotlinJvmTarget::class.java, project)
@@ -27,7 +25,7 @@ class KotlinJvmTargetPreset(
override fun createCompilationFactory(forTarget: KotlinJvmTarget): KotlinCompilationFactory<KotlinJvmCompilation> = override fun createCompilationFactory(forTarget: KotlinJvmTarget): KotlinCompilationFactory<KotlinJvmCompilation> =
KotlinJvmCompilationFactory(forTarget) KotlinJvmCompilationFactory(forTarget)
override fun createKotlinTargetConfigurator() = KotlinJvmTargetConfigurator(kotlinPluginVersion) override fun createKotlinTargetConfigurator() = KotlinJvmTargetConfigurator()
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.jvm get() = KotlinPlatformType.jvm
@@ -16,8 +16,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild import org.jetbrains.kotlin.gradle.utils.SingleWarningPerBuild
class KotlinJvmWithJavaTargetPreset( class KotlinJvmWithJavaTargetPreset(
private val project: Project, private val project: Project
private val kotlinPluginVersion: String
) : KotlinTargetPreset<KotlinWithJavaTarget<KotlinJvmOptions>> { ) : KotlinTargetPreset<KotlinWithJavaTarget<KotlinJvmOptions>> {
override fun getName(): String = PRESET_NAME override fun getName(): String = PRESET_NAME
@@ -36,7 +35,7 @@ class KotlinJvmWithJavaTargetPreset(
} }
AbstractKotlinPlugin.configureTarget(target) { compilation -> AbstractKotlinPlugin.configureTarget(target) { compilation ->
Kotlin2JvmSourceSetProcessor(KotlinTasksProvider(), compilation, kotlinPluginVersion) Kotlin2JvmSourceSetProcessor(KotlinTasksProvider(), compilation)
} }
target.compilations.getByName("test").run { target.compilations.getByName("test").run {
@@ -47,11 +47,10 @@ internal val Project.isKotlinGranularMetadataEnabled: Boolean
internal val Project.isCompatibilityMetadataVariantEnabled: Boolean internal val Project.isCompatibilityMetadataVariantEnabled: Boolean
get() = PropertiesProvider(this).enableCompatibilityMetadataVariant == true get() = PropertiesProvider(this).enableCompatibilityMetadataVariant == true
class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) : class KotlinMetadataTargetConfigurator :
KotlinOnlyTargetConfigurator<AbstractKotlinCompilation<*>, KotlinMetadataTarget>( KotlinOnlyTargetConfigurator<AbstractKotlinCompilation<*>, KotlinMetadataTarget>(
createDefaultSourceSets = false, createDefaultSourceSets = false,
createTestCompilation = false, createTestCompilation = false
kotlinPluginVersion = kotlinPluginVersion
) { ) {
companion object { companion object {
internal const val ALL_METADATA_JAR_NAME = "allMetadataJar" internal const val ALL_METADATA_JAR_NAME = "allMetadataJar"
@@ -115,7 +114,7 @@ class KotlinMetadataTargetConfigurator(kotlinPluginVersion: String) :
override fun buildCompilationProcessor(compilation: AbstractKotlinCompilation<*>): KotlinCompilationProcessor<*> = when (compilation) { override fun buildCompilationProcessor(compilation: AbstractKotlinCompilation<*>): KotlinCompilationProcessor<*> = when (compilation) {
is KotlinCommonCompilation -> { is KotlinCommonCompilation -> {
val tasksProvider = KotlinTasksProvider() val tasksProvider = KotlinTasksProvider()
KotlinCommonSourceSetProcessor(compilation, tasksProvider, kotlinPluginVersion) KotlinCommonSourceSetProcessor(compilation, tasksProvider)
} }
is KotlinSharedNativeCompilation -> NativeSharedCompilationProcessor(compilation) is KotlinSharedNativeCompilation -> NativeSharedCompilationProcessor(compilation)
else -> error("unsupported compilation type ${compilation::class.qualifiedName}") else -> error("unsupported compilation type ${compilation::class.qualifiedName}")
@@ -478,13 +477,8 @@ internal class NativeSharedCompilationProcessor(
override val kotlinCompilation: KotlinNativeFragmentMetadataCompilationData override val kotlinCompilation: KotlinNativeFragmentMetadataCompilationData
) : KotlinCompilationProcessor<KotlinNativeCompile>(kotlinCompilation) { ) : KotlinCompilationProcessor<KotlinNativeCompile>(kotlinCompilation) {
private val nativeTargetConfigurator =
KotlinNativeTargetConfigurator<KotlinNativeTarget>(kotlinCompilation.project.getKotlinPluginVersion() ?: "" /*FIXME*/)
override val kotlinTask: TaskProvider<out KotlinNativeCompile> = override val kotlinTask: TaskProvider<out KotlinNativeCompile> =
with(nativeTargetConfigurator) { KotlinNativeTargetConfigurator.createKlibCompilationTask(kotlinCompilation)
KotlinNativeTargetConfigurator.createKlibCompilationTask(kotlinCompilation)
}
override fun run() = Unit override fun run() = Unit
} }
@@ -13,12 +13,8 @@ import org.jetbrains.kotlin.gradle.plugin.sources.applyLanguageSettingsToKotlinO
import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator import org.jetbrains.kotlin.gradle.targets.metadata.KotlinMetadataTargetConfigurator
class KotlinMetadataTargetPreset( class KotlinMetadataTargetPreset(
project: Project, project: Project
kotlinPluginVersion: String ) : KotlinOnlyTargetPreset<KotlinMetadataTarget, AbstractKotlinCompilation<*>>(project) {
) : KotlinOnlyTargetPreset<KotlinMetadataTarget, AbstractKotlinCompilation<*>>(
project,
kotlinPluginVersion
) {
override fun getName(): String = PRESET_NAME override fun getName(): String = PRESET_NAME
override fun createCompilationFactory( override fun createCompilationFactory(
@@ -42,7 +38,7 @@ class KotlinMetadataTargetPreset(
} }
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<AbstractKotlinCompilation<*>, KotlinMetadataTarget> = override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<AbstractKotlinCompilation<*>, KotlinMetadataTarget> =
KotlinMetadataTargetConfigurator(kotlinPluginVersion) KotlinMetadataTargetConfigurator()
override fun instantiateTarget(name: String): KotlinMetadataTarget { override fun instantiateTarget(name: String): KotlinMetadataTarget {
return project.objects.newInstance(KotlinMetadataTarget::class.java, project) return project.objects.newInstance(KotlinMetadataTarget::class.java, project)
@@ -46,9 +46,7 @@ import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File import java.io.File
open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget>( open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotlinTargetConfigurator<T>(
private val kotlinPluginVersion: String
) : AbstractKotlinTargetConfigurator<T>(
createDefaultSourceSets = true, createDefaultSourceSets = true,
createTestCompilation = true createTestCompilation = true
) { ) {
@@ -501,7 +499,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget>(
project.whenEvaluated { project.whenEvaluated {
SubpluginEnvironment SubpluginEnvironment
.loadSubplugins(project, project.getKotlinPluginVersion() ?: "unspecified" /* TODO */) .loadSubplugins(project)
.addSubpluginOptions(project, compilation) .addSubpluginOptions(project, compilation)
compilation.compileKotlinTaskProvider.configure { compilation.compileKotlinTaskProvider.configure {
@@ -573,8 +571,7 @@ abstract class KotlinNativeTargetWithTestsConfigurator<
TargetType : KotlinNativeTargetWithTests<TestRunType>, TargetType : KotlinNativeTargetWithTests<TestRunType>,
TestRunType : KotlinNativeBinaryTestRun, TestRunType : KotlinNativeBinaryTestRun,
TaskType : KotlinNativeTest>( TaskType : KotlinNativeTest>(
kotlinPluginVersion: String ) : KotlinNativeTargetConfigurator<TargetType>(),
) : KotlinNativeTargetConfigurator<TargetType>(kotlinPluginVersion),
KotlinTargetWithTestsConfigurator<TestRunType, TargetType> { KotlinTargetWithTestsConfigurator<TestRunType, TargetType> {
abstract val testTaskClass: Class<TaskType> abstract val testTaskClass: Class<TaskType>
@@ -610,13 +607,11 @@ abstract class KotlinNativeTargetWithTestsConfigurator<
} }
} }
class KotlinNativeTargetWithHostTestsConfigurator(kotlinPluginVersion: String) : class KotlinNativeTargetWithHostTestsConfigurator() :
KotlinNativeTargetWithTestsConfigurator< KotlinNativeTargetWithTestsConfigurator<
KotlinNativeTargetWithHostTests, KotlinNativeTargetWithHostTests,
KotlinNativeHostTestRun, KotlinNativeHostTestRun,
KotlinNativeHostTest>( KotlinNativeHostTest>() {
kotlinPluginVersion
) {
override val testTaskClass: Class<KotlinNativeHostTest> override val testTaskClass: Class<KotlinNativeHostTest>
get() = KotlinNativeHostTest::class.java get() = KotlinNativeHostTest::class.java
@@ -634,13 +629,11 @@ class KotlinNativeTargetWithHostTestsConfigurator(kotlinPluginVersion: String) :
DefaultHostTestRun(name, target).apply { configureTestRun(target, this) } DefaultHostTestRun(name, target).apply { configureTestRun(target, this) }
} }
class KotlinNativeTargetWithSimulatorTestsConfigurator(kotlinPluginVersion: String) : class KotlinNativeTargetWithSimulatorTestsConfigurator :
KotlinNativeTargetWithTestsConfigurator< KotlinNativeTargetWithTestsConfigurator<
KotlinNativeTargetWithSimulatorTests, KotlinNativeTargetWithSimulatorTests,
KotlinNativeSimulatorTestRun, KotlinNativeSimulatorTestRun,
KotlinNativeSimulatorTest>( KotlinNativeSimulatorTest>() {
kotlinPluginVersion
) {
override val testTaskClass: Class<KotlinNativeSimulatorTest> override val testTaskClass: Class<KotlinNativeSimulatorTest>
get() = KotlinNativeSimulatorTest::class.java get() = KotlinNativeSimulatorTest::class.java
@@ -26,8 +26,7 @@ import org.jetbrains.kotlin.konan.target.KonanTarget
abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>( abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
private val name: String, private val name: String,
val project: Project, val project: Project,
val konanTarget: KonanTarget, val konanTarget: KonanTarget
protected val kotlinPluginVersion: String
) : KotlinTargetPreset<T> { ) : KotlinTargetPreset<T> {
init { init {
@@ -108,32 +107,32 @@ abstract class AbstractKotlinNativeTargetPreset<T : KotlinNativeTarget>(
} }
open class KotlinNativeTargetPreset(name: String, project: Project, konanTarget: KonanTarget, kotlinPluginVersion: String) : open class KotlinNativeTargetPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTarget>(name, project, konanTarget, kotlinPluginVersion) { AbstractKotlinNativeTargetPreset<KotlinNativeTarget>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinTargetConfigurator<KotlinNativeTarget> = override fun createTargetConfigurator(): KotlinTargetConfigurator<KotlinNativeTarget> =
KotlinNativeTargetConfigurator(kotlinPluginVersion) KotlinNativeTargetConfigurator()
override fun instantiateTarget(name: String): KotlinNativeTarget { override fun instantiateTarget(name: String): KotlinNativeTarget {
return project.objects.newInstance(KotlinNativeTarget::class.java, project, konanTarget) return project.objects.newInstance(KotlinNativeTarget::class.java, project, konanTarget)
} }
} }
open class KotlinNativeTargetWithHostTestsPreset(name: String, project: Project, konanTarget: KonanTarget, kotlinPluginVersion: String) : open class KotlinNativeTargetWithHostTestsPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithHostTests>(name, project, konanTarget, kotlinPluginVersion) { AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithHostTests>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinNativeTargetWithHostTestsConfigurator = override fun createTargetConfigurator(): KotlinNativeTargetWithHostTestsConfigurator =
KotlinNativeTargetWithHostTestsConfigurator(kotlinPluginVersion) KotlinNativeTargetWithHostTestsConfigurator()
override fun instantiateTarget(name: String): KotlinNativeTargetWithHostTests = override fun instantiateTarget(name: String): KotlinNativeTargetWithHostTests =
project.objects.newInstance(KotlinNativeTargetWithHostTests::class.java, project, konanTarget) project.objects.newInstance(KotlinNativeTargetWithHostTests::class.java, project, konanTarget)
} }
open class KotlinNativeTargetWithSimulatorTestsPreset(name: String, project: Project, konanTarget: KonanTarget, kotlinPluginVersion: String) : open class KotlinNativeTargetWithSimulatorTestsPreset(name: String, project: Project, konanTarget: KonanTarget) :
AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithSimulatorTests>(name, project, konanTarget, kotlinPluginVersion) { AbstractKotlinNativeTargetPreset<KotlinNativeTargetWithSimulatorTests>(name, project, konanTarget) {
override fun createTargetConfigurator(): KotlinNativeTargetWithSimulatorTestsConfigurator = override fun createTargetConfigurator(): KotlinNativeTargetWithSimulatorTestsConfigurator =
KotlinNativeTargetWithSimulatorTestsConfigurator(kotlinPluginVersion) KotlinNativeTargetWithSimulatorTestsConfigurator()
override fun instantiateTarget(name: String): KotlinNativeTargetWithSimulatorTests = override fun instantiateTarget(name: String): KotlinNativeTargetWithSimulatorTests =
project.objects.newInstance(KotlinNativeTargetWithSimulatorTests::class.java, project, konanTarget) project.objects.newInstance(KotlinNativeTargetWithSimulatorTests::class.java, project, konanTarget)
@@ -23,6 +23,7 @@ import org.gradle.api.artifacts.ResolvedDependency
import org.gradle.api.initialization.dsl.ScriptHandler import org.gradle.api.initialization.dsl.ScriptHandler
import org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper import org.jetbrains.kotlin.gradle.plugin.KotlinBasePluginWrapper
import org.jetbrains.kotlin.gradle.plugin.KotlinPlugin import org.jetbrains.kotlin.gradle.plugin.KotlinPlugin
import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion
import java.io.File import java.io.File
import java.net.URLClassLoader import java.net.URLClassLoader
import java.net.URLDecoder import java.net.URLDecoder
@@ -130,7 +131,7 @@ internal fun findJarByClass(klass: Class<*>): File? {
} }
private fun findKotlinModuleJar(project: Project, expectedClassName: String, moduleId: String): List<File> { private fun findKotlinModuleJar(project: Project, expectedClassName: String, moduleId: String): List<File> {
val pluginVersion = pluginVersionFromAppliedPlugin(project) val pluginVersion = project.getKotlinPluginVersion()
val filesToCheck = sequenceOf(pluginVersion?.let { version -> getModuleFromClassLoader(moduleId, version) }) + val filesToCheck = sequenceOf(pluginVersion?.let { version -> getModuleFromClassLoader(moduleId, version) }) +
Sequence { findPotentialModuleJars(project, moduleId).iterator() } //call the body only when queried Sequence { findPotentialModuleJars(project, moduleId).iterator() } //call the body only when queried
@@ -138,9 +139,6 @@ private fun findKotlinModuleJar(project: Project, expectedClassName: String, mod
return filesToCheck.filterNotNull().firstOrNull { it.hasEntry(entryToFind) }?.let { listOf(it) } ?: emptyList() return filesToCheck.filterNotNull().firstOrNull { it.hasEntry(entryToFind) }?.let { listOf(it) } ?: emptyList()
} }
private fun pluginVersionFromAppliedPlugin(project: Project): String? =
project.plugins.filterIsInstance<KotlinBasePluginWrapper>().firstOrNull()?.kotlinPluginVersion
private fun getModuleFromClassLoader(moduleId: String, moduleVersion: String): File? { private fun getModuleFromClassLoader(moduleId: String, moduleVersion: String): File? {
val urlClassLoader = KotlinPlugin::class.java.classLoader as? URLClassLoader ?: return null val urlClassLoader = KotlinPlugin::class.java.classLoader as? URLClassLoader ?: return null
return urlClassLoader.urLs return urlClassLoader.urLs