Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[WIP] Add support for Auto Edits in JetBrains #7373

Draft
wants to merge 2 commits into
base: tr/autoedit-agent-support
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.util.TextRange
import com.intellij.util.concurrency.annotations.RequiresReadLock
import com.sourcegraph.cody.agent.CodyAgentService
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteCompletionResult
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteResult
import com.sourcegraph.cody.agent.protocol_generated.CompletionItemParams
import com.sourcegraph.cody.statusbar.CodyStatusService.Companion.resetApplication
Expand Down Expand Up @@ -60,7 +61,8 @@ class CodyInlineCompletionProvider : InlineCompletionProvider {
val completions =
fetchCompletions(project, editor, triggerKind, cancellationToken, lookupString)
.completeOnTimeout(null, 1, TimeUnit.SECONDS)
.get() ?: return InlineCompletionSuggestion.Empty
.get()
.let { it as? AutocompleteCompletionResult } ?: return InlineCompletionSuggestion.Empty

return InlineCompletionSingleSuggestion.build {
completions.items
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ class CodyInlineCompletionProvider : InlineCompletionProvider {
val completions =
fetchCompletions(project, editor, triggerKind, cancellationToken, lookupString)
.completeOnTimeout(null, 1, TimeUnit.SECONDS)
.get() ?: return InlineCompletionSuggestion.Empty
.get()
.let { it as? AutocompleteCompletionResult } ?: return InlineCompletionSuggestion.Empty

return InlineCompletionSingleSuggestion.build {
completions.items
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ private constructor(
capabilities =
ClientCapabilities(
authentication = ClientCapabilities.AuthenticationEnum.Enabled,
autoEdit = ClientCapabilities. AutoEditEnum.Enabled,
autoEditInlineDiff = ClientCapabilities.AutoEditInlineDiffEnum.None,
autoEditAsideDiff = ClientCapabilities.AutoEditAsideDiffEnum.Image,
edit = ClientCapabilities.EditEnum.Enabled,
editWorkspace = ClientCapabilities.EditWorkspaceEnum.Enabled,
codeLenses = ClientCapabilities.CodeLensesEnum.Enabled,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import com.intellij.util.concurrency.annotations.RequiresEdt
import com.sourcegraph.cody.CodyToolWindowContent
import com.sourcegraph.cody.Icons
import com.sourcegraph.cody.agent.CodyAgentService
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteCompletionResult
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteEditResult
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteItem
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteResult
import com.sourcegraph.cody.agent.protocol_generated.CompletionItemParams
Expand Down Expand Up @@ -205,26 +207,32 @@ class CodyAutocompleteManager {
if (triggerKind == InlineCompletionTriggerKind.INVOKE) logger.warn("autocomplete canceled")
return
}
val inlayModel = editor.inlayModel
if (result.items.isEmpty()) {
// NOTE(olafur): it would be nice to give the user a visual hint when this happens.
// We don't do anything now because it's unclear what would be the most idiomatic
// IntelliJ API to use.
if (triggerKind == InlineCompletionTriggerKind.INVOKE)
logger.warn("autocomplete returned empty suggestions")
return
}
ApplicationManager.getApplication().invokeLater {
if (cancellationToken.isCancelled) {
return@invokeLater

if (result is AutocompleteCompletionResult) {
val inlayModel = editor.inlayModel
if (result.items.isEmpty()) {
// NOTE(olafur): it would be nice to give the user a visual hint when this happens.
// We don't do anything now because it's unclear what would be the most idiomatic
// IntelliJ API to use.
if (triggerKind == InlineCompletionTriggerKind.INVOKE)
logger.warn("autocomplete returned empty suggestions")
return
}
cancellationToken.dispose()
clearAutocompleteSuggestions(editor)
// 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)
ApplicationManager.getApplication().invokeLater {
if (cancellationToken.isCancelled) {
return@invokeLater
}
cancellationToken.dispose()
clearAutocompleteSuggestions(editor)
// 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)
}
}
} else if (result is AutocompleteEditResult) {
// todo: handle auto edits
println(result)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import com.sourcegraph.cody.agent.protocol.ErrorCodeUtils.toErrorCode
import com.sourcegraph.cody.agent.protocol.RateLimitError.Companion.toRateLimitError
import com.sourcegraph.cody.agent.protocol_extensions.Position
import com.sourcegraph.cody.agent.protocol_extensions.ProtocolTextDocumentExt
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteCompletionResult
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteEditResult
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteParams
import com.sourcegraph.cody.agent.protocol_generated.AutocompleteResult
import com.sourcegraph.cody.agent.protocol_generated.Ignore_TestResult
Expand Down Expand Up @@ -101,12 +103,15 @@ object Utils {
!UpgradeToCodyProNotification.isFirstRLEOnAutomaticAutocompletionsShown) {
handleError(project, error)
}
} else if (result != null && result.items.isNotEmpty()) {
} else if (result != null &&
((result is AutocompleteCompletionResult && result.items.isNotEmpty()) ||
result is AutocompleteEditResult)) {
UpgradeToCodyProNotification.isFirstRLEOnAutomaticAutocompletionsShown = false
UpgradeToCodyProNotification.autocompleteRateLimitError.set(null)
successCallback(result)
resultOuter.complete(result)
}

null
}
.exceptionally { error: Throwable? ->
Expand Down
Loading