From 2cb73393d1f808e3ccac5c883c5ddb363db62148 Mon Sep 17 00:00:00 2001 From: Will Lo Date: Fri, 24 Jan 2025 14:37:23 -0800 Subject: [PATCH 1/3] fix updating workspace index blocks UI thread --- .../services/cwc/controller/ChatController.kt | 12 ++++-------- .../amazonq/project/ProjectContextController.kt | 9 +++++++-- .../amazonq/project/ProjectContextEditorListener.kt | 5 ++++- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt index fc5450e247f..11dded10222 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt @@ -32,7 +32,6 @@ import kotlinx.coroutines.job import kotlinx.coroutines.withContext import migration.software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.amazon.awssdk.services.codewhispererstreaming.model.UserIntent -import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info import software.aws.toolkits.core.utils.warn @@ -153,13 +152,10 @@ class ChatController private constructor( } else { sendOpenSettingsMessage(message.tabId) } - } else if (CodeWhispererSettings.getInstance().isProjectContextEnabled()) { - if (ProjectContextController.getInstance(context.project).getProjectContextIndexComplete()) { - val projectContextController = ProjectContextController.getInstance(context.project) - queryResult = projectContextController.queryChat(prompt, timeout = CHAT_IMPLICIT_PROJECT_CONTEXT_TIMEOUT) - } else { - logger.debug { "skipping implicit workspace context as index is not ready" } - } + } else if (CodeWhispererSettings.getInstance().isProjectContextEnabled() && + ProjectContextController.getInstance(context.project).getProjectContextIndexComplete() + ) { + queryResult = ProjectContextController.getInstance(context.project).queryChat(prompt, timeout = CHAT_IMPLICIT_PROJECT_CONTEXT_TIMEOUT) } handleChat( diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextController.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextController.kt index 9864acd5e26..dabe282f2fd 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextController.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextController.kt @@ -13,12 +13,14 @@ import com.intellij.openapi.vfs.newvfs.BulkFileListener import com.intellij.openapi.vfs.newvfs.events.VFileCreateEvent import com.intellij.openapi.vfs.newvfs.events.VFileDeleteEvent import com.intellij.openapi.vfs.newvfs.events.VFileEvent +import com.intellij.util.concurrency.annotations.RequiresBackgroundThread import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.launch import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn +import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread import java.util.concurrent.TimeoutException @Service(Service.Level.PROJECT) @@ -38,8 +40,10 @@ class ProjectContextController(private val project: Project, private val cs: Cor val createdFiles = events.filterIsInstance().mapNotNull { it.file?.path } val deletedFiles = events.filterIsInstance().map { it.file.path } - updateIndex(createdFiles, IndexUpdateMode.ADD) - updateIndex(deletedFiles, IndexUpdateMode.REMOVE) + pluginAwareExecuteOnPooledThread { + updateIndex(createdFiles, IndexUpdateMode.ADD) + updateIndex(deletedFiles, IndexUpdateMode.REMOVE) + } } } ) @@ -68,6 +72,7 @@ class ProjectContextController(private val project: Project, private val cs: Cor emptyList() } + @RequiresBackgroundThread fun updateIndex(filePaths: List, mode: IndexUpdateMode) { try { return projectContextProvider.updateIndex(filePaths, mode) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextEditorListener.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextEditorListener.kt index 3b887dbb6a1..ce194da9614 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextEditorListener.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/project/ProjectContextEditorListener.kt @@ -6,6 +6,7 @@ package software.aws.toolkits.jetbrains.services.amazonq.project import com.intellij.openapi.fileEditor.FileDocumentManager import com.intellij.openapi.fileEditor.FileEditorManagerEvent import com.intellij.openapi.fileEditor.FileEditorManagerListener +import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread class ProjectContextEditorListener : FileEditorManagerListener { override fun selectionChanged(event: FileEditorManagerEvent) { @@ -19,6 +20,8 @@ class ProjectContextEditorListener : FileEditorManagerListener { } val project = event.manager.project - ProjectContextController.getInstance(project).updateIndex(listOf(oldFile.path), IndexUpdateMode.UPDATE) + pluginAwareExecuteOnPooledThread { + ProjectContextController.getInstance(project).updateIndex(listOf(oldFile.path), IndexUpdateMode.UPDATE) + } } } From 5bfb615c0f904a896542cfac82ebb3cf21c0ad0c Mon Sep 17 00:00:00 2001 From: Will Lo Date: Fri, 24 Jan 2025 14:43:29 -0800 Subject: [PATCH 2/3] revert changes added accidentally --- .../services/cwc/controller/ChatController.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt index 11dded10222..fc5450e247f 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt @@ -32,6 +32,7 @@ import kotlinx.coroutines.job import kotlinx.coroutines.withContext import migration.software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.amazon.awssdk.services.codewhispererstreaming.model.UserIntent +import software.aws.toolkits.core.utils.debug import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.info import software.aws.toolkits.core.utils.warn @@ -152,10 +153,13 @@ class ChatController private constructor( } else { sendOpenSettingsMessage(message.tabId) } - } else if (CodeWhispererSettings.getInstance().isProjectContextEnabled() && - ProjectContextController.getInstance(context.project).getProjectContextIndexComplete() - ) { - queryResult = ProjectContextController.getInstance(context.project).queryChat(prompt, timeout = CHAT_IMPLICIT_PROJECT_CONTEXT_TIMEOUT) + } else if (CodeWhispererSettings.getInstance().isProjectContextEnabled()) { + if (ProjectContextController.getInstance(context.project).getProjectContextIndexComplete()) { + val projectContextController = ProjectContextController.getInstance(context.project) + queryResult = projectContextController.queryChat(prompt, timeout = CHAT_IMPLICIT_PROJECT_CONTEXT_TIMEOUT) + } else { + logger.debug { "skipping implicit workspace context as index is not ready" } + } } handleChat( From 1709e2ee2e37636e7dd5741e85e990d7b50b751f Mon Sep 17 00:00:00 2001 From: Will Lo Date: Fri, 24 Jan 2025 14:45:40 -0800 Subject: [PATCH 3/3] changelog --- .../bugfix-970b5a61-5646-4f40-b9fa-65c69ceda73f.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .changes/next-release/bugfix-970b5a61-5646-4f40-b9fa-65c69ceda73f.json diff --git a/.changes/next-release/bugfix-970b5a61-5646-4f40-b9fa-65c69ceda73f.json b/.changes/next-release/bugfix-970b5a61-5646-4f40-b9fa-65c69ceda73f.json new file mode 100644 index 00000000000..0bb05ffe978 --- /dev/null +++ b/.changes/next-release/bugfix-970b5a61-5646-4f40-b9fa-65c69ceda73f.json @@ -0,0 +1,4 @@ +{ + "type" : "bugfix", + "description" : "Fix UI freeze caused by updating workspace index on non background context" +} \ No newline at end of file