[Gradle, JS] Add diagnostic messages for js targets

This commit is contained in:
Ilya Goncharov
2020-02-20 12:29:15 +03:00
parent aefaa6dc7f
commit 40fb6c67d2
6 changed files with 70 additions and 10 deletions
@@ -98,7 +98,8 @@ open class KotlinJsProjectExtension :
// target is public property
// Users can write kotlin.target and it should work
// So call of target should init default canfiguration
private var _target: KotlinJsTargetDsl? = null
internal var _target: KotlinJsTargetDsl? = null
private set
override var target: KotlinJsTargetDsl
get() {
@@ -39,6 +39,23 @@ open class KotlinJsPlugin(
defaultJsCompilerType = PropertiesProvider(project).jsCompiler
}
project.afterEvaluate {
checkNotNull(kotlinExtension._target) {
"""
Need to initialize js target.
Use
kotlin {
js {
// Choose sub target (or both), for which js is necessary
// Affect in which tests are executed and final dist (in browser is only one bundle file)
browser()
nodejs()
}
}
""".trimIndent()
}
}
// Explicitly create configurations for main and test
// It is because in single platform we want to declare dependencies with methods not with strings in Kotlin DSL
// implementation("foo") instead of "implementation"("foo")
@@ -107,7 +107,8 @@ constructor(
override val browser by browserLazyDelegate
override val isBrowserConfigured: Boolean = browserLazyDelegate.isInitialized()
override val isBrowserConfigured: Boolean
get() = browserLazyDelegate.isInitialized()
override fun browser(body: KotlinJsBrowserDsl.() -> Unit) {
body(browser)
@@ -129,7 +130,8 @@ constructor(
override val nodejs by nodejsLazyDelegate
override val isNodejsConfigured: Boolean = nodejsLazyDelegate.isInitialized()
override val isNodejsConfigured: Boolean
get() = nodejsLazyDelegate.isInitialized()
override fun nodejs(body: KotlinJsNodeDsl.() -> Unit) {
body(nodejs)
@@ -12,6 +12,7 @@ import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.removeJsCompilerSuffix
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset
@@ -39,6 +40,25 @@ open class KotlinJsTargetPreset(
this.irTarget = irPreset?.createTarget(
lowerCamelCaseName(name.removeJsCompilerSuffix(KotlinJsCompilerType.legacy), KotlinJsCompilerType.ir.name)
)
project.whenEvaluated {
if (!isBrowserConfigured && !isNodejsConfigured) {
project.logger.warn(
"""
Choose sub target (or both), for which js is necessary
In next releases it will be error
Use
kotlin {
js {
// Affect in which tests are executed and final dist (in browser is only one bundle file)
browser()
nodejs()
}
}
""".trimIndent()
)
}
}
}
}
@@ -61,7 +61,8 @@ constructor(
override val browser by browserLazyDelegate
override val isBrowserConfigured: Boolean = browserLazyDelegate.isInitialized()
override val isBrowserConfigured: Boolean
get() = browserLazyDelegate.isInitialized()
override fun browser(body: KotlinJsBrowserDsl.() -> Unit) {
body(browser)
@@ -82,7 +83,8 @@ constructor(
override val nodejs by nodejsLazyDelegate
override val isNodejsConfigured: Boolean = nodejsLazyDelegate.isInitialized()
override val isNodejsConfigured: Boolean
get() = nodejsLazyDelegate.isInitialized()
override fun nodejs(body: KotlinJsNodeDsl.() -> Unit) {
body(nodejs)
@@ -6,13 +6,10 @@
package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
import org.jetbrains.kotlin.gradle.plugin.KotlinOnlyTargetConfigurator
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinCompilationFactory
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTargetPreset
import org.jetbrains.kotlin.gradle.plugin.removeJsCompilerSuffix
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
open class KotlinJsIrTargetPreset(
@@ -28,7 +25,28 @@ open class KotlinJsIrTargetPreset(
get() = KotlinPlatformType.js
override fun instantiateTarget(name: String): KotlinJsIrTarget {
return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType, mixedMode)
return project.objects.newInstance(KotlinJsIrTarget::class.java, project, platformType, mixedMode).apply {
if (!mixedMode) {
project.whenEvaluated {
if (!isBrowserConfigured && !isNodejsConfigured) {
project.logger.warn(
"""
Choose sub target (or both), for which js is necessary
In next releases it will be error
Use
kotlin {
js {
// Affect in which tests are executed and final dist (in browser is only one bundle file)
browser()
nodejs()
}
}
""".trimIndent()
)
}
}
}
}
}
override fun createKotlinTargetConfigurator(): KotlinOnlyTargetConfigurator<KotlinJsIrCompilation, KotlinJsIrTarget> =