diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 781871224d7..e92304d7158 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -77,6 +77,8 @@ abstract class KotlinBasePluginWrapper( kotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion) + defineExtension(project) + project.createKotlinExtension(projectExtensionClass).apply { fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory) = project.container(KotlinSourceSet::class.java, factory) @@ -107,6 +109,9 @@ abstract class KotlinBasePluginWrapper( project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices ): Plugin + + protected open fun defineExtension(project: Project) { + } } open class KotlinPluginWrapper @Inject constructor( @@ -156,11 +161,28 @@ open class Kotlin2JsPluginWrapper @Inject constructor( open class KotlinJsPluginWrapper @Inject constructor( fileResolver: FileResolver ) : KotlinBasePluginWrapper(fileResolver) { - override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin = - KotlinJsPlugin(kotlinPluginVersion) + override fun getPlugin(project: Project, kotlinGradleBuildServices: KotlinGradleBuildServices): Plugin { + val propertiesProvider = PropertiesProvider(project) - override val projectExtensionClass: KClass - get() = KotlinJsProjectExtension::class + return when (propertiesProvider.jsMode) { + JsMode.IR -> KotlinJsIrPlugin(kotlinPluginVersion) + JsMode.LEGACY -> KotlinJsPlugin(kotlinPluginVersion) + JsMode.MIXED -> KotlinJsPlugin(kotlinPluginVersion) + } + } + + override lateinit var projectExtensionClass: KClass + + override fun defineExtension(project: Project) { + val propertiesProvider = PropertiesProvider(project) + + when (propertiesProvider.jsMode) { + JsMode.IR -> projectExtensionClass = KotlinJsIrProjectExtension::class + JsMode.LEGACY -> projectExtensionClass = KotlinJsProjectExtension::class + JsMode.MIXED -> { + } //TODO MIXED MODE + } + } override fun createTestRegistry(project: Project) = KotlinTestsRegistry(project, "test") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 5a1b9b2bd6d..901224edaca 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -168,6 +168,12 @@ internal class PropertiesProvider private constructor(private val project: Proje val jsDiscoverTypes: Boolean? get() = booleanProperty("kotlin.js.experimental.discoverTypes") + /** + * Use Kotlin/JS backend mode + */ + val jsMode: JsMode + get() = property("kotlin.js.mode")?.let { JsMode.byCompilerArgument(it) } ?: JsMode.IR + private fun propertyWithDeprecatedVariant(propName: String, deprecatedPropName: String): String? { val deprecatedProperty = property(deprecatedPropName) if (deprecatedProperty != null) { @@ -201,3 +207,14 @@ internal class PropertiesProvider private constructor(private val project: Proje } } } + +internal enum class JsMode { + LEGACY, + IR, + MIXED; + + companion object { + fun byCompilerArgument(argument: String): JsMode? = + JsMode.values().firstOrNull { it.name.equals(argument, ignoreCase = true) } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties index a33cb3a9172..661fbbe0005 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties +++ b/libraries/tools/kotlin-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.jetbrains.kotlin.js.properties @@ -1 +1 @@ -implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinJsIrPluginWrapper \ No newline at end of file +implementation-class=org.jetbrains.kotlin.gradle.plugin.KotlinJsPluginWrapper \ No newline at end of file