[Gradle, JS] Fix ambiguity with target name

This commit is contained in:
Ilya Goncharov
2020-01-31 23:12:03 +03:00
parent 6793fb285e
commit f342508a6e
13 changed files with 81 additions and 20 deletions
@@ -78,6 +78,13 @@ class NewMultiplatformIT : BaseGradleIT() {
JsMode.IR
)
@Test
fun testLibAndAppJsMixed() = doTestLibAndApp(
"sample-lib",
"sample-app",
JsMode.MIXED
)
@Test
fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp(
"sample-lib-gradle-kotlin-dsl",
@@ -92,6 +99,13 @@ class NewMultiplatformIT : BaseGradleIT() {
JsMode.IR
)
@Test
fun testLibAndAppWithGradleKotlinDslJsMixed() = doTestLibAndApp(
"sample-lib-gradle-kotlin-dsl",
"sample-app-gradle-kotlin-dsl",
JsMode.MIXED
)
private fun doTestLibAndApp(
libProjectName: String,
appProjectName: String,
@@ -235,6 +249,23 @@ class NewMultiplatformIT : BaseGradleIT() {
assertTasksExecuted(":resolveRuntimeDependencies") // KT-26301
}
if (jsMode == JsMode.MIXED) {
listOf(
JsMode.LEGACY,
JsMode.IR
).forEach {
build(
"assemble",
"resolveRuntimeDependencies",
"--rerun-tasks",
options = defaultBuildOptions().copy(jsMode = it)
) {
checkAppBuild()
assertTasksExecuted(":resolveRuntimeDependencies") // KT-26301
}
}
}
// Now run again with a project dependency instead of a module one:
libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name))
gradleSettingsScript().appendText("\ninclude(\"${libProject.projectDir.name}\")")
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget.Companion.IR
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget.Companion.LEGACY
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.util.concurrent.Callable
@@ -448,6 +449,10 @@ internal fun Project.usageByName(usageName: String): Usage =
fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration {
attributes.attribute(KotlinPlatformType.attribute, target.platformType)
if (target is KotlinJsTarget) {
attributes.attribute(KotlinJsTarget.jsModeAttribute, LEGACY)
}
if (target is KotlinJsIrTarget) {
attributes.attribute(KotlinJsTarget.jsModeAttribute, IR)
}
@@ -159,12 +159,12 @@ class KotlinMultiplatformPlugin(
add(KotlinJvmTargetPreset(project, kotlinPluginVersion))
when (propertiesProvider.jsMode) {
JsMode.LEGACY -> add(KotlinJsTargetPreset(project, kotlinPluginVersion, null))
JsMode.IR -> add(KotlinJsIrTargetPreset(project, kotlinPluginVersion))
JsMode.IR -> add(KotlinJsIrTargetPreset(project, kotlinPluginVersion, false))
JsMode.MIXED -> add(
KotlinJsTargetPreset(
project,
kotlinPluginVersion,
KotlinJsIrTargetPreset(project, kotlinPluginVersion)
KotlinJsIrTargetPreset(project, kotlinPluginVersion, true)
)
)
}
@@ -21,10 +21,10 @@ abstract class KotlinOnlyTargetPreset<R : KotlinOnlyTarget<T>, T : KotlinCompila
protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<T>): String? =
target.targetName
abstract protected fun instantiateTarget(): R
abstract protected fun instantiateTarget(name: String): R
override fun createTarget(name: String): R {
val result = instantiateTarget().apply {
val result = instantiateTarget(name).apply {
targetName = name
disambiguationClassifier = provideTargetDisambiguationClassifier(this@apply)
preset = this@KotlinOnlyTargetPreset
@@ -31,7 +31,9 @@ open class KotlinJsPlugin(
val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion)
val irPreset = if (mixedMode) KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion) else null
val irPreset = if (mixedMode)
KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, mixedMode)
else null
val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion, irPreset).createTarget("Js")
@@ -191,6 +191,7 @@ constructor(
)
const val IR = "ir"
const val LEGACY = "legacy"
fun setupAttributesMatchingStrategy(attributesSchema: AttributesSchema) {
attributesSchema.attribute(jsModeAttribute)
@@ -12,6 +12,7 @@ import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.js.ir.*
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset
@@ -27,16 +28,13 @@ open class KotlinJsTargetPreset(
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js
override fun instantiateTarget(): KotlinJsTarget {
val irTarget = irPreset?.createTarget("JsIr")
override fun instantiateTarget(name: String): KotlinJsTarget {
return project.objects.newInstance(
KotlinJsTarget::class.java,
project,
platformType
).apply {
this.irTarget = irTarget
this.irTarget = irPreset?.createTarget("$name$IR_TARGET_SUFFIX")
}
}
@@ -43,4 +43,16 @@ class KotlinJsIrCompilation(
super.addSourcesToCompileTask(sourceSet, addAsCommonSources)
allSources.add(sourceSet.kotlin)
}
override val defaultSourceSetName: String
get() {
return lowerCamelCaseName(
if ((target as KotlinJsIrTarget).mixedMode)
target.disambiguationClassifier
?.removeSuffix(IR_TARGET_SUFFIX)
else
target.disambiguationClassifier,
compilationName
)
}
}
@@ -28,7 +28,7 @@ open class KotlinJsIrPlugin(
val kotlinExtension = project.kotlinExtension as KotlinJsIrProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion)
val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion).createTarget("Js")
val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, false).createTarget("js")
kotlinExtension.target = target
@@ -25,7 +25,13 @@ import org.jetbrains.kotlin.gradle.testing.testTaskName
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import javax.inject.Inject
open class KotlinJsIrTarget @Inject constructor(project: Project, platformType: KotlinPlatformType) :
open class KotlinJsIrTarget
@Inject
constructor(
project: Project,
platformType: KotlinPlatformType,
internal val mixedMode: Boolean
) :
KotlinOnlyTarget<KotlinJsIrCompilation>(project, platformType),
KotlinTargetWithTests<JsAggregatingExecutionSource, KotlinJsReportAggregatingTestRun>,
KotlinJsTargetDsl,
@@ -6,15 +6,18 @@
package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.JsMode
import org.jetbrains.kotlin.gradle.plugin.KotlinOnlyTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset
open class KotlinJsIrTargetPreset(
project: Project,
kotlinPluginVersion: String
kotlinPluginVersion: String,
private val mixedMode: Boolean
) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>(
project,
kotlinPluginVersion
@@ -22,8 +25,8 @@ open class KotlinJsIrTargetPreset(
override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js
override fun instantiateTarget(): KotlinJsIrTarget {
return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType)
override fun instantiateTarget(name: String): KotlinJsIrTarget {
return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType, mixedMode)
}
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> =
@@ -44,13 +47,16 @@ open class KotlinJsIrTargetPreset(
class KotlinJsIrSingleTargetPreset(
project: Project,
kotlinPluginVersion: String
kotlinPluginVersion: String,
mixedMode: Boolean
) :
KotlinJsIrTargetPreset(project, kotlinPluginVersion) {
KotlinJsIrTargetPreset(project, kotlinPluginVersion, mixedMode) {
// In a Kotlin/JS single-platform project, we don't need any disambiguation suffixes or prefixes in the names:
override fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<KotlinJsIrCompilation>): String? = null
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> =
KotlinJsIrTargetConfigurator(kotlinPluginVersion)
}
}
const val IR_TARGET_SUFFIX = "Ir"
@@ -18,7 +18,7 @@ class KotlinJvmTargetPreset(
project,
kotlinPluginVersion
) {
override fun instantiateTarget(): KotlinJvmTarget {
override fun instantiateTarget(name: String): KotlinJvmTarget {
return project.objects.newInstance(KotlinJvmTarget::class.java, project)
}
@@ -44,7 +44,7 @@ class KotlinMetadataTargetPreset(
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<AbstractKotlinCompilation<*>, KotlinMetadataTarget> =
KotlinMetadataTargetConfigurator(kotlinPluginVersion)
override fun instantiateTarget(): KotlinMetadataTarget {
override fun instantiateTarget(name: String): KotlinMetadataTarget {
return project.objects.newInstance(KotlinMetadataTarget::class.java, project)
}