diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/DocumentCodeActionHandler.kt b/src/main/kotlin/com/sourcegraph/cody/edit/DocumentCodeActionHandler.kt deleted file mode 100644 index b3b48a1081..0000000000 --- a/src/main/kotlin/com/sourcegraph/cody/edit/DocumentCodeActionHandler.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.sourcegraph.cody.edit - -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.DataContext -import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.editor.Caret -import com.intellij.openapi.editor.Editor -import com.intellij.openapi.editor.actionSystem.EditorAction -import com.intellij.openapi.editor.actionSystem.EditorActionHandler -import com.intellij.openapi.project.DumbAware -import com.sourcegraph.cody.autocomplete.action.CodyAction -import com.sourcegraph.cody.config.CodyApplicationSettings -import com.sourcegraph.config.ConfigUtil -import com.sourcegraph.utils.CodyEditorUtil - -class DocumentCodeAction : EditorAction(DocumentCodeActionHandler()), CodyAction, DumbAware { - override fun update(e: AnActionEvent) { - super.update(e) - - e.presentation.isVisible = - ConfigUtil.isFeatureFlagEnabled("cody.feature.inline-edits") || - CodyApplicationSettings.instance.isInlineEditionEnabled - } -} - -class DocumentCodeActionHandler : EditorActionHandler() { - private val logger = Logger.getInstance(DocumentCodeActionHandler::class.java) - - override fun isEnabledForCaret(editor: Editor, caret: Caret, dataContext: DataContext?): Boolean { - return CodyEditorUtil.isEditorValidForAutocomplete(editor) - } - - override fun doExecute(editor: Editor, where: Caret?, dataContext: DataContext?) { - val project = editor.project - if (project == null) { - logger.warn("No project found, cannot run DocumentCodeActionHandler::startDocumentCode") - } else { - FixupService.getInstance(project).startDocumentCode(editor) - } - } -} diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/DocumentCodeSession.kt b/src/main/kotlin/com/sourcegraph/cody/edit/DocumentCodeSession.kt deleted file mode 100644 index cc3d88a4a5..0000000000 --- a/src/main/kotlin/com/sourcegraph/cody/edit/DocumentCodeSession.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.sourcegraph.cody.edit - -import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.editor.Document -import com.intellij.openapi.editor.Editor -import com.intellij.openapi.project.Project -import com.sourcegraph.cody.agent.CodyAgent -import com.sourcegraph.cody.agent.protocol.EditTask -import java.util.concurrent.CompletableFuture - -class DocumentCodeSession( - controller: FixupService, - editor: Editor, - project: Project, - document: Document -) : FixupSession(controller, editor, project, document) { - private val logger = Logger.getInstance(DocumentCodeSession::class.java) - - override fun makeEditingRequest(agent: CodyAgent): CompletableFuture { - return agent.server.commandsDocument() - } - - override fun retry() { - // TODO: The actual prompt we sent is displayed as ghost text in the text input field, in VS - // Code. - // E.g. "Write a brief documentation comment for the selected code " - // We need to send the prompt along with the lenses, so that the client can display it. - EditCommandPrompt(controller, editor, "Edit instructions and Retry").displayPromptUI() - } - - override fun diff() { - // TODO: Use DiffManager and bring up a diff of the changed region. - // You can see it in action now by clicking the green gutter to the left of Cody changes. - logger.warn("Code Lenses: Show Diff") - } - - override fun dispose() {} -} diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/EditCodeActionHandler.kt b/src/main/kotlin/com/sourcegraph/cody/edit/EditCodeActionHandler.kt deleted file mode 100644 index bb9f0ea51e..0000000000 --- a/src/main/kotlin/com/sourcegraph/cody/edit/EditCodeActionHandler.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.sourcegraph.cody.edit - -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.DataContext -import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.editor.Caret -import com.intellij.openapi.editor.Editor -import com.intellij.openapi.editor.actionSystem.EditorAction -import com.intellij.openapi.editor.actionSystem.EditorActionHandler -import com.intellij.openapi.project.DumbAware -import com.sourcegraph.cody.autocomplete.action.CodyAction -import com.sourcegraph.cody.config.CodyApplicationSettings -import com.sourcegraph.config.ConfigUtil -import com.sourcegraph.utils.CodyEditorUtil - -class EditCodeAction : EditorAction(EditCodeActionHandler()), CodyAction, DumbAware { - override fun update(e: AnActionEvent) { - super.update(e) - - e.presentation.isVisible = - ConfigUtil.isFeatureFlagEnabled("cody.feature.inline-edits") || - CodyApplicationSettings.instance.isInlineEditionEnabled - } -} - -class EditCodeActionHandler : EditorActionHandler() { - private val logger = Logger.getInstance(EditCodeActionHandler::class.java) - - override fun isEnabledForCaret(editor: Editor, caret: Caret, dataContext: DataContext?): Boolean { - return CodyEditorUtil.isEditorValidForAutocomplete(editor) - } - - override fun doExecute(editor: Editor, where: Caret?, dataContext: DataContext?) { - val fixupService = editor.project?.getService(FixupService::class.java) - if (fixupService == null) { - logger.warn("FixupService not found") - } else { - fixupService.startCodeEdit(editor) - } - } -} diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/EditCommandPrompt.kt b/src/main/kotlin/com/sourcegraph/cody/edit/EditCommandPrompt.kt index 79124f78c7..58b4a72a2c 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/EditCommandPrompt.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/EditCommandPrompt.kt @@ -12,6 +12,7 @@ import com.intellij.ui.components.fields.ExpandableTextField import com.intellij.util.concurrency.annotations.RequiresEdt import com.sourcegraph.cody.agent.protocol.ModelUsage import com.sourcegraph.cody.chat.ui.LlmDropdown +import com.sourcegraph.cody.edit.sessions.EditCodeSession import java.awt.BorderLayout import java.awt.Dimension import java.awt.Graphics @@ -191,7 +192,7 @@ class EditCommandPrompt(val controller: FixupService, val editor: Editor, val di return } controller.addSession( - EditSession(controller, editor, project, editor.document, text, llmDropdown.item)) + EditCodeSession(controller, editor, project, editor.document, text, llmDropdown.item)) } } diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/FixupService.kt b/src/main/kotlin/com/sourcegraph/cody/edit/FixupService.kt index 8d1cb39293..42e7ee3152 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/FixupService.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/FixupService.kt @@ -7,6 +7,8 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project import com.sourcegraph.cody.agent.protocol.EditTask +import com.sourcegraph.cody.edit.sessions.DocumentCodeSession +import com.sourcegraph.cody.edit.sessions.FixupSession import com.sourcegraph.config.ConfigUtil.isCodyEnabled import com.sourcegraph.utils.CodyEditorUtil diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/FixupUndoableAction.kt b/src/main/kotlin/com/sourcegraph/cody/edit/FixupUndoableAction.kt index 6d8d0258b0..00cdf154e0 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/FixupUndoableAction.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/FixupUndoableAction.kt @@ -10,6 +10,7 @@ import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.RangeMarker import com.intellij.openapi.util.TextRange import com.sourcegraph.cody.agent.protocol.TextEdit +import com.sourcegraph.cody.edit.sessions.FixupSession abstract class FixupUndoableAction( val session: FixupSession, diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/actions/DocumentCodeAction.kt b/src/main/kotlin/com/sourcegraph/cody/edit/actions/DocumentCodeAction.kt new file mode 100644 index 0000000000..0c5185ddc7 --- /dev/null +++ b/src/main/kotlin/com/sourcegraph/cody/edit/actions/DocumentCodeAction.kt @@ -0,0 +1,9 @@ +package com.sourcegraph.cody.edit.actions + +import com.intellij.openapi.project.DumbAware +import com.sourcegraph.cody.autocomplete.action.CodyAction + +class DocumentCodeAction : + EditCommandAction({ editor, fixupService -> fixupService.startDocumentCode(editor) }), + CodyAction, + DumbAware diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCodeAction.kt b/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCodeAction.kt new file mode 100644 index 0000000000..a978221ed7 --- /dev/null +++ b/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCodeAction.kt @@ -0,0 +1,9 @@ +package com.sourcegraph.cody.edit.actions + +import com.intellij.openapi.project.DumbAware +import com.sourcegraph.cody.autocomplete.action.CodyAction + +class EditCodeAction : + EditCommandAction({ editor, fixupService -> fixupService.startCodeEdit(editor) }), + CodyAction, + DumbAware diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCommandAction.kt b/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCommandAction.kt new file mode 100644 index 0000000000..4d46080218 --- /dev/null +++ b/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCommandAction.kt @@ -0,0 +1,21 @@ +package com.sourcegraph.cody.edit.actions + +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.editor.actionSystem.EditorAction +import com.intellij.openapi.project.DumbAware +import com.sourcegraph.cody.autocomplete.action.CodyAction +import com.sourcegraph.cody.config.CodyApplicationSettings +import com.sourcegraph.cody.edit.FixupService +import com.sourcegraph.config.ConfigUtil + +open class EditCommandAction(runAction: (Editor, FixupService) -> Unit) : + EditorAction(EditCommandActionHandler(runAction)), CodyAction, DumbAware { + override fun update(e: AnActionEvent) { + super.update(e) + + e.presentation.isVisible = + ConfigUtil.isFeatureFlagEnabled("cody.feature.inline-edits") || + CodyApplicationSettings.instance.isInlineEditionEnabled + } +} diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCommandActionHandler.kt b/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCommandActionHandler.kt new file mode 100644 index 0000000000..c6ca8314d8 --- /dev/null +++ b/src/main/kotlin/com/sourcegraph/cody/edit/actions/EditCommandActionHandler.kt @@ -0,0 +1,27 @@ +package com.sourcegraph.cody.edit.actions + +import com.intellij.openapi.actionSystem.DataContext +import com.intellij.openapi.diagnostic.Logger +import com.intellij.openapi.editor.Caret +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.editor.actionSystem.EditorActionHandler +import com.sourcegraph.cody.edit.FixupService +import com.sourcegraph.utils.CodyEditorUtil + +open class EditCommandActionHandler(val runAction: (Editor, FixupService) -> Unit) : + EditorActionHandler() { + private val logger = Logger.getInstance(EditCommandActionHandler::class.java) + + override fun isEnabledForCaret(editor: Editor, caret: Caret, dataContext: DataContext?): Boolean { + return CodyEditorUtil.isEditorValidForAutocomplete(editor) + } + + override fun doExecute(editor: Editor, where: Caret?, dataContext: DataContext?) { + val project = editor.project + if (project == null) { + logger.warn("No project found, cannot run FixupService action for ${this.javaClass.name}") + } else { + runAction(editor, FixupService.getInstance(project)) + } + } +} diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/sessions/DocumentCodeSession.kt b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/DocumentCodeSession.kt new file mode 100644 index 0000000000..780db95238 --- /dev/null +++ b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/DocumentCodeSession.kt @@ -0,0 +1,20 @@ +package com.sourcegraph.cody.edit.sessions + +import com.intellij.openapi.editor.Document +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import com.sourcegraph.cody.agent.CodyAgent +import com.sourcegraph.cody.agent.protocol.EditTask +import com.sourcegraph.cody.edit.FixupService +import java.util.concurrent.CompletableFuture + +class DocumentCodeSession( + controller: FixupService, + editor: Editor, + project: Project, + document: Document +) : FixupSession(controller, editor, project, document) { + override fun makeEditingRequest(agent: CodyAgent): CompletableFuture { + return agent.server.commandsDocument() + } +} diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/EditSession.kt b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/EditCodeSession.kt similarity index 62% rename from src/main/kotlin/com/sourcegraph/cody/edit/EditSession.kt rename to src/main/kotlin/com/sourcegraph/cody/edit/sessions/EditCodeSession.kt index c2555158cb..290e0e655a 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/EditSession.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/EditCodeSession.kt @@ -1,6 +1,5 @@ -package com.sourcegraph.cody.edit +package com.sourcegraph.cody.edit.sessions -import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project @@ -8,6 +7,7 @@ import com.sourcegraph.cody.agent.CodyAgent import com.sourcegraph.cody.agent.protocol.ChatModelsResponse import com.sourcegraph.cody.agent.protocol.EditTask import com.sourcegraph.cody.agent.protocol.InlineEditParams +import com.sourcegraph.cody.edit.FixupService import java.util.concurrent.CompletableFuture /** @@ -15,7 +15,7 @@ import java.util.concurrent.CompletableFuture * * @param instructions The user's instructions for fixing up the code. */ -class EditSession( +class EditCodeSession( controller: FixupService, editor: Editor, project: Project, @@ -23,21 +23,8 @@ class EditSession( val instructions: String, private val chatModelProvider: ChatModelsResponse.ChatModelProvider, ) : FixupSession(controller, editor, project, document) { - private val logger = Logger.getInstance(EditSession::class.java) - override fun makeEditingRequest(agent: CodyAgent): CompletableFuture { val params = InlineEditParams(instructions, chatModelProvider.model) return agent.server.commandsEdit(params) } - - override fun dispose() {} - - override fun diff() {} - - override fun retry() { - // TODO: The actual prompt is displayed as ghost text in the text input field. - // E.g. "Write a brief documentation comment for the selected code " - // We need to send the prompt along with the lenses, so that the client can display it. - EditCommandPrompt(controller, editor, "Edit instructions and Retry").displayPromptUI() - } } diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/FixupSession.kt b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/FixupSession.kt similarity index 93% rename from src/main/kotlin/com/sourcegraph/cody/edit/FixupSession.kt rename to src/main/kotlin/com/sourcegraph/cody/edit/sessions/FixupSession.kt index eec07e541f..5e0df294e4 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/FixupSession.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/sessions/FixupSession.kt @@ -1,4 +1,4 @@ -package com.sourcegraph.cody.edit +package com.sourcegraph.cody.edit.sessions import com.intellij.openapi.Disposable import com.intellij.openapi.application.ApplicationManager @@ -30,6 +30,10 @@ import com.sourcegraph.cody.agent.protocol.Range import com.sourcegraph.cody.agent.protocol.TaskIdParam import com.sourcegraph.cody.agent.protocol.TextEdit import com.sourcegraph.cody.agent.protocol.WorkspaceEditParams +import com.sourcegraph.cody.edit.EditCommandPrompt +import com.sourcegraph.cody.edit.FixupService +import com.sourcegraph.cody.edit.InsertUndoableAction +import com.sourcegraph.cody.edit.ReplaceUndoableAction import com.sourcegraph.cody.edit.widget.LensGroupFactory import com.sourcegraph.cody.edit.widget.LensWidgetGroup import java.util.concurrent.CancellationException @@ -218,9 +222,19 @@ abstract class FixupSession( } } - abstract fun retry() + fun retry() { + // TODO: The actual prompt we sent is displayed as ghost text in the text input field, in VS + // Code. + // E.g. "Write a brief documentation comment for the selected code " + // We need to send the prompt along with the lenses, so that the client can display it. + EditCommandPrompt(controller, editor, "Edit instructions and Retry").displayPromptUI() + } - abstract fun diff() + fun diff() { + // TODO: Use DiffManager and bring up a diff of the changed region. + // You can see it in action now by clicking the green gutter to the left of Cody changes. + logger.warn("Code Lenses: Show Diff") + } fun undo() { CodyAgentService.withAgent(project) { agent -> @@ -334,6 +348,8 @@ abstract class FixupSession( return FileEditorManager.getInstance(project).getEditors(file).firstOrNull() } + override fun dispose() {} + companion object { // Lens actions the user can take; we notify the Agent when they are taken. const val COMMAND_ACCEPT = "cody.fixup.codelens.accept" diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensAction.kt b/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensAction.kt index 3eb3e75235..5f9212e8ba 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensAction.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensAction.kt @@ -2,7 +2,7 @@ package com.sourcegraph.cody.edit.widget import com.intellij.openapi.editor.event.EditorMouseEvent import com.intellij.ui.JBColor -import com.sourcegraph.cody.edit.FixupSession +import com.sourcegraph.cody.edit.sessions.FixupSession import java.awt.Font import java.awt.FontMetrics import java.awt.Graphics2D diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensGroupFactory.kt b/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensGroupFactory.kt index 37964e8247..c6e3c82124 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensGroupFactory.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensGroupFactory.kt @@ -2,7 +2,7 @@ package com.sourcegraph.cody.edit.widget import com.intellij.openapi.diagnostic.Logger import com.sourcegraph.cody.Icons -import com.sourcegraph.cody.edit.FixupSession +import com.sourcegraph.cody.edit.sessions.FixupSession /** Handles assembling standard groups of lenses. */ class LensGroupFactory(val session: FixupSession) { diff --git a/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensWidgetGroup.kt b/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensWidgetGroup.kt index 66d81570df..b5470817bb 100644 --- a/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensWidgetGroup.kt +++ b/src/main/kotlin/com/sourcegraph/cody/edit/widget/LensWidgetGroup.kt @@ -16,8 +16,12 @@ import com.intellij.openapi.editor.markup.TextAttributes import com.intellij.openapi.util.Disposer import com.intellij.ui.Gray import com.sourcegraph.cody.agent.protocol.Range -import com.sourcegraph.cody.edit.FixupSession -import java.awt.* +import com.sourcegraph.cody.edit.sessions.FixupSession +import java.awt.Cursor +import java.awt.Font +import java.awt.FontMetrics +import java.awt.Graphics2D +import java.awt.Point import java.awt.geom.Rectangle2D import java.util.concurrent.atomic.AtomicBoolean diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index fb253cfaa1..708f8f186f 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -103,9 +103,11 @@ - - + @@ -235,12 +237,12 @@ + class="com.sourcegraph.cody.edit.actions.EditCodeAction"> + class="com.sourcegraph.cody.edit.actions.DocumentCodeAction">