Skip to content

Commit

Permalink
Remove redundant code
Browse files Browse the repository at this point in the history
  • Loading branch information
mkondratek committed Oct 14, 2024
1 parent 397bcec commit 2109238
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 67 deletions.
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package com.sourcegraph.cody.autocomplete

import com.github.difflib.DiffUtils
import com.github.difflib.patch.DeltaType
import com.github.difflib.patch.Patch
import com.intellij.codeInsight.hint.HintManager
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.client.ClientSessionsManager
Expand Down Expand Up @@ -44,7 +41,6 @@ import com.sourcegraph.cody.vscode.TextDocument
import com.sourcegraph.common.CodyBundle
import com.sourcegraph.common.CodyBundle.fmt
import com.sourcegraph.config.ConfigUtil.isCodyEnabled
import com.sourcegraph.config.UserLevelConfig
import com.sourcegraph.utils.CodyEditorUtil.getAllOpenEditors
import com.sourcegraph.utils.CodyEditorUtil.getLanguage
import com.sourcegraph.utils.CodyEditorUtil.getTextRange
Expand All @@ -53,7 +49,6 @@ import com.sourcegraph.utils.CodyEditorUtil.isEditorValidForAutocomplete
import com.sourcegraph.utils.CodyEditorUtil.isImplicitAutocompleteEnabledForEditor
import com.sourcegraph.utils.CodyFormatter
import java.util.concurrent.atomic.AtomicReference
import java.util.stream.Collectors

/** Responsible for triggering and clearing inline code completions (the autocomplete feature). */
@Service
Expand Down Expand Up @@ -217,7 +212,7 @@ class CodyAutocompleteManager {
// https://github.com/sourcegraph/jetbrains/issues/350
// CodyFormatter.formatStringBasedOnDocument needs to be on a write action.
WriteCommandAction.runWriteCommandAction(editor.project) {
displayAgentAutocomplete(editor, offset, result.items, inlayModel, triggerKind)
displayAgentAutocomplete(editor, offset, result.items, inlayModel)
}
}
}
Expand All @@ -234,7 +229,6 @@ class CodyAutocompleteManager {
cursorOffset: Int,
items: List<AutocompleteItem>,
inlayModel: InlayModel,
triggerKind: InlineCompletionTriggerKind,
) {
if (editor.isDisposed) {
return
Expand All @@ -243,9 +237,8 @@ class CodyAutocompleteManager {
val project = editor.project
val defaultItem = items.firstOrNull() ?: return
val range = getTextRange(editor.document, defaultItem.range)
val originalText = editor.document.getText(range)

val formattedCompletionText =
val completionText =
if (project == null ||
System.getProperty("cody.autocomplete.enableFormatting") == "false") {
defaultItem.insertText
Expand All @@ -254,48 +247,13 @@ class CodyAutocompleteManager {
defaultItem.insertText, project, editor.document, range, cursorOffset)
}

// Run Myers diff between the existing text in the document and the `insertText` that is
// returned from the agent.
// The diff algorithm returns a list of "deltas" that give us the minimal number of additions we
// need to make to the document.
val patch = diff(originalText, defaultItem.insertText)
if (!patch.deltas.all { delta -> delta.type == DeltaType.INSERT }) {
if (triggerKind == InlineCompletionTriggerKind.INVOKE ||
UserLevelConfig.isVerboseLoggingEnabled()) {
logger.warn("Skipping autocomplete with non-insert deltas: $patch")
}
// Skip completions that need to delete or change characters in the existing document. We only
// want completions to add changes to the document.
return
}

project?.let {
CodyAgentService.withAgent(project) { agent ->
agent.server.completionSuggested(CompletionItemParams(defaultItem.id))
}
}

defaultItem.insertText = formattedCompletionText
val cursorOffsetInOriginalText = cursorOffset - range.startOffset

if (cursorOffsetInOriginalText > originalText.length) {
logger.warn(
"""Skipping autocomplete because cursor position is outside of text range:
|Original text: `$originalText`
|Completion range: $range
|Cursor offset: $cursorOffset
|Cursor offset in completion text: $cursorOffsetInOriginalText
"""
.trimMargin())
return
}

val originalTextBeforeCursor = originalText.substring(0, cursorOffsetInOriginalText)
val originalTextAfterCursor = originalText.substring(cursorOffsetInOriginalText)
val completionText =
formattedCompletionText
.removePrefix(originalTextBeforeCursor)
.removeSuffix(originalTextAfterCursor)
defaultItem.insertText = completionText
if (completionText.trim().isBlank()) return

val lineBreaks = listOf("\r\n", "\n", "\r")
Expand Down Expand Up @@ -405,12 +363,5 @@ class CodyAutocompleteManager {
@JvmStatic
val instance: CodyAutocompleteManager
get() = service()

@JvmStatic
fun diff(a: String, b: String): Patch<String> =
DiffUtils.diff(characterList(a), characterList(b))

private fun characterList(value: String): List<String> =
value.chars().mapToObj { c -> c.toChar().toString() }.collect(Collectors.toList())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -70,26 +70,15 @@ class CodyInlineCompletionProvider : InlineCompletionProvider {
WriteCommandAction.runWriteCommandAction<InlineCompletionGrayTextElement?>(
editor.project) {
val range = getTextRange(editor.document, it.range)
val originalText = editor.document.getText(range)
val cursorOffsetInOriginalText = request.endOffset - range.startOffset

val formattedCompletionText: String =
val completionText: String =
if (System.getProperty("cody.autocomplete.enableFormatting") == "false") {
it.insertText
} else {
CodyFormatter.formatStringBasedOnDocument(
it.insertText, project, editor.document, range, request.endOffset)
}

// ...

val originalTextBeforeCursor =
originalText.substring(0, cursorOffsetInOriginalText)
val originalTextAfterCursor = originalText.substring(cursorOffsetInOriginalText)
val completionText =
formattedCompletionText
.removePrefix(originalTextBeforeCursor)
.removeSuffix(originalTextAfterCursor)
if (completionText.trim().isBlank()) {
null
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import com.intellij.openapi.editor.Editor
import com.sourcegraph.cody.agent.CodyAgentService
import com.sourcegraph.cody.agent.protocol.AutocompleteItem
import com.sourcegraph.cody.autocomplete.CodyAutocompleteManager
import com.sourcegraph.cody.vscode.InlineCompletionTriggerKind
import com.sourcegraph.utils.CodyEditorUtil
import java.util.concurrent.ConcurrentHashMap

Expand Down Expand Up @@ -43,8 +42,7 @@ class CycleCodyAutocompleteActionHandler(private val cycleDirection: CycleDirect
ApplicationManager.getApplication().invokeLater {
CodyAutocompleteManager.instance.let {
it.clearAutocompleteSuggestions(editor)
it.displayAgentAutocomplete(
editor, caret.offset, newItems, editor.inlayModel, InlineCompletionTriggerKind.INVOKE)
it.displayAgentAutocomplete(editor, caret.offset, newItems, editor.inlayModel)
}
autocompleteItemsCache[cacheKey] = newItems
}
Expand Down

0 comments on commit 2109238

Please sign in to comment.