[kotlin] allow switching between K1/K2 plugins by UI setting

^KTIJ-25184 fixed

GitOrigin-RevId: a56e9a0fdc257e67faedb2b4734148d764d211c6
This commit is contained in:
Ilya Kirillov
2023-07-13 18:28:33 +02:00
committed by intellij-monorepo-bot
parent 3f7fd4b7d7
commit 7b01c8c339
6 changed files with 233 additions and 10 deletions

View File

@@ -5,18 +5,27 @@ import com.intellij.openapi.application.ApplicationManager
interface KotlinPluginKindProvider {
val pluginKind: KotlinPluginKind
companion object {
val currentPluginKind: KotlinPluginKind
get() = ApplicationManager.getApplication().getService(KotlinPluginKindProvider::class.java).pluginKind
}
}
enum class KotlinPluginKind {
FE10_PLUGIN,
FIR_PLUGIN
FE10_PLUGIN {
override fun other(): KotlinPluginKind = FIR_PLUGIN
},
FIR_PLUGIN {
override fun other(): KotlinPluginKind = FE10_PLUGIN
};
abstract fun other(): KotlinPluginKind
}
private val currentPluginKind: KotlinPluginKind
get() = ApplicationManager.getApplication().getService(KotlinPluginKindProvider::class.java).pluginKind
fun isK2Plugin(): Boolean {
return currentPluginKind == KotlinPluginKind.FIR_PLUGIN
return KotlinPluginKindProvider.currentPluginKind == KotlinPluginKind.FIR_PLUGIN
}
/**
@@ -28,11 +37,11 @@ fun isK2Plugin(): Boolean {
fun suppressAndroidPlugin(): Boolean = isK2Plugin()
fun isFe10Plugin(): Boolean {
return currentPluginKind == KotlinPluginKind.FE10_PLUGIN
return KotlinPluginKindProvider.currentPluginKind == KotlinPluginKind.FE10_PLUGIN
}
fun checkKotlinPluginKind(expectedPluginKind: KotlinPluginKind) {
val pluginKind = currentPluginKind
val pluginKind = KotlinPluginKindProvider.currentPluginKind
check(pluginKind == expectedPluginKind) {
"Invalid Kotlin plugin detected: $pluginKind, but $expectedPluginKind was expected"
}

View File

@@ -0,0 +1,27 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.base.plugin
import com.intellij.diagnostic.VMOptions
object KotlinPluginKindSwitcher {
@JvmStatic
fun canPluginBeSwitchedByVmOptions(): Boolean {
return VMOptions.canWriteOptions()
}
@JvmStatic
fun getPluginKindByVmOptions(): KotlinPluginKind {
val isK2Enabled = VMOptions.readOption(USE_K2_VM_OPTION_PREFIX, /*effective=*/ false).toBoolean()
return if (isK2Enabled) KotlinPluginKind.FIR_PLUGIN else KotlinPluginKind.FE10_PLUGIN
}
@JvmStatic
fun setPluginKindByVmOptions(newPluginKind: KotlinPluginKind) {
val isK2Enabled = newPluginKind == KotlinPluginKind.FIR_PLUGIN
VMOptions.setOption(USE_K2_VM_OPTION_PREFIX, isK2Enabled.toString())
}
const val USE_K2_VM_OPTION_NAME: String = "idea.kotlin.plugin.use.k2"
private const val USE_K2_VM_OPTION_PREFIX: String = "-D${USE_K2_VM_OPTION_NAME}="
}