From 31a2eab8a0fb9432dd62cd4f7f703655b0bca58b Mon Sep 17 00:00:00 2001 From: Ilia Permiashkin Date: Wed, 15 Oct 2025 10:32:13 +0300 Subject: [PATCH] [grazie] IJPL-212788 Use DSLConfigurable#disposable to prevent memory leak GitOrigin-RevId: e83de4beb57588a2e4360a526074c5b727045ad4 --- .../ui/proofreading/ProofreadConfigurable.kt | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/proofreading/ProofreadConfigurable.kt b/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/proofreading/ProofreadConfigurable.kt index 7119dd0939be..eda1e5f2b566 100644 --- a/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/proofreading/ProofreadConfigurable.kt +++ b/plugins/grazie/src/main/kotlin/com/intellij/grazie/ide/ui/proofreading/ProofreadConfigurable.kt @@ -44,7 +44,7 @@ class ProofreadConfigurable : BoundSearchableConfigurable( OptionsBundle.message("configurable.group.proofread.settings.display.name"), "reference.settings.ide.settings.proofreading", ID -), Disposable { +) { companion object { const val ID: String = "proofread" } @@ -140,28 +140,28 @@ class ProofreadConfigurable : BoundSearchableConfigurable( label(GrazieBundle.message("grazie.status.bar.widget.language.processing.label.text")) icon(GrazieIcons.Stroke.GrazieCloudProcessing) - .visibleIf(GrazieListeningComponentPredicate(this@ProofreadConfigurable) { isLoggedIn }) + .visibleIf(GrazieListeningComponentPredicate(disposable!!) { isLoggedIn }) label(GrazieBundle.message("grazie.status.bar.widget.cloud.processing.label.text")) - .visibleIf(GrazieListeningComponentPredicate(this@ProofreadConfigurable) { isLoggedIn }) + .visibleIf(GrazieListeningComponentPredicate(disposable!!) { isLoggedIn }) link(GrazieBundle.message("grazie.status.bar.widget.disable.cloud.link.text")) { GrazieConfig.update { state -> state.copy(explicitlyChosenProcessing = Processing.Local) } - }.visibleIf(GrazieListeningComponentPredicate(this@ProofreadConfigurable) { isLoggedIn }) + }.visibleIf(GrazieListeningComponentPredicate(disposable!!) { isLoggedIn }) link(GrazieBundle.message("grazie.settings.logout.action.text")) { GrazieScope.coroutineScope().launch { GrazieLoginManager.getInstance().logOutFromCloud() } - }.visibleIf(GrazieListeningComponentPredicate(this@ProofreadConfigurable) { + }.visibleIf(GrazieListeningComponentPredicate(disposable!!) { isLoggedIn && !GrazieCloudConnector.hasAdditionalConnectors() }) icon(GrazieIcons.Stroke.Grazie) - .visibleIf(GrazieListeningComponentPredicate(this@ProofreadConfigurable) { !isLoggedIn }) + .visibleIf(GrazieListeningComponentPredicate(disposable!!) { !isLoggedIn }) label(GrazieBundle.message("grazie.status.bar.widget.local.processing.label.text")) - .visibleIf(GrazieListeningComponentPredicate(this@ProofreadConfigurable) { !isLoggedIn }) + .visibleIf(GrazieListeningComponentPredicate(disposable!!) { !isLoggedIn }) link(GrazieBundle.message("grazie.status.bar.widget.enable.cloud.link.text")) { if (!GrazieCloudConnector.askUserConsentForCloud()) return@link logger.debug { "Connect to Grazie Cloud button started from settings" } if (!GrazieCloudConnector.isAuthorized() && !GrazieCloudConnector.connect(project)) return@link GrazieConfig.update { state -> state.copy(explicitlyChosenProcessing = Processing.Cloud) } - }.visibleIf(GrazieListeningComponentPredicate(this@ProofreadConfigurable) { !isLoggedIn }) + }.visibleIf(GrazieListeningComponentPredicate(disposable!!) { !isLoggedIn }) } row { val commentText = GrazieBundle.message("grazie.status.bar.widget.cloud.comment.text") @@ -217,8 +217,6 @@ class ProofreadConfigurable : BoundSearchableConfigurable( } } - override fun dispose(): Unit = Unit - private class GrazieListeningComponentPredicate(private val disposable: Disposable, private val invoker: () -> Boolean) : ComponentPredicate() { override fun addListener(listener: (Boolean) -> Unit) { GrazieConfig.subscribe(disposable) { listener(invoke()) }