[Plugin API] Provide a way to register disposable callbacks in CompilerPluginRegistrar

^KT-59555 Fixed
This commit is contained in:
Dmitriy Novozhilov
2024-03-11 11:19:00 +02:00
committed by Space Team
parent 5afb2c5e4b
commit a552238874
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.compiler.plugin
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Disposer
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
@@ -25,9 +26,24 @@ abstract class CompilerPluginRegistrar {
val registeredExtensions: Map<ProjectExtensionDescriptor<*>, List<Any>>
get() = _registeredExtensions
private val _disposables = mutableListOf<PluginDisposable>()
val disposables: List<PluginDisposable>
get() = _disposables
fun <T : Any> ProjectExtensionDescriptor<T>.registerExtension(extension: T) {
_registeredExtensions.getOrPut(this, ::mutableListOf).add(extension)
}
/**
* Passed [disposable] will be called at the end of compilation
*/
fun registerDisposable(disposable: PluginDisposable) {
_disposables += disposable
}
}
fun interface PluginDisposable {
fun dispose()
}
abstract val supportsK2: Boolean
@@ -47,6 +63,9 @@ fun CompilerPluginRegistrar.ExtensionStorage.registerInProject(
}
}
}
for (disposable in disposables) {
Disposer.register(project) { disposable.dispose() }
}
}
private fun ProjectExtensionDescriptor<Any>.registerExtensionUnsafe(project: Project, extension: Any) {