From 4bd8e2f78c4839a9d62dca8456f876b02ee6f1df Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 7 Jul 2020 19:36:33 +0900 Subject: [PATCH] Parcelize: Support the new Parcelize plugin in Gradle (KT-40030) --- .../kotlin-gradle-plugin/build.gradle.kts | 5 ++ .../android/internal/ParcelizeSubplugin.kt | 66 +++++++++++++++++++ .../kotlin-parcelize.properties | 1 + ...tbrains.kotlin.plugin.parcelize.properties | 1 + 4 files changed, 73 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-parcelize.properties create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.parcelize.properties diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts index 5ca2033411c..afd9bf912ea 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts @@ -189,6 +189,11 @@ pluginBundle { id = "org.jetbrains.kotlin.android.extensions", display = "Kotlin Android Extensions plugin" ) + create( + name = "kotlinParcelizePlugin", + id = "org.jetbrains.kotlin.plugin.parcelize", + display = "Kotlin Parcelize plugin" + ) create( name = "kotlinKaptPlugin", id = "org.jetbrains.kotlin.kapt", diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt new file mode 100644 index 00000000000..f62c2e8c79c --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt @@ -0,0 +1,66 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("PackageDirectoryMismatch") // Old package for compatibility +package org.jetbrains.kotlin.gradle.internal + +import com.android.build.gradle.BaseExtension +import org.gradle.api.Project +import org.gradle.api.provider.Provider +import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation + +// Use apply plugin: 'kotlin-parcelize' to enable Android Extensions in an Android project. +class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin { + override fun apply(target: Project) { + addParcelizeRuntime(target) + } + + override fun isApplicable(kotlinCompilation: KotlinCompilation<*>): Boolean { + if (kotlinCompilation !is KotlinJvmAndroidCompilation) { + return false + } + + val project = kotlinCompilation.target.project + if (project.extensions.findByName("android") !is BaseExtension) { + return false + } + + return true + } + + override fun applyToCompilation(kotlinCompilation: KotlinCompilation<*>): Provider> { + return kotlinCompilation.target.project.provider { emptyList() } + } + + override fun getCompilerPluginId() = "org.jetbrains.kotlin.parcelize" + override fun getPluginArtifact(): SubpluginArtifact = JetBrainsSubpluginArtifact(artifactId = "kotlin-parcelize-compiler") + + private fun addParcelizeRuntime(project: Project) { + val kotlinPluginVersion = project.getKotlinPluginVersion() ?: run { + project.logger.error("Kotlin plugin should be enabled before 'kotlin-parcelize'") + return + } + + project.configurations.all { configuration -> + val name = configuration.name + if (name != "implementation" && name != "compile") return@all + + val androidPluginVersion = loadAndroidPluginVersion() ?: return@all + val requiredConfigurationName = when { + compareVersionNumbers(androidPluginVersion, "2.5") > 0 -> "implementation" + else -> "compile" + } + + if (name != requiredConfigurationName) return@all + + configuration.dependencies.add( + project.dependencies.create( + "org.jetbrains.kotlin:kotlin-parcelize-runtime:$kotlinPluginVersion" + ) + ) + } + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-parcelize.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-parcelize.properties new file mode 100644 index 00000000000..b98606e394e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/kotlin-parcelize.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.gradle.internal.ParcelizeSubplugin \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.parcelize.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.parcelize.properties new file mode 100644 index 00000000000..b98606e394e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.plugin.parcelize.properties @@ -0,0 +1 @@ +implementation-class=org.jetbrains.kotlin.gradle.internal.ParcelizeSubplugin \ No newline at end of file