From 7984d5211c4ba2c23dda3ea7cf1744175b922229 Mon Sep 17 00:00:00 2001 From: Carl-Robert Linnupuu Date: Wed, 19 Mar 2025 01:59:23 +0000 Subject: [PATCH] fix: temp disable code completions when next edits is active --- .../ee/carlrobert/codegpt/CodeGPTKeys.java | 6 ----- .../CodeCompletionEventListener.kt | 1 + .../DebouncedCodeCompletionProvider.kt | 22 ++++++++++++------- .../codecompletions/edit/GrpcClientService.kt | 13 +++++------ .../codegpt/predictions/PredictionService.kt | 2 -- .../psistructure/KotlinFileAnalyzer.kt | 2 +- .../kotlin/testsupport/IntegrationTest.kt | 1 - 7 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java b/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java index 0ccdb3c2..eb663d2c 100644 --- a/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java +++ b/src/main/java/ee/carlrobert/codegpt/CodeGPTKeys.java @@ -3,25 +3,19 @@ package ee.carlrobert.codegpt; import com.intellij.openapi.util.Key; import ee.carlrobert.codegpt.predictions.CodeSuggestionDiffViewer; import ee.carlrobert.llm.client.codegpt.CodeGPTUserDetails; -import okhttp3.Call; public class CodeGPTKeys { - public static final Key PREVIOUS_INLAY_TEXT = - Key.create("codegpt.editor.inlay.prev-value"); public static final Key IMAGE_ATTACHMENT_FILE_PATH = Key.create("codegpt.imageAttachmentFilePath"); public static final Key CODEGPT_USER_DETAILS = Key.create("codegpt.userDetails"); public static final Key REMAINING_EDITOR_COMPLETION = Key.create("codegpt.editorCompletionLines"); - public static final Key PENDING_PREDICTION_CALL = - Key.create("codegpt.editorPendingPredictionCall"); public static final Key COMPLETION_IN_PROGRESS = Key.create("codegpt.completionInProgress"); public static final Key IS_PROMPT_TEXT_FIELD_DOCUMENT = Key.create("codegpt.isPromptTextFieldDocument"); public static final Key EDITOR_PREDICTION_DIFF_VIEWER = Key.create("codegpt.editorPredictionDiffViewer"); - } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.kt b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.kt index b61c0907..86c0ad91 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/CodeCompletionEventListener.kt @@ -72,6 +72,7 @@ class CodeCompletionMultiLineEventListener( ) : CodeCompletionEventListener(request.editor) { override fun handleCompleted(messageBuilder: StringBuilder) { + request.editor.project?.let { CompletionProgressNotifier.update(it, false) } runInEdt { onCompletionReceived(runWriteAction { messageBuilder.toString().formatCompletion(request) diff --git a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/DebouncedCodeCompletionProvider.kt b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/DebouncedCodeCompletionProvider.kt index f9c44708..2abf0447 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/DebouncedCodeCompletionProvider.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/DebouncedCodeCompletionProvider.kt @@ -6,6 +6,7 @@ import com.intellij.codeInsight.inline.completion.elements.InlineCompletionGrayT import com.intellij.codeInsight.inline.completion.suggestion.InlineCompletionSingleSuggestion import com.intellij.codeInsight.inline.completion.suggestion.InlineCompletionSuggestion import com.intellij.codeInsight.lookup.LookupManager +import com.intellij.notification.NotificationType import com.intellij.openapi.components.service import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.project.Project @@ -20,6 +21,7 @@ import ee.carlrobert.codegpt.settings.service.custom.CustomServicesSettings import ee.carlrobert.codegpt.settings.service.llama.LlamaSettings import ee.carlrobert.codegpt.settings.service.ollama.OllamaSettings import ee.carlrobert.codegpt.settings.service.openai.OpenAISettings +import ee.carlrobert.codegpt.ui.OverlayUtil import ee.carlrobert.codegpt.util.StringUtil.extractUntilNewline import kotlinx.coroutines.channels.ProducerScope import kotlinx.coroutines.channels.awaitClose @@ -53,9 +55,17 @@ class DebouncedCodeCompletionProvider : DebouncedInlineCompletionProvider() { get() = CodeCompletionProviderPresentation() override suspend fun getSuggestionDebounced(request: InlineCompletionRequest): InlineCompletionSuggestion { - if (GeneralSettings.getSelectedService() == ServiceType.CODEGPT - && service().state.nextEditsEnabled + val codegptSettings = service().state + if (GeneralSettings.getSelectedService() == ServiceType.CODEGPT && codegptSettings.nextEditsEnabled ) { + if (codegptSettings.codeCompletionSettings.codeCompletionsEnabled) { + codegptSettings.codeCompletionSettings.codeCompletionsEnabled = false + OverlayUtil.showNotification( + "Code completions and multi-line edits cannot be active simultaneously.", + NotificationType.WARNING + ) + } + predictNextEdit(request) return InlineCompletionSingleSuggestion.build(elements = emptyFlow()) } @@ -74,8 +84,6 @@ class DebouncedCodeCompletionProvider : DebouncedInlineCompletionProvider() { project.service().getNextEdit(request.editor) } catch (ex: Exception) { logger.error("Error communicating with server: ${ex.message}") - } finally { - CompletionProgressNotifier.update(project, false) } } @@ -110,9 +118,7 @@ class DebouncedCodeCompletionProvider : DebouncedInlineCompletionProvider() { .getCodeCompletionAsync( infillRequest, CodeCompletionMultiLineEventListener(request) { - if (it.isEmpty() && service().state.nextEditsEnabled) { - predictNextEdit(request) - } else { + if (LookupManager.getActiveLookup(request.editor) == null) { trySend(InlineCompletionGrayTextElement(it)) } } @@ -147,7 +153,7 @@ class DebouncedCodeCompletionProvider : DebouncedInlineCompletionProvider() { } override suspend fun getDebounceDelay(request: InlineCompletionRequest): Duration { - return 600.toDuration(DurationUnit.MILLISECONDS) + return 400.toDuration(DurationUnit.MILLISECONDS) } override fun isEnabled(event: InlineCompletionEvent): Boolean { diff --git a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/edit/GrpcClientService.kt b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/edit/GrpcClientService.kt index 1be5a390..0174beda 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/edit/GrpcClientService.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/codecompletions/edit/GrpcClientService.kt @@ -12,6 +12,7 @@ import com.intellij.openapi.diagnostic.thisLogger import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.jetbrains.rd.util.UUID +import ee.carlrobert.codegpt.codecompletions.CompletionProgressNotifier import ee.carlrobert.codegpt.credentials.CredentialsStore import ee.carlrobert.codegpt.credentials.CredentialsStore.CredentialKey.CodeGptApiKey import ee.carlrobert.codegpt.predictions.CodeSuggestionDiffViewer @@ -89,25 +90,21 @@ class GrpcClientService(private val project: Project) : Disposable { override fun onNext(response: NextEditResponse) { runInEdt { if (LookupManager.getActiveLookup(editor) == null) { - // TODO: Display when appropriate CodeSuggestionDiffViewer.displayInlineDiff(editor, response, isManuallyOpened) } } } override fun onError(ex: Throwable) { - if (ex is CancellationException) { + if (ex is CancellationException || + (ex is StatusRuntimeException && ex.status.code == Status.Code.CANCELLED) + ) { onCompleted() return } try { if (ex is StatusRuntimeException) { - if (ex.status.code == Status.Code.CANCELLED) { - onCompleted() - return - } - OverlayUtil.showNotification( ex.status.description ?: ex.localizedMessage, NotificationType.ERROR, @@ -119,11 +116,13 @@ class GrpcClientService(private val project: Project) : Disposable { logger.error("Something went wrong", ex) } } finally { + onCompleted() onDispose() } } override fun onCompleted() { + editor.project?.let { CompletionProgressNotifier.update(it, false) } } } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt b/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt index 5668964d..d49d957b 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/predictions/PredictionService.kt @@ -38,8 +38,6 @@ class PredictionService { project.service().getNextEdit(editor, isManuallyOpened) } catch (ex: Exception) { logger.error("Error communicating with server: ${ex.message}") - } finally { - CompletionProgressNotifier.update(project, false) } } diff --git a/src/main/kotlin/ee/carlrobert/codegpt/psistructure/KotlinFileAnalyzer.kt b/src/main/kotlin/ee/carlrobert/codegpt/psistructure/KotlinFileAnalyzer.kt index 8a0e937e..00f90452 100644 --- a/src/main/kotlin/ee/carlrobert/codegpt/psistructure/KotlinFileAnalyzer.kt +++ b/src/main/kotlin/ee/carlrobert/codegpt/psistructure/KotlinFileAnalyzer.kt @@ -262,7 +262,7 @@ class KotlinFileAnalyzer( val type = property.typeReference?.text ?: "TypeUnknown" val resolvedType = resolveType(type) val modifierList = getModifiers(property) - return FieldStructure(property.name!!, resolvedType, modifierList) + return FieldStructure(property.name ?: "", resolvedType, modifierList) } private fun analyzeFunction(function: KtFunction): MethodStructure { diff --git a/src/test/kotlin/testsupport/IntegrationTest.kt b/src/test/kotlin/testsupport/IntegrationTest.kt index 571043c6..d5ec501f 100644 --- a/src/test/kotlin/testsupport/IntegrationTest.kt +++ b/src/test/kotlin/testsupport/IntegrationTest.kt @@ -16,7 +16,6 @@ open class IntegrationTest : BasePlatformTestCase(), ExternalServiceTestMixin, S } private fun clearKeys() { - putUserData(CodeGPTKeys.PREVIOUS_INLAY_TEXT, "") putUserData(CodeGPTKeys.IMAGE_ATTACHMENT_FILE_PATH, "") }