[python] PY-79486: Fix race in PyProjectAutoImportService, remove useless action PyProjectTomlSyncAction

`dispose` might be called before `projectId` set.

Project might be rebuilt using blue refresh icon in any toml file

GitOrigin-RevId: 7ed180ec071960ca6b24ef3b2791cad6b1c4d316
This commit is contained in:
Ilya.Kazakevich
2025-12-25 22:20:01 +00:00
committed by intellij-monorepo-bot
parent ec05d50276
commit 994ed3ec13
3 changed files with 8 additions and 37 deletions
@@ -12,9 +12,6 @@
<registryKey defaultValue="false" description="Load project structure from pyproject.toml" key="intellij.python.pyproject.model" restartRequired="true"/>
<postStartupActivity implementation="com.intellij.python.pyproject.model.internal.platformBridge.PyProjectSyncActivity"/>
</extensions>
<actions>
<action class="com.intellij.python.pyproject.model.internal.platformBridge.PyProjectTomlSyncAction" id="PyProjectTomlSyncAction"/>
</actions>
<extensionPoints>
<extensionPoint qualifiedName="com.intellij.python.pyproject.model.tool" interface="com.intellij.python.pyproject.model.spi.Tool"
dynamic="true"/>
@@ -16,26 +16,26 @@ internal class PyProjectAutoImportService(private val project: Project) : Dispos
}
@Volatile
private lateinit var projectId: ExternalSystemProjectId
private var projectId: ExternalSystemProjectId? = null
suspend fun start() {
val tracker = getTracker()
val projectAware = PyExternalSystemProjectAware.create(project)
projectId = projectAware.projectId
val projectId = projectAware.projectId
this.projectId = projectId
tracker.register(projectAware)
tracker.activate(projectId)
refresh()
}
fun refresh() {
val tracker = getTracker()
tracker.markDirty(projectId)
tracker.scheduleProjectRefresh()
}
override fun dispose() {
getTracker().remove(projectId)
projectId?.let {
getTracker().remove(it)
projectId = null
}
}
@@ -1,26 +0,0 @@
package com.intellij.python.pyproject.model.internal.platformBridge
import com.intellij.openapi.actionSystem.ActionUpdateThread
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.components.service
import com.intellij.python.pyproject.model.internal.autoImportBridge.PyProjectAutoImportService
import com.intellij.python.pyproject.model.internal.projectModelEnabled
internal class PyProjectTomlSyncAction : AnAction() {
override fun actionPerformed(e: AnActionEvent) {
val project = e.project ?: return
if (!projectModelEnabled || project.isDefault) { // Service doesn't support default project
return
}
project.service<PyProjectAutoImportService>().refresh()
}
override fun update(e: AnActionEvent) {
val project = e.project
e.presentation.isEnabledAndVisible = project != null && projectModelEnabled && !project.isDefault
}
override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
}