Add Compose compiler plugin to IDE plugin dependencies
This allows IDE to use the Compose compiler plugin from the KT compiler.
In addition, this commit reimplements the Compose compiler plugin
registrar based on the new API `CompilerPluginRegistrar` because K2 IDE
supports putting a compiler plugin to the allow-list only when the
registrar is a child class of `CompilerPluginRegistrar`.
KTIJ-30164
diff --git a/build.gradle.kts b/build.gradle.kts
index 90e37a6..0aa47baf 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -299,6 +299,8 @@
":plugins:parcelize:parcelize-compiler:parcelize.k2",
":plugins:parcelize:parcelize-runtime",
+ ":plugins:compose-compiler-plugin:compiler-hosted",
+
":kotlin-sam-with-receiver-compiler-plugin.cli",
":kotlin-sam-with-receiver-compiler-plugin.common",
":kotlin-sam-with-receiver-compiler-plugin.k1",
@@ -400,6 +402,7 @@
extra["compilerArtifactsForIde"] = listOfNotNull(
":prepare:ide-plugin-dependencies:android-extensions-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:allopen-compiler-plugin-for-ide",
+ ":prepare:ide-plugin-dependencies:compose-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:scripting-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:incremental-compilation-impl-tests-for-ide",
":prepare:ide-plugin-dependencies:js-ir-runtime-for-ide",
diff --git a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt
index a5395c9..4644f2a 100644
--- a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt
+++ b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractCompilerTest.kt
@@ -22,26 +22,21 @@
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import com.intellij.openapi.util.io.FileUtil
-import java.io.File
-import java.net.URLClassLoader
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import org.jetbrains.kotlin.cli.jvm.config.configureJdkClasspathRoots
import org.jetbrains.kotlin.codegen.GeneratedClassLoader
-import org.jetbrains.kotlin.config.AnalysisFlag
-import org.jetbrains.kotlin.config.AnalysisFlags
-import org.jetbrains.kotlin.config.ApiVersion
-import org.jetbrains.kotlin.config.CompilerConfiguration
-import org.jetbrains.kotlin.config.JVMConfigurationKeys
-import org.jetbrains.kotlin.config.LanguageVersion
-import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl
-import org.jetbrains.kotlin.config.languageVersionSettings
+import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
+import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest
+import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.junit.After
import org.junit.BeforeClass
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
+import java.io.File
+import java.net.URLClassLoader
@RunWith(Parameterized::class)
abstract class AbstractCompilerTest(val useFir: Boolean) {
@@ -91,6 +86,7 @@
protected open fun CompilerConfiguration.updateConfiguration() {}
+ @OptIn(ExperimentalCompilerApi::class)
private fun createCompilerFacade(
additionalPaths: List<File> = listOf(),
forcedFirSetting: Boolean? = null,
@@ -127,7 +123,11 @@
configureJdkClasspathRoots()
},
registerExtensions = registerExtensions ?: { configuration ->
- ComposePluginRegistrar.registerCommonExtensions(this)
+ registerExtensionsForTest(this, configuration) {
+ with(ComposePluginRegistrar.Companion) {
+ registerCommonExtensions()
+ }
+ }
IrGenerationExtension.registerExtension(
this,
ComposePluginRegistrar.createComposeIrExtension(configuration)
diff --git a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
index 3540874..9e27dd9 100644
--- a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
+++ b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractLiveLiteralTransformTests.kt
@@ -23,6 +23,8 @@
import org.intellij.lang.annotations.Language
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.common.extensions.IrPluginContext
+import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
+import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
import org.junit.Assert.assertEquals
@@ -30,6 +32,7 @@
abstract class AbstractLiveLiteralTransformTests(
useFir: Boolean
) : AbstractIrTransformTest(useFir) {
+ @OptIn(ExperimentalCompilerApi::class)
private fun computeKeys(files: List<SourceFile>): List<String> {
var builtKeys = mutableSetOf<String>()
compileToIr(
@@ -42,7 +45,11 @@
ComposeConfiguration.LIVE_LITERALS_V2_ENABLED_KEY
)
- ComposePluginRegistrar.registerCommonExtensions(this)
+ registerExtensionsForTest(this, configuration) {
+ with(ComposePluginRegistrar.Companion) {
+ registerCommonExtensions()
+ }
+ }
IrGenerationExtension.registerExtension(
this,
object : IrGenerationExtension {
diff --git a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt
index 7189caa..ec9f461 100644
--- a/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt
+++ b/plugins/compose/compiler-hosted/integration-tests/src/jvmTest/kotlin/androidx/compose/compiler/plugins/kotlin/AbstractMetricsTransformTest.kt
@@ -19,9 +19,12 @@
import androidx.compose.compiler.plugins.kotlin.facade.KotlinCompilerFacade
import androidx.compose.compiler.plugins.kotlin.facade.SourceFile
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
+import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
+import org.jetbrains.kotlin.compiler.plugin.registerExtensionsForTest
import org.junit.Assert.assertEquals
abstract class AbstractMetricsTransformTest(useFir: Boolean) : AbstractIrTransformTest(useFir) {
+ @OptIn(ExperimentalCompilerApi::class)
private fun verifyMetrics(
source: String,
verify: ModuleMetrics.() -> Unit
@@ -31,7 +34,11 @@
compileToIr(
files,
registerExtensions = { configuration ->
- ComposePluginRegistrar.registerCommonExtensions(this)
+ registerExtensionsForTest(this, configuration) {
+ with(ComposePluginRegistrar.Companion) {
+ registerCommonExtensions()
+ }
+ }
extension =
ComposePluginRegistrar.createComposeIrExtension(configuration) { inferencer ->
ModuleMetricsImpl(KotlinCompilerFacade.TEST_MODULE_NAME) { type ->
diff --git a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
index 965cce3..b2bc161 100644
--- a/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
+++ b/plugins/compose/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
@@ -23,8 +23,6 @@
import androidx.compose.compiler.plugins.kotlin.k2.ComposeFirExtensionRegistrar
import androidx.compose.compiler.plugins.kotlin.lower.ClassStabilityFieldSerializationPlugin
import androidx.compose.compiler.plugins.kotlin.lower.hiddenfromobjc.AddHiddenFromObjCSerializationPlugin
-import com.intellij.mock.MockProject
-import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity
import org.jetbrains.kotlin.compiler.plugin.*
@@ -526,27 +524,21 @@
}
}
-@Suppress("DEPRECATION") // CompilerPluginRegistrar does not expose project (or disposable) causing
- // memory leaks, see: https://youtrack.jetbrains.com/issue/KT-60952
@OptIn(ExperimentalCompilerApi::class)
-class ComposePluginRegistrar : org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar {
+class ComposePluginRegistrar : CompilerPluginRegistrar() {
override val supportsK2: Boolean
get() = true
- override fun registerProjectComponents(
- project: MockProject,
- configuration: CompilerConfiguration
- ) {
+ override fun ExtensionStorage.registerExtensions(configuration: CompilerConfiguration) {
if (checkCompilerVersion(configuration)) {
val usesK2 = configuration.languageVersionSettings.languageVersion.usesK2
val descriptorSerializerContext =
if (usesK2) null
else ComposeDescriptorSerializerContext()
- registerCommonExtensions(project, descriptorSerializerContext)
+ registerCommonExtensions(descriptorSerializerContext)
IrGenerationExtension.registerExtension(
- project,
createComposeIrExtension(
configuration,
descriptorSerializerContext
@@ -554,7 +546,7 @@
)
if (!usesK2) {
- registerNativeExtensions(project, descriptorSerializerContext!!)
+ registerNativeExtensions(descriptorSerializerContext!!)
}
}
}
@@ -582,43 +574,35 @@
return true
}
- fun registerCommonExtensions(
- project: Project,
+ fun ExtensionStorage.registerCommonExtensions(
composeDescriptorSerializerContext: ComposeDescriptorSerializerContext? = null
) {
StorageComponentContainerContributor.registerExtension(
- project,
ComposableCallChecker()
)
StorageComponentContainerContributor.registerExtension(
- project,
ComposableDeclarationChecker()
)
StorageComponentContainerContributor.registerExtension(
- project,
ComposableTargetChecker()
)
- DiagnosticSuppressor.registerExtension(project, ComposeDiagnosticSuppressor())
+ DiagnosticSuppressor.registerExtension(ComposeDiagnosticSuppressor())
@Suppress("OPT_IN_USAGE_ERROR")
TypeResolutionInterceptor.registerExtension(
- project,
ComposeTypeResolutionInterceptorExtension()
)
DescriptorSerializerPlugin.registerExtension(
- project,
ClassStabilityFieldSerializationPlugin(
composeDescriptorSerializerContext?.classStabilityInferredCollection
)
)
- FirExtensionRegistrarAdapter.registerExtension(project, ComposeFirExtensionRegistrar())
+ FirExtensionRegistrarAdapter.registerExtension(ComposeFirExtensionRegistrar())
}
- fun registerNativeExtensions(
- project: Project,
+ fun ExtensionStorage.registerNativeExtensions(
composeDescriptorSerializerContext: ComposeDescriptorSerializerContext
) {
DescriptorSerializerPlugin.registerExtension(
- project,
AddHiddenFromObjCSerializationPlugin(
composeDescriptorSerializerContext.hideFromObjCDeclarationsSet
)
@@ -737,4 +721,4 @@
)
}
}
-}
+}
\ No newline at end of file
diff --git a/plugins/compose/compiler-hosted/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar b/plugins/compose/compiler-hosted/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
similarity index 100%
rename from plugins/compose/compiler-hosted/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.ComponentRegistrar
rename to plugins/compose/compiler-hosted/src/main/resources/META-INF/services/org.jetbrains.kotlin.compiler.plugin.CompilerPluginRegistrar
diff --git a/prepare/ide-plugin-dependencies/compose-compiler-plugin-for-ide/build.gradle.kts b/prepare/ide-plugin-dependencies/compose-compiler-plugin-for-ide/build.gradle.kts
new file mode 100644
index 0000000..bf0ebda
--- /dev/null
+++ b/prepare/ide-plugin-dependencies/compose-compiler-plugin-for-ide/build.gradle.kts
@@ -0,0 +1,7 @@
+plugins {
+ kotlin("jvm")
+}
+
+publishJarsForIde(
+ listOf(":plugins:compose-compiler-plugin:compiler-hosted")
+)
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 7ff8ed1..787dd16 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -397,6 +397,7 @@
":prepare:ide-plugin-dependencies:allopen-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:scripting-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:allopen-compiler-plugin-tests-for-ide",
+ ":prepare:ide-plugin-dependencies:compose-compiler-plugin-for-ide",
":prepare:ide-plugin-dependencies:incremental-compilation-impl-tests-for-ide",
":prepare:ide-plugin-dependencies:js-ir-runtime-for-ide",
":prepare:ide-plugin-dependencies:kotlin-build-common-tests-for-ide",