diff --git a/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java b/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java index 4a0d2db8..df766b47 100644 --- a/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java +++ b/src/main/java/ee/carlrobert/codegpt/ReferencedFile.java @@ -1,6 +1,9 @@ package ee.carlrobert.codegpt; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import ee.carlrobert.codegpt.util.file.FileUtil; import java.io.File; @@ -46,7 +49,8 @@ public record ReferencedFile(String fileName, String filePath, String fileConten } var documentManager = FileDocumentManager.getInstance(); - var document = documentManager.getDocument(virtualFile); + var document = ApplicationManager.getApplication() + .runReadAction((Computable) () -> documentManager.getDocument(virtualFile)); if (document != null && documentManager.isDocumentUnsaved(document)) { return document.getText(); } diff --git a/src/main/java/ee/carlrobert/codegpt/actions/IncludeFilesInContextAction.java b/src/main/java/ee/carlrobert/codegpt/actions/IncludeFilesInContextAction.java index a0cbc8c5..757a856e 100644 --- a/src/main/java/ee/carlrobert/codegpt/actions/IncludeFilesInContextAction.java +++ b/src/main/java/ee/carlrobert/codegpt/actions/IncludeFilesInContextAction.java @@ -173,7 +173,8 @@ public class IncludeFilesInContextAction extends AnAction { return encodingManager.countTokens( new String(file.contentsToByteArray(), file.getCharset())); } catch (IOException e) { - throw new RuntimeException("Failed to read file content", e); + LOG.error("Failed to read file {} content", file.getName()); + return 0; } }) .sum(); diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java index 93950dae..21c9c946 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/ChatToolWindowTabPanel.java @@ -368,31 +368,36 @@ public class ChatToolWindowTabPanel implements Disposable { } private Unit handleSubmit(String text) { - final Set psiStructure; - if (psiStructureRepository.getStructureState().getValue() - instanceof PsiStructureState.Content content) { - psiStructure = content.getElements(); - } else { - psiStructure = new HashSet<>(); - } + var application = ApplicationManager.getApplication(); + application.executeOnPooledThread(() -> { + final Set psiStructure; + if (psiStructureRepository.getStructureState().getValue() + instanceof PsiStructureState.Content content) { + psiStructure = content.getElements(); + } else { + psiStructure = new HashSet<>(); + } - final var appliedTags = tagManager.getTags().stream() - .filter(TagDetails::getSelected) - .collect(Collectors.toList()); + final var appliedTags = tagManager.getTags().stream() + .filter(TagDetails::getSelected) + .collect(Collectors.toList()); - var messageBuilder = new MessageBuilder(project, text).withInlays(appliedTags); + var messageBuilder = new MessageBuilder(project, text).withInlays(appliedTags); - List referencedFiles = getReferencedFiles(appliedTags); - if (!referencedFiles.isEmpty()) { - messageBuilder.withReferencedFiles(referencedFiles); - } + List referencedFiles = getReferencedFiles(appliedTags); + if (!referencedFiles.isEmpty()) { + messageBuilder.withReferencedFiles(referencedFiles); + } - String attachedImagePath = CodeGPTKeys.IMAGE_ATTACHMENT_FILE_PATH.get(project); - if (attachedImagePath != null) { - messageBuilder.withImage(attachedImagePath); - } + String attachedImagePath = CodeGPTKeys.IMAGE_ATTACHMENT_FILE_PATH.get(project); + if (attachedImagePath != null) { + messageBuilder.withImage(attachedImagePath); + } - sendMessage(messageBuilder.build(), ConversationType.DEFAULT, psiStructure); + application.invokeLater(() -> { + sendMessage(messageBuilder.build(), ConversationType.DEFAULT, psiStructure); + }); + }); return Unit.INSTANCE; } diff --git a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/structure/data/PsiStructureRepository.kt b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/structure/data/PsiStructureRepository.kt index 4cd59169..41bd23c9 100644 --- a/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/structure/data/PsiStructureRepository.kt +++ b/src/main/java/ee/carlrobert/codegpt/toolwindow/chat/structure/data/PsiStructureRepository.kt @@ -3,6 +3,7 @@ package ee.carlrobert.codegpt.toolwindow.chat.structure.data import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ReadAction +import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.vfs.AsyncFileListener @@ -13,20 +14,7 @@ import com.intellij.psi.PsiManager import com.intellij.util.io.await import ee.carlrobert.codegpt.psistructure.PsiStructureProvider import ee.carlrobert.codegpt.settings.configuration.ConfigurationStateListener -import ee.carlrobert.codegpt.ui.textarea.header.tag.CurrentGitChangesTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.DocumentationTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.EditorSelectionTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.EditorTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.EmptyTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.FileTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.FolderTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.GitCommitTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.PersonaTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.SelectionTagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.TagDetails -import ee.carlrobert.codegpt.ui.textarea.header.tag.TagManager -import ee.carlrobert.codegpt.ui.textarea.header.tag.TagManagerListener -import ee.carlrobert.codegpt.ui.textarea.header.tag.WebTagDetails +import ee.carlrobert.codegpt.ui.textarea.header.tag.* import ee.carlrobert.codegpt.util.coroutines.CoroutineDispatchers import ee.carlrobert.codegpt.util.coroutines.DisposableCoroutineScope import kotlinx.coroutines.Job @@ -46,6 +34,10 @@ class PsiStructureRepository( private val dispatchers: CoroutineDispatchers, ) { + companion object { + private val logger = thisLogger() + } + private val mutex = Mutex() private val coroutineScope = DisposableCoroutineScope(dispatchers.io()) @@ -159,7 +151,12 @@ class PsiStructureRepository( tagsVirtualFiles .mapNotNull { virtualFile -> coroutineContext.ensureActive() - PsiManager.getInstance(project).findFile(virtualFile) + try { + PsiManager.getInstance(project).findFile(virtualFile) + } catch (exc: Exception) { + logger.error("Failed to find file {}", virtualFile.name) + null + } } } .inSmartMode(project) diff --git a/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt b/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt index d49d957b..f7080ff7 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt @@ -12,6 +12,7 @@ import ee.carlrobert.codegpt.CodeGPTKeys import ee.carlrobert.codegpt.codecompletions.CompletionProgressNotifier import ee.carlrobert.codegpt.codecompletions.edit.GrpcClientService import ee.carlrobert.codegpt.util.EditorDiffUtil.createDiffRequest +import kotlin.coroutines.cancellation.CancellationException @Service class PredictionService { @@ -36,6 +37,8 @@ class PredictionService { try { CompletionProgressNotifier.update(project, true) project.service().getNextEdit(editor, isManuallyOpened) + } catch (e: CancellationException) { + // ignore } catch (ex: Exception) { logger.error("Error communicating with server: ${ex.message}") } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt index 69917a36..17fb7910 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/settings/service/ollama/OllamaSettingsForm.kt @@ -75,7 +75,6 @@ class OllamaSettingsForm { getCredential(OllamaApikey) } } - refreshModels(settings.model) } fun getForm(): JPanel = FormBuilder.createFormBuilder() diff --git a/src/main/kotlin/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/AutoApplyAction.kt b/src/main/kotlin/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/AutoApplyAction.kt index 617e0969..f6260ea1 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/AutoApplyAction.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/toolwindow/chat/editor/actions/AutoApplyAction.kt @@ -108,7 +108,9 @@ class AutoApplyAction( ) } OverlayUtil.showNotification(errorMessage, NotificationType.ERROR) - resetState(mainEditor, actionsPanel) + runInEdt { + resetState(mainEditor, actionsPanel) + } }) ) } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/util/GitUtil.kt b/src/main/kotlin/ee/carlrobert/codegpt/util/GitUtil.kt index be4d1db1..55e472e8 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/util/GitUtil.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/util/GitUtil.kt @@ -30,13 +30,16 @@ object GitUtil { ?: repositoryManager.repositories.firstOrNull() } - @JvmStatic fun getCurrentChanges(project: Project): String? { return getProjectRepository(project)?.let { repository -> try { val repoRootPath = repository.root.toNioPath() val changes = ChangeListManager.getInstance(project).allChanges + .filter { change -> + change.virtualFile?.let { !it.fileType.isBinary } ?: false + } .sortedBy { it.virtualFile?.timeStamp } + val patches = IdeaTextPatchBuilder.buildPatch( project, changes, repoRootPath, false, true )