From bcf1e6fcf834008c1c472cb99a169a22c941997b Mon Sep 17 00:00:00 2001 From: Carl-Robert Linnupuu Date: Thu, 20 Mar 2025 12:18:54 +0000 Subject: [PATCH] fix: long running task on EDT --- .../ee/carlrobert/codegpt/ReferencedFile.java | 21 ++------------ .../textarea/header/UserInputHeaderPanel.kt | 27 ++++++++++-------- .../carlrobert/codegpt/util/file/FileUtil.kt | 28 +++++++++++++++++-- 3 files changed, 44 insertions(+), 32 deletions(-) diff --git a/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java b/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java index 213c1df3..71806c99 100644 --- a/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java +++ b/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java @@ -3,6 +3,7 @@ package ee.carlrobert.codegpt; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; +import ee.carlrobert.codegpt.util.file.FileUtil; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -17,7 +18,7 @@ public record ReferencedFile(String fileName, String filePath, String fileConten return new ReferencedFile( file.getName(), file.getPath(), - readContent(file) + FileUtil.readContent(file) ); } @@ -35,23 +36,7 @@ public record ReferencedFile(String fileName, String filePath, String fileConten if (document != null && documentManager.isDocumentUnsaved(document)) { return document.getText(); } - return readContent(virtualFile); - } - - private static String readContent(File file) { - try { - return new String(Files.readAllBytes(Paths.get(file.getPath()))); - } catch (IOException e) { - throw new RuntimeException("Failed to read file content", e); - } - } - - private static String readContent(VirtualFile virtualFile) { - try { - return VfsUtilCore.loadText(virtualFile); - } catch (IOException e) { - throw new RuntimeException("Failed to read virtual file content", e); - } + return FileUtil.readContent(virtualFile); } public String getFileExtension() { diff --git a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/UserInputHeaderPanel.kt b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/UserInputHeaderPanel.kt index e8b3daa1..9b2b8978 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/UserInputHeaderPanel.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/ui/textarea/header/UserInputHeaderPanel.kt @@ -10,7 +10,6 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.ui.JBMenuItem import com.intellij.openapi.ui.JBPopupMenu import com.intellij.openapi.vfs.VirtualFile -import com.intellij.openapi.vfs.readText import com.intellij.ui.components.JBLabel import com.intellij.util.IconUtil import com.intellij.util.ui.JBUI @@ -24,6 +23,10 @@ import ee.carlrobert.codegpt.ui.textarea.header.tag.* import ee.carlrobert.codegpt.ui.textarea.suggestion.SuggestionsPopupManager import ee.carlrobert.codegpt.util.EditorUtil import ee.carlrobert.codegpt.util.EditorUtil.getSelectedEditor +import ee.carlrobert.codegpt.util.file.FileUtil +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.awt.* import java.awt.event.ActionListener import javax.swing.JButton @@ -168,17 +171,19 @@ class UserInputHeaderPanel( } private fun updateReferencedFilesTokens(tags: Set) { - val referencedFileContents = tags.asSequence() - .filter { it.selected } - .mapNotNull { tag -> - when (tag) { - is FileTagDetails -> tag.virtualFile.readText() - is EditorTagDetails -> tag.virtualFile.readText() - else -> null + CoroutineScope(Dispatchers.IO).launch { + val referencedFileContents = tags.asSequence() + .filter { it.selected } + .mapNotNull { tag -> + when (tag) { + is FileTagDetails -> FileUtil.readContent(tag.virtualFile) + is EditorTagDetails -> FileUtil.readContent(tag.virtualFile) + else -> null + } } - } - .toList() - totalTokensPanel.updateReferencedFilesTokens(referencedFileContents) + .toList() + totalTokensPanel.updateReferencedFilesTokens(referencedFileContents) + } } private fun initializeEventListeners() { diff --git a/src/main/kotlin/ee/carlrobert/codegpt/util/file/FileUtil.kt b/src/main/kotlin/ee/carlrobert/codegpt/util/file/FileUtil.kt index e8c8c640..0e81bd26 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/util/file/FileUtil.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/util/file/FileUtil.kt @@ -4,11 +4,12 @@ import com.fasterxml.jackson.core.JsonProcessingException import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.ObjectMapper import com.intellij.openapi.components.service -import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ProjectFileIndex import com.intellij.openapi.util.io.FileUtil.createDirectory +import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFileFilter import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings.getLlamaModelsPath @@ -29,7 +30,28 @@ import java.util.* import java.util.regex.Pattern object FileUtil { - private val LOG = Logger.getInstance(FileUtil::class.java) + + private val logger = thisLogger() + + @JvmStatic + fun readContent(file: File): String { + try { + return String(Files.readAllBytes(Paths.get(file.path))) + } catch (e: IOException) { + logger.error("Failed to read file content", e) + return "" + } + } + + @JvmStatic + fun readContent(virtualFile: VirtualFile): String { + try { + return VfsUtilCore.loadText(virtualFile) + } catch (e: IOException) { + logger.error("Failed to read virtual file content", e) + return "" + } + } @JvmStatic fun createFile(directoryPath: Any, fileName: String?, fileContent: String?): File { @@ -120,7 +142,7 @@ object FileUtil { object : TypeReference>() { }) } catch (e: JsonProcessingException) { - LOG.error("Unable to extract file extension", e) + logger.error("Unable to extract file extension", e) return defaultValue }