[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 JsMode.IR
) )
@Test
fun testLibAndAppJsMixed() = doTestLibAndApp(
"sample-lib",
"sample-app",
JsMode.MIXED
)
@Test @Test
fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp( fun testLibAndAppWithGradleKotlinDsl() = doTestLibAndApp(
"sample-lib-gradle-kotlin-dsl", "sample-lib-gradle-kotlin-dsl",
@@ -92,6 +99,13 @@ class NewMultiplatformIT : BaseGradleIT() {
JsMode.IR JsMode.IR
) )
@Test
fun testLibAndAppWithGradleKotlinDslJsMixed() = doTestLibAndApp(
"sample-lib-gradle-kotlin-dsl",
"sample-app-gradle-kotlin-dsl",
JsMode.MIXED
)
private fun doTestLibAndApp( private fun doTestLibAndApp(
libProjectName: String, libProjectName: String,
appProjectName: String, appProjectName: String,
@@ -235,6 +249,23 @@ class NewMultiplatformIT : BaseGradleIT() {
assertTasksExecuted(":resolveRuntimeDependencies") // KT-26301 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: // Now run again with a project dependency instead of a module one:
libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name)) libProject.projectDir.copyRecursively(projectDir.resolve(libProject.projectDir.name))
gradleSettingsScript().appendText("\ninclude(\"${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.plugin.mpp.*
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget 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.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.targets.js.ir.KotlinJsIrTarget
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.util.concurrent.Callable import java.util.concurrent.Callable
@@ -448,6 +449,10 @@ internal fun Project.usageByName(usageName: String): Usage =
fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration { fun Configuration.usesPlatformOf(target: KotlinTarget): Configuration {
attributes.attribute(KotlinPlatformType.attribute, target.platformType) attributes.attribute(KotlinPlatformType.attribute, target.platformType)
if (target is KotlinJsTarget) {
attributes.attribute(KotlinJsTarget.jsModeAttribute, LEGACY)
}
if (target is KotlinJsIrTarget) { if (target is KotlinJsIrTarget) {
attributes.attribute(KotlinJsTarget.jsModeAttribute, IR) attributes.attribute(KotlinJsTarget.jsModeAttribute, IR)
} }
@@ -159,12 +159,12 @@ class KotlinMultiplatformPlugin(
add(KotlinJvmTargetPreset(project, kotlinPluginVersion)) add(KotlinJvmTargetPreset(project, kotlinPluginVersion))
when (propertiesProvider.jsMode) { when (propertiesProvider.jsMode) {
JsMode.LEGACY -> add(KotlinJsTargetPreset(project, kotlinPluginVersion, null)) JsMode.LEGACY -> add(KotlinJsTargetPreset(project, kotlinPluginVersion, null))
JsMode.IR -> add(KotlinJsIrTargetPreset(project, kotlinPluginVersion)) JsMode.IR -> add(KotlinJsIrTargetPreset(project, kotlinPluginVersion, false))
JsMode.MIXED -> add( JsMode.MIXED -> add(
KotlinJsTargetPreset( KotlinJsTargetPreset(
project, project,
kotlinPluginVersion, 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? = protected open fun provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<T>): String? =
target.targetName target.targetName
abstract protected fun instantiateTarget(): R abstract protected fun instantiateTarget(name: String): R
override fun createTarget(name: String): R { override fun createTarget(name: String): R {
val result = instantiateTarget().apply { val result = instantiateTarget(name).apply {
targetName = name targetName = name
disambiguationClassifier = provideTargetDisambiguationClassifier(this@apply) disambiguationClassifier = provideTargetDisambiguationClassifier(this@apply)
preset = this@KotlinOnlyTargetPreset preset = this@KotlinOnlyTargetPreset
@@ -31,7 +31,9 @@ open class KotlinJsPlugin(
val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) 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") val target = KotlinJsSingleTargetPreset(project, kotlinPluginVersion, irPreset).createTarget("Js")
@@ -191,6 +191,7 @@ constructor(
) )
const val IR = "ir" const val IR = "ir"
const val LEGACY = "legacy"
fun setupAttributesMatchingStrategy(attributesSchema: AttributesSchema) { fun setupAttributesMatchingStrategy(attributesSchema: AttributesSchema) {
attributesSchema.attribute(jsModeAttribute) attributesSchema.attribute(jsModeAttribute)
@@ -12,6 +12,7 @@ import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator 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.KotlinJsIrSingleTargetPreset
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetConfigurator import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset
@@ -27,16 +28,13 @@ open class KotlinJsTargetPreset(
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js get() = KotlinPlatformType.js
override fun instantiateTarget(): KotlinJsTarget { override fun instantiateTarget(name: String): KotlinJsTarget {
val irTarget = irPreset?.createTarget("JsIr")
return project.objects.newInstance( return project.objects.newInstance(
KotlinJsTarget::class.java, KotlinJsTarget::class.java,
project, project,
platformType platformType
).apply { ).apply {
this.irTarget = irTarget this.irTarget = irPreset?.createTarget("$name$IR_TARGET_SUFFIX")
} }
} }
@@ -43,4 +43,16 @@ class KotlinJsIrCompilation(
super.addSourcesToCompileTask(sourceSet, addAsCommonSources) super.addSourcesToCompileTask(sourceSet, addAsCommonSources)
allSources.add(sourceSet.kotlin) 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 val kotlinExtension = project.kotlinExtension as KotlinJsIrProjectExtension
configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion)
val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion).createTarget("Js") val target = KotlinJsIrSingleTargetPreset(project, kotlinPluginVersion, false).createTarget("js")
kotlinExtension.target = target kotlinExtension.target = target
@@ -25,7 +25,13 @@ import org.jetbrains.kotlin.gradle.testing.testTaskName
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import javax.inject.Inject 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), KotlinOnlyTarget<KotlinJsIrCompilation>(project, platformType),
KotlinTargetWithTests<JsAggregatingExecutionSource, KotlinJsReportAggregatingTestRun>, KotlinTargetWithTests<JsAggregatingExecutionSource, KotlinJsReportAggregatingTestRun>,
KotlinJsTargetDsl, KotlinJsTargetDsl,
@@ -6,15 +6,18 @@
package org.jetbrains.kotlin.gradle.targets.js.ir package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project 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.KotlinOnlyTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType 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.KotlinCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset
open class KotlinJsIrTargetPreset( open class KotlinJsIrTargetPreset(
project: Project, project: Project,
kotlinPluginVersion: String kotlinPluginVersion: String,
private val mixedMode: Boolean
) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>( ) : KotlinOnlyTargetPreset<KotlinJsIrTarget, KotlinJsIrCompilation>(
project, project,
kotlinPluginVersion kotlinPluginVersion
@@ -22,8 +25,8 @@ open class KotlinJsIrTargetPreset(
override val platformType: KotlinPlatformType override val platformType: KotlinPlatformType
get() = KotlinPlatformType.js get() = KotlinPlatformType.js
override fun instantiateTarget(): KotlinJsIrTarget { override fun instantiateTarget(name: String): KotlinJsIrTarget {
return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType) return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType, mixedMode)
} }
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> = override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> =
@@ -44,9 +47,10 @@ open class KotlinJsIrTargetPreset(
class KotlinJsIrSingleTargetPreset( class KotlinJsIrSingleTargetPreset(
project: Project, 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: // 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 provideTargetDisambiguationClassifier(target: KotlinOnlyTarget<KotlinJsIrCompilation>): String? = null
@@ -54,3 +58,5 @@ class KotlinJsIrSingleTargetPreset(
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> = override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> =
KotlinJsIrTargetConfigurator(kotlinPluginVersion) KotlinJsIrTargetConfigurator(kotlinPluginVersion)
} }
const val IR_TARGET_SUFFIX = "Ir"
@@ -18,7 +18,7 @@ class KotlinJvmTargetPreset(
project, project,
kotlinPluginVersion kotlinPluginVersion
) { ) {
override fun instantiateTarget(): KotlinJvmTarget { override fun instantiateTarget(name: String): KotlinJvmTarget {
return project.objects.newInstance(KotlinJvmTarget::class.java, project) return project.objects.newInstance(KotlinJvmTarget::class.java, project)
} }
@@ -44,7 +44,7 @@ class KotlinMetadataTargetPreset(
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<AbstractKotlinCompilation<*>, KotlinMetadataTarget> = override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<AbstractKotlinCompilation<*>, KotlinMetadataTarget> =
KotlinMetadataTargetConfigurator(kotlinPluginVersion) KotlinMetadataTargetConfigurator(kotlinPluginVersion)
override fun instantiateTarget(): KotlinMetadataTarget { override fun instantiateTarget(name: String): KotlinMetadataTarget {
return project.objects.newInstance(KotlinMetadataTarget::class.java, project) return project.objects.newInstance(KotlinMetadataTarget::class.java, project)
} }