Skip to content

Commit

Permalink
Add kotlin-build-tools-enum-compat workaround
Browse files Browse the repository at this point in the history
It acts as a workaround for the case when build tools or dependencies
are compiled with latest 'kotlin-stdlib' version, but at a runtime older
 'kotlin-stdlib' is provided, which does not know about new
 `EnumEntries`.

 ^KT-57317 Fixed
  • Loading branch information
Tapchicoma authored and qodana-bot committed Apr 21, 2023
1 parent 1f649b6 commit eb4e96a
Show file tree
Hide file tree
Showing 25 changed files with 174 additions and 128 deletions.
1 change: 1 addition & 0 deletions .space/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,7 @@
/libraries/tools/binary-compatibility-validator/ "Kotlin Libraries"
/libraries/tools/dukat/ "Kotlin JS"
/libraries/kotlin-dom-api-compat/ "Kotlin JS"
/libraries/tools/kotlin-build-tools-enum-compat/ "Kotlin Build Tools"
/libraries/tools/gradle/ "Kotlin Build Tools"
/libraries/tools/kotlin-allopen/ "Kotlin Build Tools"
/libraries/tools/kotlin-annotations-jvm/ "Kotlin Libraries"
Expand Down
10 changes: 0 additions & 10 deletions build-common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion as GradleKotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

description = "Kotlin Build Common"

plugins {
Expand Down Expand Up @@ -50,10 +47,3 @@ projectTest(parallel = true)
projectTest("testJUnit5", jUnitMode = JUnitMode.JUnit5, parallel = true) {
useJUnitPlatform()
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(GradleKotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(GradleKotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
1 change: 1 addition & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,7 @@ extra["compilerModules"] =
// They are embedded just because we don't publish those dependencies as separate Maven artifacts (yet)
extra["kotlinJpsPluginEmbeddedDependencies"] = listOf(
":compiler:cli-common",
":kotlin-build-tools-enum-compat",
":kotlin-compiler-runner-unshaded",
":daemon-common",
":core:compiler.common",
Expand Down
26 changes: 23 additions & 3 deletions buildSrc/src/main/kotlin/GradleCommon.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import org.gradle.api.attributes.*
import org.gradle.api.attributes.java.TargetJvmEnvironment
import org.gradle.api.attributes.java.TargetJvmVersion
import org.gradle.api.attributes.plugin.GradlePluginApiVersion
import org.gradle.api.file.FileCollection
import org.gradle.api.component.AdhocComponentWithVariants
import org.gradle.api.plugins.JavaLibraryPlugin
import org.gradle.api.plugins.JavaPlugin
Expand All @@ -31,12 +30,10 @@ import org.jetbrains.dokka.gradle.DokkaTask
import org.jetbrains.dokka.gradle.GradleExternalDocumentationLinkBuilder
import org.jetbrains.kotlin.gradle.dsl.KotlinSingleJavaTargetExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import plugins.configureDefaultPublishing
import plugins.configureKotlinPomAttributes
import java.net.URL
import java.util.*

/**
* Gradle's plugins common variants.
Expand Down Expand Up @@ -251,6 +248,7 @@ fun Project.wireGradleVariantToCommonGradleVariant(
from(wireSourceSet.output, commonSourceSet.output)
setupPublicJar(archiveBaseName.get())
addEmbeddedRuntime()
addEmbeddedRuntime(wireSourceSet.embeddedConfigurationName)
} else if (name == wireSourceSet.sourcesJarTaskName) {
from(wireSourceSet.allSource, commonSourceSet.allSource)
}
Expand Down Expand Up @@ -302,6 +300,15 @@ fun Project.reconfigureMainSourcesSetForGradlePlugin(
withJavadocJar()
}
}

configurations.create(sourceSets.getByName("main").embeddedConfigurationName) {
isCanBeConsumed = false
isCanBeResolved = true
attributes {
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR))
}
}
}

// Workaround for https://youtrack.jetbrains.com/issue/KT-52987
Expand Down Expand Up @@ -423,10 +430,20 @@ fun Project.createGradlePluginVariant(

configurations.named(variantSourceSet.apiElementsConfigurationName, commonVariantAttributes())
configurations.named(variantSourceSet.runtimeElementsConfigurationName, commonVariantAttributes())

configurations.create(variantSourceSet.embeddedConfigurationName) {
isCanBeConsumed = false
isCanBeResolved = true
attributes {
attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR))
}
}
}

tasks.named<Jar>(variantSourceSet.sourcesJarTaskName) {
addEmbeddedSources()
addEmbeddedSources(variantSourceSet.embeddedConfigurationName)
}
}

Expand Down Expand Up @@ -513,6 +530,7 @@ fun Project.publishShadowedJar(
jarTask.flatMap { it.archiveClassifier }
)
addEmbeddedRuntime()
addEmbeddedRuntime(sourceSet.embeddedConfigurationName)
from(sourceSet.output)
from(commonSourceSet.output)

Expand Down Expand Up @@ -701,3 +719,5 @@ private fun GradleExternalDocumentationLinkBuilder.addWorkaroundForElementList(p
packageListUrl.set(URL("${pluginVariant.gradleApiJavadocUrl}element-list"))
}
}

private val SourceSet.embeddedConfigurationName get() = "${name}Embedded"
10 changes: 6 additions & 4 deletions buildSrc/src/main/kotlin/artifacts.kt
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,9 @@ fun Project.noDefaultJar() {
configurations.named("archives", removeJarTaskArtifact(jarTask))
}

fun Jar.addEmbeddedRuntime() {
project.configurations.findByName("embedded")?.let { embedded ->
@JvmOverloads
fun Jar.addEmbeddedRuntime(embeddedConfigurationName: String = "embedded") {
project.configurations.findByName(embeddedConfigurationName)?.let { embedded ->
dependsOn(embedded)
val archiveOperations = project.serviceOf<ArchiveOperations>()
from {
Expand Down Expand Up @@ -203,8 +204,9 @@ fun Project.sourcesJarWithSourcesFromEmbedded(
return sourcesJarTask
}

fun Jar.addEmbeddedSources() {
project.configurations.findByName("embedded")?.let { embedded ->
@JvmOverloads
fun Jar.addEmbeddedSources(configurationName: String = "embedded") {
project.configurations.findByName(configurationName)?.let { embedded ->
val allSources by lazy {
embedded.resolvedConfiguration
.resolvedArtifacts
Expand Down
10 changes: 0 additions & 10 deletions compiler/cli/cli-common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand Down Expand Up @@ -33,10 +30,3 @@ tasks.getByName<Jar>("jar") {
//excludes unused bunch files
exclude("META-INF/extensions/*.xml.**")
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
10 changes: 0 additions & 10 deletions compiler/config.jvm/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand All @@ -16,10 +13,3 @@ sourceSets {
"main" { projectDefault() }
"test" { }
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
11 changes: 0 additions & 11 deletions compiler/daemon/daemon-common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand All @@ -16,11 +13,3 @@ sourceSets {
"main" { projectDefault() }
"test" {}
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}

11 changes: 0 additions & 11 deletions compiler/frontend.common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask


plugins {
kotlin("jvm")
id("jps-compatible")
Expand All @@ -18,10 +14,3 @@ sourceSets {
"main" { projectDefault() }
"test" {}
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
10 changes: 0 additions & 10 deletions compiler/incremental-compilation-impl/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand Down Expand Up @@ -56,10 +53,3 @@ projectTest("testJvmICWithJdk11", parallel = true) {
}

testsJar()

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
10 changes: 0 additions & 10 deletions compiler/util/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion as GradleKotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand All @@ -24,10 +21,3 @@ sourceSets {
}
"test" {}
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(GradleKotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(GradleKotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
10 changes: 0 additions & 10 deletions core/deserialization.common.jvm/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand All @@ -18,10 +15,3 @@ sourceSets {
"main" { projectDefault() }
"test" {}
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
10 changes: 0 additions & 10 deletions core/util.runtime/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand All @@ -16,10 +13,3 @@ sourceSets {
"main" { projectDefault() }
"test" {}
}

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
1 change: 1 addition & 0 deletions gradle/verification-metadata.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<trust group="org.jetbrains.kotlin" name="kotlin-annotation-processing-embeddable" version="1.9.[0-9](-.+)?" regex="true"/>
<trust group="org.jetbrains.kotlin" name="kotlin-annotation-processing-gradle" version="1.9.[0-9](-.+)?" regex="true"/>
<trust group="org.jetbrains.kotlin" name="kotlin-build-common" version="1.9.[0-9](-.+)?" regex="true"/>
<trust group="org.jetbrains.kotlin" name="kotlin-build-tools-enum-compat" version="1.9.[0-9](-.+)?" regex="true"/>
<trust group="org.jetbrains.kotlin" name="kotlin-build-tools-api" version="1.9.[0-9](-.+)?" regex="true"/>
<trust group="org.jetbrains.kotlin" name="kotlin-build-tools-impl" version="1.9.[0-9](-.+)?" regex="true"/>
<trust group="org.jetbrains.kotlin" name="kotlin-compiler-embeddable" version="1.9.[0-9](-.+)?" regex="true"/>
Expand Down
2 changes: 1 addition & 1 deletion jps/jps-common/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,4 @@ runtimeJar()
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
}
10 changes: 0 additions & 10 deletions libraries/scripting/common/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask

plugins {
kotlin("jvm")
id("jps-compatible")
Expand Down Expand Up @@ -30,10 +27,3 @@ publish()
runtimeJar()
sourcesJar()
javadocJar()

// 1.9 level breaks Kotlin Gradle plugins via changes in enums (KT-48872)
// We limit api and LV until KGP will stop using Kotlin compiler directly (KT-56574)
tasks.withType<KotlinCompilationTask<*>>().configureEach {
compilerOptions.apiVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
compilerOptions.languageVersion.value(KotlinVersion.KOTLIN_1_8).finalizeValueOnRead()
}
7 changes: 7 additions & 0 deletions libraries/tools/kotlin-build-tools-enum-compat/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## Description

Backport of `EnumEntries` runtime support API ([KT-48872](https://youtrack.jetbrains.com/issue/KT-48872))

This should help with the case when code was compiled using newer `kotlin-stdlib` version as a `compileOnly` dependency, but at a runtime
older version of `kotlin-stdlib` is provided ([KT-57317](https://youtrack.jetbrains.com/issue/KT-57317)). Mostly it is needed for Kotlin
build tools artifacts.
17 changes: 17 additions & 0 deletions libraries/tools/kotlin-build-tools-enum-compat/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile

plugins {
id("org.jetbrains.kotlin.jvm")
id("jps-compatible")
}

configureKotlinCompileTasksGradleCompatibility()
extensions.extraProperties["kotlin.stdlib.default.dependency"] = "false"

dependencies {
compileOnly(project(":kotlin-stdlib"))
}

tasks.withType<KotlinJvmCompile>().configureEach {
compilerOptions.freeCompilerArgs.add("-Xallow-kotlin-package")
}
Loading

0 comments on commit eb4e96a

Please sign in to comment.