From 37212bcde9260dc8605a50f58bca16350a102af9 Mon Sep 17 00:00:00 2001 From: InSyncWithFoo Date: Tue, 15 Oct 2024 01:38:19 +0000 Subject: [PATCH] Ensure `somethingIsWrong()` is only invoked on EDT --- .../insyncwithfoo/ryecharm/Application.kt | 23 +++++++++++++++++++ .../ryecharm/IntentionActions.kt | 4 ---- .../insyncwithfoo/ryecharm/Notifications.kt | 8 +++++-- .../injections/EditScriptMetadataFragment.kt | 4 ++-- .../ryecharm/ruff/formatting/RuffFormatter.kt | 3 ++- .../ryecharm/uv/generator/VenvCreator.kt | 3 ++- 6 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/insyncwithfoo/ryecharm/Application.kt diff --git a/src/main/kotlin/insyncwithfoo/ryecharm/Application.kt b/src/main/kotlin/insyncwithfoo/ryecharm/Application.kt new file mode 100644 index 0000000..d136f97 --- /dev/null +++ b/src/main/kotlin/insyncwithfoo/ryecharm/Application.kt @@ -0,0 +1,23 @@ +package insyncwithfoo.ryecharm + +import com.intellij.openapi.application.Application +import com.intellij.openapi.application.ApplicationManager +import com.intellij.openapi.editor.EditorFactory +import com.intellij.openapi.fileEditor.FileDocumentManager + + +internal val application: Application + get() = ApplicationManager.getApplication() + + +internal val fileDocumentManager: FileDocumentManager + get() = FileDocumentManager.getInstance() + + +internal val editorFactory: EditorFactory + get() = EditorFactory.getInstance() + + +internal fun invokeLater(action: () -> Unit) { + application.invokeLater(action) +} diff --git a/src/main/kotlin/insyncwithfoo/ryecharm/IntentionActions.kt b/src/main/kotlin/insyncwithfoo/ryecharm/IntentionActions.kt index dd95566..1c2d2b4 100644 --- a/src/main/kotlin/insyncwithfoo/ryecharm/IntentionActions.kt +++ b/src/main/kotlin/insyncwithfoo/ryecharm/IntentionActions.kt @@ -8,10 +8,6 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile -internal val fileDocumentManager: FileDocumentManager - get() = FileDocumentManager.getInstance() - - internal fun FileDocumentManager.saveAllDocumentsAsIs() { unsavedDocuments.forEach { saveDocumentAsIs(it) } } diff --git a/src/main/kotlin/insyncwithfoo/ryecharm/Notifications.kt b/src/main/kotlin/insyncwithfoo/ryecharm/Notifications.kt index 3c7c1ad..20fd7e8 100644 --- a/src/main/kotlin/insyncwithfoo/ryecharm/Notifications.kt +++ b/src/main/kotlin/insyncwithfoo/ryecharm/Notifications.kt @@ -17,12 +17,16 @@ private const val INFORMATION_GROUP_ID = "insyncwithfoo.ryecharm.information" private val ICON = RyeIcons.TINY_16 +private val notificationGroupManager: NotificationGroupManager + get() = NotificationGroupManager.getInstance() + + internal val errorNotificationGroup: ErrorNotificationGroup - get() = NotificationGroupManager.getInstance().getNotificationGroup(ERROR_GROUP_ID) + get() = notificationGroupManager.getNotificationGroup(ERROR_GROUP_ID) internal val informationNotificationGroup: InformationNotificationGroup - get() = NotificationGroupManager.getInstance().getNotificationGroup(INFORMATION_GROUP_ID) + get() = notificationGroupManager.getNotificationGroup(INFORMATION_GROUP_ID) private fun Notification.prettify() = this.apply { diff --git a/src/main/kotlin/insyncwithfoo/ryecharm/common/injections/EditScriptMetadataFragment.kt b/src/main/kotlin/insyncwithfoo/ryecharm/common/injections/EditScriptMetadataFragment.kt index 1888ce9..456bf6e 100644 --- a/src/main/kotlin/insyncwithfoo/ryecharm/common/injections/EditScriptMetadataFragment.kt +++ b/src/main/kotlin/insyncwithfoo/ryecharm/common/injections/EditScriptMetadataFragment.kt @@ -20,6 +20,7 @@ import com.intellij.psi.util.startOffset import com.intellij.testFramework.LightVirtualFile import com.jetbrains.python.psi.PyFile import insyncwithfoo.ryecharm.RootDisposable +import insyncwithfoo.ryecharm.editorFactory import insyncwithfoo.ryecharm.fileEditorManager import insyncwithfoo.ryecharm.message import insyncwithfoo.ryecharm.paste @@ -73,9 +74,8 @@ private val PyFile.injectedPEP723Fragment: TomlFile? private fun Editor.addReleaseListener(project: Project, listener: (Document) -> Unit) { val parentDisposable = RootDisposable.getInstance(project) - val factory = EditorFactory.getInstance() - factory.addEditorFactoryListener(object : EditorFactoryListener { + editorFactory.addEditorFactoryListener(object : EditorFactoryListener { override fun editorReleased(event: EditorFactoryEvent) { if (event.editor === this@addReleaseListener) { listener(event.editor.document) diff --git a/src/main/kotlin/insyncwithfoo/ryecharm/ruff/formatting/RuffFormatter.kt b/src/main/kotlin/insyncwithfoo/ryecharm/ruff/formatting/RuffFormatter.kt index fd45984..80308a5 100644 --- a/src/main/kotlin/insyncwithfoo/ryecharm/ruff/formatting/RuffFormatter.kt +++ b/src/main/kotlin/insyncwithfoo/ryecharm/ruff/formatting/RuffFormatter.kt @@ -17,6 +17,7 @@ import com.jetbrains.python.black.BlackFormattingService import insyncwithfoo.ryecharm.Command import insyncwithfoo.ryecharm.configurations.ruff.RuffTimeouts import insyncwithfoo.ryecharm.configurations.ruff.ruffConfigurations +import insyncwithfoo.ryecharm.editorFactory import insyncwithfoo.ryecharm.errorNotificationGroup import insyncwithfoo.ryecharm.isSupportedByRuff import insyncwithfoo.ryecharm.message @@ -126,7 +127,7 @@ internal class RuffFormatter : AsyncDocumentFormattingService() { } private fun String.getOneBasedRange(offsetRange: TextRange): OneBasedRange { - val document = EditorFactory.getInstance().createDocument(this) + val document = editorFactory.createDocument(this) return document.getOneBasedRange(offsetRange) } diff --git a/src/main/kotlin/insyncwithfoo/ryecharm/uv/generator/VenvCreator.kt b/src/main/kotlin/insyncwithfoo/ryecharm/uv/generator/VenvCreator.kt index b9190e4..1eb1ab6 100644 --- a/src/main/kotlin/insyncwithfoo/ryecharm/uv/generator/VenvCreator.kt +++ b/src/main/kotlin/insyncwithfoo/ryecharm/uv/generator/VenvCreator.kt @@ -17,6 +17,7 @@ import insyncwithfoo.ryecharm.configurations.HasTimeouts import insyncwithfoo.ryecharm.configurations.changeGlobalUVConfigurations import insyncwithfoo.ryecharm.configurations.uv.UVTimeouts import insyncwithfoo.ryecharm.configurations.uv.globalUVConfigurations +import insyncwithfoo.ryecharm.invokeLater import insyncwithfoo.ryecharm.isSuccessful import insyncwithfoo.ryecharm.message import insyncwithfoo.ryecharm.somethingIsWrong @@ -126,7 +127,7 @@ internal class VenvCreator(private val uvExecutable: Path, private val projectPa val output = command.run(timeout) // FIXME: Run this properly when (val newVenvName = extractNewVenvName(output)) { - null -> somethingIsWrong(message("messages.uvReportedError.body")) + null -> invokeLater { somethingIsWrong(message("messages.uvReportedError.body")) } else -> venvDirectoryName = newVenvName } }