blob: 4d6af16570b02999b091fb6932d5c221830e1213 [file] [log] [blame]
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03001/*
Vsevolod Tolstopyatov0e926e72021-01-18 08:47:09 -08002 * Copyright 2016-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03003 */
Vsevolod Tolstopyatov13926862021-06-07 16:24:21 +03004
Steve Elliottca095be2022-07-25 14:26:10 +00005
6import org.jetbrains.kotlin.config.KotlinCompilerVersion
Vsevolod Tolstopyatov13926862021-06-07 16:24:21 +03007import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
Steve Elliottca095be2022-07-25 14:26:10 +00008import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +03009import org.jetbrains.kotlin.konan.target.HostManager
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +030010import org.jetbrains.dokka.gradle.DokkaTaskPartial
Steve Elliottca095be2022-07-25 14:26:10 +000011
12import static Projects.*
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030013
Victor Turanskye47cb352020-05-12 18:33:04 +030014apply plugin: 'jdk-convention'
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030015
Kirill Timofeeva5186962017-10-25 14:25:47 +030016buildscript {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030017 /*
18 * These property group is used to build kotlinx.coroutines against Kotlin compiler snapshot.
19 * How does it work:
20 * When build_snapshot_train is set to true, kotlin_version property is overridden with kotlin_snapshot_version,
21 * atomicfu_version is overwritten by TeamCity environment (AFU is built with snapshot and published to mavenLocal
22 * as previous step or the snapshot build).
23 * Additionally, mavenLocal and Sonatype snapshots are added to repository list and stress tests are disabled.
24 * DO NOT change the name of these properties without adapting kotlinx.train build chain.
25 */
26 def prop = rootProject.properties['build_snapshot_train']
27 ext.build_snapshot_train = prop != null && prop != ""
28 if (build_snapshot_train) {
29 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
30 if (kotlin_version == null) {
31 throw new IllegalArgumentException("'kotlin_snapshot_version' should be defined when building with snapshot compiler")
32 }
Roman Elizarove1ac2e52019-04-19 18:51:05 +030033 }
Alexander Likhachev179f1422020-11-18 17:54:33 +030034 ext.native_targets_enabled = rootProject.properties['disable_native_targets'] == null
Roman Elizarove1ac2e52019-04-19 18:51:05 +030035
Roman Elizarov660c2d72020-02-14 13:18:37 +030036 // Determine if any project dependency is using a snapshot version
37 ext.using_snapshot_version = build_snapshot_train
38 rootProject.properties.each { key, value ->
39 if (key.endsWith("_version") && value instanceof String && value.endsWith("-SNAPSHOT")) {
40 println("NOTE: USING SNAPSHOT VERSION: $key=$value")
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +030041 ext.using_snapshot_version = true
Roman Elizarov660c2d72020-02-14 13:18:37 +030042 }
43 }
44
Kirill Timofeeva5186962017-10-25 14:25:47 +030045 repositories {
Vsevolod Tolstopyatov69c3ce32021-07-08 18:47:54 +030046 mavenCentral()
Roman Elizarov65eff0b2017-12-20 15:51:31 +030047 maven { url "https://plugins.gradle.org/m2/" }
Vsevolod Tolstopyatovf2940d52021-03-22 16:11:06 +030048 maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +030049 mavenLocal()
Kirill Timofeeva5186962017-10-25 14:25:47 +030050 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030051
Kirill Timofeeva5186962017-10-25 14:25:47 +030052 dependencies {
53 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
54 classpath "org.jetbrains.dokka:dokka-gradle-plugin:$dokka_version"
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030055 classpath "org.jetbrains.kotlinx:atomicfu-gradle-plugin:$atomicfu_version"
Roman Elizarov660c2d72020-02-14 13:18:37 +030056 classpath "org.jetbrains.kotlinx:kotlinx-knit:$knit_version"
Steve Elliottca095be2022-07-25 14:26:10 +000057 classpath "com.github.node-gradle:gradle-node-plugin:$gradle_node_version"
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +030058 classpath "org.jetbrains.kotlinx:binary-compatibility-validator:$binary_compatibility_validator_version"
Steve Elliottca095be2022-07-25 14:26:10 +000059 classpath "ru.vyarus:gradle-animalsniffer-plugin:1.5.4" // Android API check
60 classpath "org.jetbrains.kotlinx:kover:$kover_version"
Vsevolod Tolstopyatov305c66a2018-08-21 21:01:58 +030061
62 // JMH plugins
Steve Elliottca095be2022-07-25 14:26:10 +000063 classpath "gradle.plugin.com.github.johnrengelman:shadow:7.1.2"
Kirill Timofeeva5186962017-10-25 14:25:47 +030064 }
Roman Elizarov85b1a2b2020-09-14 17:48:17 +030065
66 CacheRedirector.configureBuildScript(buildscript, rootProject)
Kirill Timofeeva5186962017-10-25 14:25:47 +030067}
Roman Elizarov738f5a22020-10-12 19:03:46 +030068// todo:KLUDGE: Hierarchical project structures are not fully supported in IDEA, enable only for a regular built
69if (!Idea.active) {
Sergey Igushkin17248c82020-05-22 12:28:25 +030070 ext.set("kotlin.mpp.enableGranularSourceSetsMetadata", "true")
71}
72
Roman Elizarovd2f4b2b2019-09-02 17:22:39 +030073// todo:KLUDGE: This is needed to workaround dependency resolution between Java and MPP modules
74def configureKotlinJvmPlatform(configuration) {
75 configuration.attributes.attribute(KotlinPlatformType.attribute, KotlinPlatformType.jvm)
76}
77
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +030078allprojects {
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +030079 // the only place where HostManager could be instantiated
80 project.ext.hostManager = new HostManager()
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030081 def deployVersion = properties['DeployVersion']
82 if (deployVersion != null) version = deployVersion
83
84 if (build_snapshot_train) {
85 ext.kotlin_version = rootProject.properties['kotlin_snapshot_version']
86 println "Using Kotlin $kotlin_version for project $it"
87
Vsevolod Tolstopyatov6ca6ed52019-08-21 17:08:34 +030088 def skipSnapshotChecks = rootProject.properties['skip_snapshot_checks'] != null
89 if (!skipSnapshotChecks && version != atomicfu_version) {
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +030090 throw new IllegalStateException("Current deploy version is $version, but atomicfu version is not overridden ($atomicfu_version) for $it")
91 }
92
93 kotlin_version = rootProject.properties['kotlin_snapshot_version']
Roman Elizarove1ac2e52019-04-19 18:51:05 +030094 }
95
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +030096 ext.unpublished = unpublished
Roman Elizarov0b16abf2019-09-03 11:07:11 +030097
98 // This project property is set during nightly stress test
99 def stressTest = project.properties['stressTest']
100
101 // Copy it to all test tasks
102 tasks.withType(Test) {
103 systemProperty 'stressTest', stressTest
104 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300105}
106
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +0300107apply plugin: "binary-compatibility-validator"
Steve Elliottca095be2022-07-25 14:26:10 +0000108apply plugin: "base"
109apply plugin: "kover-conventions"
110
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +0300111apiValidation {
dkhalanskyjb36512762020-02-21 17:31:05 +0300112 ignoredProjects += unpublished + ["kotlinx-coroutines-bom"]
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300113 if (build_snapshot_train) {
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300114 ignoredProjects.remove("example-frontend-js")
Steve Elliottca095be2022-07-25 14:26:10 +0000115 ignoredProjects.add(coreModule)
Vsevolod Tolstopyatovaff82022020-03-10 19:58:36 +0300116 }
Vsevolod Tolstopyatove1538632020-02-10 21:12:58 +0300117 ignoredPackages += "kotlinx.coroutines.internal"
118}
119
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300120// Configure repositories
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300121allprojects {
Roman Elizarov18fa1162018-06-27 15:13:01 +0300122 repositories {
Vsevolod Tolstopyatov6f01c932018-10-23 19:40:48 +0300123 /*
124 * google should be first in the repository list because some of the play services
125 * transitive dependencies was removed from jcenter, thus breaking gradle dependency resolution
126 */
Roman Elizarov660c2d72020-02-14 13:18:37 +0300127 google()
Vsevolod Tolstopyatovad6211c2021-02-10 00:21:58 -0800128 mavenCentral()
Steve Elliottca095be2022-07-25 14:26:10 +0000129 maven { url "https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev" }
Roman Elizarov18fa1162018-06-27 15:13:01 +0300130 }
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300131}
Ilya Gorbunovb1a07ee2018-04-16 21:51:55 +0300132
Steve Elliottca095be2022-07-25 14:26:10 +0000133// needs to be before evaluationDependsOn due to weird Gradle ordering
134apply plugin: "animalsniffer-conventions"
135
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300136// Add dependency to core source sets. Core is configured in kx-core/build.gradle
137configure(subprojects.findAll { !sourceless.contains(it.name) && it.name != coreModule }) {
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300138 evaluationDependsOn(":$coreModule")
Steve Elliottca095be2022-07-25 14:26:10 +0000139 if (isMultiplatform(it)) {
140 apply plugin: "kotlin-multiplatform"
141 apply from: rootProject.file("gradle/compile-jvm-multiplatform.gradle")
142 apply from: rootProject.file("gradle/compile-common.gradle")
143
144 if (rootProject.ext["native_targets_enabled"] as Boolean) {
145 apply from: rootProject.file("gradle/compile-native-multiplatform.gradle")
146 }
147
148 apply from: rootProject.file("gradle/compile-js-multiplatform.gradle")
149 apply from: rootProject.file("gradle/publish-npm-js.gradle")
150 kotlin.sourceSets.commonMain.dependencies {
151 api project(":$coreModule")
152 }
153 kotlin.sourceSets.jvmTest.dependencies {
154 implementation project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
155 }
156 } else {
157 def platform = PlatformKt.platformOf(it)
158 apply plugin: "kotlin-${platform}-conventions"
159 dependencies {
160 api project(":$coreModule")
161 // the only way IDEA can resolve test classes
162 testImplementation project(":$coreModule").kotlin.targets.jvm.compilations.test.output.allOutputs
163 }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300164 }
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300165}
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300166
Steve Elliottca095be2022-07-25 14:26:10 +0000167apply plugin: "bom-conventions"
168
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300169// Configure subprojects with Kotlin sources
170configure(subprojects.findAll { !sourceless.contains(it.name) }) {
171 // Use atomicfu plugin, it also adds all the necessary dependencies
172 apply plugin: 'kotlinx-atomicfu'
173
174 // Configure options for all Kotlin compilation tasks
Steve Elliottca095be2022-07-25 14:26:10 +0000175 tasks.withType(AbstractKotlinCompile).all {
176 kotlinOptions.freeCompilerArgs += OptInPreset.optInAnnotations.collect { "-Xopt-in=" + it }
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300177 kotlinOptions.freeCompilerArgs += "-progressive"
Vsevolod Tolstopyatov556f07a2020-12-02 06:52:35 -0800178 // Disable KT-36770 for RxJava2 integration
179 kotlinOptions.freeCompilerArgs += "-XXLanguage:-ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated"
Roman Elizarovbf9509d2020-02-14 15:52:10 +0300180 // Remove null assertions to get smaller bytecode on Android
181 kotlinOptions.freeCompilerArgs += ["-Xno-param-assertions", "-Xno-receiver-assertions", "-Xno-call-assertions"]
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300182 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300183}
184
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300185if (build_snapshot_train) {
186 println "Hacking test tasks, removing stress and flaky tests"
187 allprojects {
188 tasks.withType(Test).all {
Vsevolod Tolstopyatovdbe3f482019-04-17 17:51:13 +0300189 exclude '**/*LinearizabilityTest*'
190 exclude '**/*LFTest*'
191 exclude '**/*StressTest*'
192 exclude '**/*scheduling*'
193 exclude '**/*Timeout*'
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300194 exclude '**/*definitely/not/kotlinx*'
Vsevolod Tolstopyatov642989e2020-01-24 20:00:46 +0300195 // Disable because of KT-11567 in 1.4
Vsevolod Tolstopyatovfb990b02020-02-04 17:11:47 +0300196 exclude '**/*CasesPublicAPITest*'
Sergey Igushkin17248c82020-05-22 12:28:25 +0300197 // Kotlin
198 exclude '**/*PrecompiledDebugProbesTest*'
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300199 }
200 }
201
202 println "Manifest of kotlin-compiler-embeddable.jar for coroutines"
Steve Elliottca095be2022-07-25 14:26:10 +0000203 configure(subprojects.findAll { it.name == coreModule }) {
Vsevolod Tolstopyatov1748ce12019-04-18 14:49:35 +0300204 configurations.matching { it.name == "kotlinCompilerClasspath" }.all {
205 resolvedConfiguration.getFiles().findAll { it.name.contains("kotlin-compiler-embeddable") }.each {
206 def manifest = zipTree(it).matching {
207 include 'META-INF/MANIFEST.MF'
208 }.getFiles().first()
209
210 manifest.readLines().each {
211 println it
212 }
213 }
Vsevolod Tolstopyatov585b7662019-04-16 12:10:57 +0300214 }
215 }
216}
217
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300218// Redefine source sets because we are not using 'kotlin/main/fqn' folder convention
Vsevolod Tolstopyatovfcaa6df2020-08-24 18:57:22 +0300219configure(subprojects.findAll {
Steve Elliottca095be2022-07-25 14:26:10 +0000220 !sourceless.contains(it.name) && !isMultiplatform(it) &&
Vsevolod Tolstopyatovfcaa6df2020-08-24 18:57:22 +0300221 it.name != "benchmarks" &&
Vsevolod Tolstopyatovfcaa6df2020-08-24 18:57:22 +0300222 it.name != "example-frontend-js"
223}) {
224 // Pure JS and pure MPP doesn't have this notion and are configured separately
225 // TODO detect it via platformOf and migrate benchmarks to the same scheme
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300226 sourceSets {
Roman Elizarovf9408f62018-06-29 20:12:52 +0300227 main.kotlin.srcDirs = ['src']
228 test.kotlin.srcDirs = ['test']
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300229 main.resources.srcDirs = ['resources']
230 test.resources.srcDirs = ['test-resources']
Vsevolod Tolstopyatove1fa1972018-06-19 15:54:58 +0300231 }
232}
233
Steve Elliottca095be2022-07-25 14:26:10 +0000234def core_docs_url = "https://kotlinlang.org/api/kotlinx.coroutines/$coreModule/"
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +0300235def core_docs_file = "$projectDir/kotlinx-coroutines-core/build/dokka/htmlPartial/package-list"
236apply plugin: "org.jetbrains.dokka"
Kirill Timofeeva5186962017-10-25 14:25:47 +0300237
Steve Elliottca095be2022-07-25 14:26:10 +0000238configure(subprojects.findAll { !unpublished.contains(it.name) && it.name != coreModule }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300239 if (it.name != 'kotlinx-coroutines-bom') {
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +0300240 apply from: rootProject.file('gradle/dokka.gradle.kts')
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300241 }
Vsevolod Tolstopyatov347feed2021-04-22 12:58:39 +0300242 apply from: rootProject.file('gradle/publish.gradle')
Kirill Timofeeva5186962017-10-25 14:25:47 +0300243}
244
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300245configure(subprojects.findAll { !unpublished.contains(it.name) }) {
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300246 if (it.name != "kotlinx-coroutines-bom") {
247 if (it.name != coreModule) {
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +0300248 tasks.withType(DokkaTaskPartial.class) {
249 dokkaSourceSets.configureEach {
250 externalDocumentationLink {
251 url.set(new URL(core_docs_url))
252 packageListUrl.set(new File(core_docs_file).toURI().toURL())
253 }
Vsevolod Tolstopyatovfe4e05c2019-07-19 12:28:15 +0300254 }
Roman Elizarov65eff0b2017-12-20 15:51:31 +0300255 }
256 }
Vsevolod Tolstopyatove6e82392018-10-09 19:06:29 +0300257 }
Steve Elliottca095be2022-07-25 14:26:10 +0000258
259 def thisProject = it
260 if (thisProject.name in sourceless) {
261 return
262 }
263
264 def versionFileTask = thisProject.tasks.register("versionFileTask") {
265 def name = thisProject.name.replace("-", "_")
266 def versionFile = thisProject.layout.buildDirectory.file("${name}.version")
267 it.outputs.file(versionFile)
268
269 it.doLast {
270 versionFile.get().asFile.text = version.toString()
271 }
272 }
273
274 List<String> jarTasks
275 if (isMultiplatform(it)) {
276 jarTasks = ["jvmJar", "metadataJar"]
277 } else if (it.name == "kotlinx-coroutines-debug") {
278 // We shadow debug module instead of just packaging it
279 jarTasks = ["shadowJar"]
280 } else {
281 jarTasks = ["jar"]
282 }
283
284 for (name in jarTasks) {
285 thisProject.tasks.named(name, Jar) {
286 it.dependsOn versionFileTask
287 it.from(versionFileTask) {
288 into("META-INF")
289 }
290 }
291 }
Kirill Timofeeva5186962017-10-25 14:25:47 +0300292}
293
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300294// Report Kotlin compiler version when building project
Steve Elliottca095be2022-07-25 14:26:10 +0000295println("Using Kotlin compiler version: $KotlinCompilerVersion.VERSION")
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300296
Roman Elizarov85b1a2b2020-09-14 17:48:17 +0300297// --------------- Cache redirector ---------------
298
299allprojects {
300 CacheRedirector.configure(project)
301}
302
Vsevolod Tolstopyatove50a0fa2019-01-28 11:34:24 +0300303// --------------- Configure sub-projects that are published ---------------
Roman Elizarov85b1a2b2020-09-14 17:48:17 +0300304
Roman Elizarov1ac3dc22020-02-14 15:39:09 +0300305def publishTasks = getTasksByName("publish", true) + getTasksByName("publishNpm", true)
306
Roman Elizarov1ac3dc22020-02-14 15:39:09 +0300307task deploy(dependsOn: publishTasks)
Roman Elizarov94fb2a32018-03-05 17:32:59 +0300308
Kirill Timofeeva5186962017-10-25 14:25:47 +0300309clean.dependsOn gradle.includedBuilds.collect { it.task(':clean') }
Roman Elizarov660c2d72020-02-14 13:18:37 +0300310
311// --------------- Knit configuration ---------------
312
313apply plugin: 'kotlinx-knit'
314
315knit {
Steve Elliottca095be2022-07-25 14:26:10 +0000316 siteRoot = "https://kotlinlang.org/api/kotlinx.coroutines"
Roman Elizarov660c2d72020-02-14 13:18:37 +0300317 moduleRoots = [".", "integration", "reactive", "ui"]
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +0300318 moduleDocs = "build/dokka/htmlPartial"
319 dokkaMultiModuleRoot = "build/dokka/htmlMultiModule/"
Roman Elizarov660c2d72020-02-14 13:18:37 +0300320}
321
Vsevolod Tolstopyatovbcbcd162021-07-06 14:29:27 +0300322knitPrepare.dependsOn getTasksByName("dokkaHtmlMultiModule", true)
323
324dependencies {
325 dokkaHtmlMultiModulePlugin("org.jetbrains.kotlinx:dokka-pathsaver-plugin:$knit_version")
326}
Alexander Likhachev179f1422020-11-18 17:54:33 +0300327
Vsevolod Tolstopyatov13926862021-06-07 16:24:21 +0300328// Opt-in for build scan in order to troubleshoot Gradle on TC
329if (hasProperty('buildScan')) {
330 buildScan {
331 termsOfServiceUrl = 'https://gradle.com/terms-of-service'
332 termsOfServiceAgree = 'yes'
333 }
334}
335
336/*
337 * kotlinx-coroutines-core dependency leaks into test runtime classpath via kotlin-compiler-embeddable
338 * and conflicts with our own test/runtime incompatibilities (e.g. when class is moved from a main to test),
339 * so we do substitution here
340 */
341allprojects { subProject ->
342 subProject
343 .configurations
344 .matching {
345 // Excluding substituted project itself because of circular dependencies, but still do it
346 // for "*Test*" configurations
Steve Elliottca095be2022-07-25 14:26:10 +0000347 subProject.name != coreModule || it.name.contains("Test")
Vsevolod Tolstopyatov13926862021-06-07 16:24:21 +0300348 }
349 .configureEach { conf ->
350 conf.resolutionStrategy.dependencySubstitution {
Steve Elliottca095be2022-07-25 14:26:10 +0000351 substitute(module("org.jetbrains.kotlinx:$coreModule"))
352 .using(project(":$coreModule"))
Vsevolod Tolstopyatov13926862021-06-07 16:24:21 +0300353 .because("Because Kotlin compiler embeddable leaks coroutines into the runtime classpath, " +
354 "triggering all sort of incompatible class changes errors")
355 }
356 }
357}