fix: temp disable code completions when next edits is active

This commit is contained in:
Carl-Robert Linnupuu 2025-03-19 01:59:23 +00:00
parent e4f6a5234a
commit 7984d5211c
7 changed files with 22 additions and 25 deletions

View file

@ -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<String> PREVIOUS_INLAY_TEXT =
Key.create("codegpt.editor.inlay.prev-value");
public static final Key<String> IMAGE_ATTACHMENT_FILE_PATH =
Key.create("codegpt.imageAttachmentFilePath");
public static final Key<CodeGPTUserDetails> CODEGPT_USER_DETAILS =
Key.create("codegpt.userDetails");
public static final Key<String> REMAINING_EDITOR_COMPLETION =
Key.create("codegpt.editorCompletionLines");
public static final Key<Call> PENDING_PREDICTION_CALL =
Key.create("codegpt.editorPendingPredictionCall");
public static final Key<Boolean> COMPLETION_IN_PROGRESS =
Key.create("codegpt.completionInProgress");
public static final Key<Boolean> IS_PROMPT_TEXT_FIELD_DOCUMENT =
Key.create("codegpt.isPromptTextFieldDocument");
public static final Key<CodeSuggestionDiffViewer> EDITOR_PREDICTION_DIFF_VIEWER =
Key.create("codegpt.editorPredictionDiffViewer");
}

View file

@ -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)

View file

@ -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<CodeGPTServiceSettings>().state.nextEditsEnabled
val codegptSettings = service<CodeGPTServiceSettings>().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<GrpcClientService>().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<CodeGPTServiceSettings>().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 {

View file

@ -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) }
}
}

View file

@ -38,8 +38,6 @@ class PredictionService {
project.service<GrpcClientService>().getNextEdit(editor, isManuallyOpened)
} catch (ex: Exception) {
logger.error("Error communicating with server: ${ex.message}")
} finally {
CompletionProgressNotifier.update(project, false)
}
}

View file

@ -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 {

View file

@ -16,7 +16,6 @@ open class IntegrationTest : BasePlatformTestCase(), ExternalServiceTestMixin, S
}
private fun clearKeys() {
putUserData(CodeGPTKeys.PREVIOUS_INLAY_TEXT, "")
putUserData(CodeGPTKeys.IMAGE_ATTACHMENT_FILE_PATH, "")
}