[grazie] IJPL-213792 GrazieStatusBarWidget disposed before child disposable

Merge-request: IJ-MR-179148
Merged-by: Ilia Permiashkin <ilia.permiashkin@jetbrains.com>

GitOrigin-RevId: defcc678392798333234974e31fac77aa6e5bd68
This commit is contained in:
Ilia Permiashkin
2025-10-21 08:34:19 +00:00
committed by intellij-monorepo-bot
parent 012a4fa02a
commit ef0c6a2b8b
3 changed files with 20 additions and 8 deletions
+3
View File
@@ -905,6 +905,9 @@ com.intellij.openapi.wm.impl.content.tabActions.ContentTabActionProvider
- sf:Companion:com.intellij.openapi.wm.impl.content.tabActions.ContentTabActionProvider$Companion
- sf:EP_NAME:com.intellij.openapi.extensions.ExtensionPointName
- a:createTabActions(com.intellij.ui.content.Content):java.util.List
f:com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager
- f:updateWidget(com.intellij.openapi.wm.StatusBarWidgetFactory,kotlin.coroutines.CoroutineContext):V
- bs:updateWidget$default(com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager,com.intellij.openapi.wm.StatusBarWidgetFactory,kotlin.coroutines.CoroutineContext,I,java.lang.Object):V
f:com.intellij.openapi.wm.impl.welcomeScreen.cloneableProjects.CloneableProjectsService
- f:runCloneTask(java.nio.file.Path,com.intellij.openapi.wm.impl.welcomeScreen.cloneableProjects.CloneableProjectsService$CloneTask):V
f:com.intellij.openapi.wm.impl.welcomeScreen.cloneableProjects.CloneableProjectsService$CloneableProject
@@ -29,6 +29,7 @@ import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import javax.swing.JComponent
import kotlin.coroutines.CoroutineContext
private val LOG = logger<StatusBarWidgetsManager>()
@@ -74,7 +75,8 @@ class StatusBarWidgetsManager(
}
}
fun updateWidget(factory: StatusBarWidgetFactory) {
@JvmOverloads
fun updateWidget(factory: StatusBarWidgetFactory, coroutineContext: CoroutineContext = Dispatchers.EDT) {
if ((factory.isConfigurable && !StatusBarWidgetSettings.getInstance().isEnabled(factory)) || !factory.isAvailable(project)) {
disableWidget(factory)
return
@@ -95,7 +97,7 @@ class StatusBarWidgetsManager(
val widget = createWidget(factory, dataContext, parentScope)
widgetFactories.put(factory, widget)
widgetIdMap.put(widget.ID(), factory)
parentScope.launch(Dispatchers.EDT) {
parentScope.launch(coroutineContext) {
when (val statusBar = WindowManager.getInstance().getStatusBar(project)) {
is IdeStatusBarImpl -> statusBar.addWidget(widget, order)
null -> {
@@ -6,6 +6,9 @@ import com.intellij.grazie.GrazieConfig.State.Processing.Cloud
import com.intellij.grazie.cloud.GrazieCloudConnector
import com.intellij.grazie.ide.msg.GrazieInitializerManager
import com.intellij.grazie.ide.msg.GrazieStateLifecycle
import com.intellij.openapi.application.EDT
import com.intellij.openapi.application.ModalityState
import com.intellij.openapi.application.asContextElement
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.ProjectManager
@@ -16,10 +19,13 @@ import com.intellij.openapi.wm.StatusBarWidget
import com.intellij.openapi.wm.StatusBarWidgetFactory
import com.intellij.openapi.wm.impl.status.widget.StatusBarWidgetsManager
import com.intellij.util.application
import kotlinx.coroutines.Dispatchers
internal class GrazieStatusBarWidgetFactory : StatusBarWidgetFactory, GrazieStateLifecycle {
init { service<GrazieInitializerManager>().register(this) }
init {
service<GrazieInitializerManager>().register(this)
}
override fun getId(): String {
return widgetId
@@ -48,13 +54,14 @@ internal class GrazieStatusBarWidgetFactory : StatusBarWidgetFactory, GrazieStat
}
override fun update(prevState: GrazieConfig.State, newState: GrazieConfig.State) {
application.invokeLater {
if (newState.explicitlyChosenProcessing != prevState.explicitlyChosenProcessing && prevState.explicitlyChosenProcessing != null) {
if (newState.explicitlyChosenProcessing == prevState.explicitlyChosenProcessing) return
application.invokeLater(
{
ProjectManager.getInstance().openProjects.forEach { project ->
project.service<StatusBarWidgetsManager>().updateWidget(this)
project.service<StatusBarWidgetsManager>()
.updateWidget(this, Dispatchers.EDT + ModalityState.any().asContextElement())
}
}
}
}, ModalityState.any())
}
companion object {