From 5bf984561301228875ae312ae49d1daeebb87975 Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 21 Jan 2025 14:10:54 -0800 Subject: [PATCH 1/4] Update InlineEditAction.kt --- .../continueintellijextension/editor/InlineEditAction.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt index ce2c260e14..6139799bd5 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt @@ -130,7 +130,8 @@ fun openInlineEdit(project: Project?, editor: Editor) { val modelTitles = mutableListOf() continuePluginService.coreMessenger?.request("config/getSerializedProfileInfo", null, null) { response -> - val result = (response as Map)["result"] as Map + val content = (response as Map)["content"] as Map + val result = content["result"] as Map val config = result["config"] as Map val models = config["models"] as List> modelTitles.addAll(models.map { it["title"] as String }) From e6c44b1f0992eecb89282663e4c313b086a7e67b Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 21 Jan 2025 15:23:16 -0800 Subject: [PATCH 2/4] test: inline edit tests --- .../editor/InlineEditAction.kt | 4 +- .../e2e/InlineEdit.kt | 91 +++++++++++++++++++ 2 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt index 6139799bd5..52e784d724 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt @@ -167,13 +167,13 @@ fun openInlineEdit(project: Project?, editor: Editor) { val prefix = editor.document.getText(TextRange(0, startOffset)) val highlighted = editor.document.getText(TextRange(startOffset, endOffset)) val suffix = editor.document.getText(TextRange(endOffset, editor.document.textLength)) - val lineNumber = max(0, startLineNumber - 1) + val lineNumber = if (startLineNumber == 0) 0 else max(0, startLineNumber - 1) // Un-highlight the selected text selectionModel.removeSelection() // Get indentation width in pixels - val indentationLineNum = lineNumber + 1 + val indentationLineNum = if (startLineNumber == 0) 0 else lineNumber + 1 val lineStart = editor.document.getLineStartOffset(indentationLineNum) val lineEnd = editor.document.getLineEndOffset(indentationLineNum) val text = editor.document.getText(TextRange(lineStart, lineEnd)) diff --git a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt new file mode 100644 index 0000000000..e43203810b --- /dev/null +++ b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt @@ -0,0 +1,91 @@ +package com.github.continuedev.continueintellijextension.e2e + +import com.automation.remarks.junit5.Video +import com.github.continuedev.continueintellijextension.fixtures.dialog +import com.github.continuedev.continueintellijextension.fixtures.idea +import com.github.continuedev.continueintellijextension.fixtures.welcomeFrame +import com.github.continuedev.continueintellijextension.utils.RemoteRobotExtension +import com.github.continuedev.continueintellijextension.utils.StepsLogger +import com.github.continuedev.continueintellijextension.utils.getMetaKey +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.fixtures.ComponentFixture +import com.intellij.remoterobot.search.locators.byXpath +import com.intellij.remoterobot.steps.CommonSteps +import com.intellij.remoterobot.utils.keyboard +import com.intellij.remoterobot.utils.waitFor +import com.intellij.remoterobot.utils.waitForIgnoringError +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import java.awt.event.KeyEvent +import java.awt.event.KeyEvent.VK_I +import java.awt.event.KeyEvent.VK_J +import java.time.Duration.ofMinutes +import java.time.Duration.ofSeconds + +@ExtendWith(RemoteRobotExtension::class) +class InlineEdit { + init { + StepsLogger.init() + } + + @BeforeEach + fun waitForIde(remoteRobot: RemoteRobot) { + waitForIgnoringError(ofMinutes(3)) { remoteRobot.callJs("true") } + } + + @AfterEach + fun closeProject(remoteRobot: RemoteRobot) = CommonSteps(remoteRobot).closeProject() + + @Test + @Video + fun submitInlineEdit(remoteRobot: RemoteRobot): Unit = with(remoteRobot) { + welcomeFrame { + createNewProjectLink.click() + dialog("New Project") { + findText("Java").click() + checkBox("Add sample code").select() + button("Create").click() + } + } + + // Wait for the default "Main.java" tab to load + // Our "continue_tutorial.java.ft" tab loads first, but then "Main.java" takes focus. + waitFor(ofSeconds(20)) { + findAll( + byXpath("//div[@accessiblename='Main.java' and @class='SingleHeightLabel']") + ).isNotEmpty() + } + + idea { + with(textEditor()) { + val userMsg = "TEST_USER_MESSAGE_0" + editor.insertTextAtLine(0, 0, userMsg) + editor.selectText(userMsg) + + keyboard { + hotKey(getMetaKey(), VK_I) + } + + val textArea = find(byXpath("//div[@class='CustomTextArea']")) + textArea.hasText("Enter instructions...") + + val modelSelect = find(byXpath("//div[@class='JComboBox']")) + modelSelect.hasText("TEST LLM") + + keyboard { + enterText("Hello world!") + } + + val enterBtn = find(byXpath("//div[@class='CustomButton']")) + enterBtn.click() + + find(byXpath("//div[@text='⌥⇧N']")).isShowing + find(byXpath("//div[@text='⌥⇧Y']")).isShowing + find(byXpath("//div[@text='Accept All (⌘⇧⏎)']")).isShowing + find(byXpath("//div[@text='Reject All (⌘⇧⌫)']")).isShowing + } + } + } +} \ No newline at end of file From ad9ca84af4bcfdbd8fe30821dcab067e2d926512 Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 21 Jan 2025 15:47:52 -0800 Subject: [PATCH 3/4] Update InlineEdit.kt --- .../continueintellijextension/e2e/InlineEdit.kt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt index e43203810b..d153deda52 100644 --- a/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt +++ b/extensions/intellij/src/test/kotlin/com/github/continuedev/continueintellijextension/e2e/InlineEdit.kt @@ -6,7 +6,7 @@ import com.github.continuedev.continueintellijextension.fixtures.idea import com.github.continuedev.continueintellijextension.fixtures.welcomeFrame import com.github.continuedev.continueintellijextension.utils.RemoteRobotExtension import com.github.continuedev.continueintellijextension.utils.StepsLogger -import com.github.continuedev.continueintellijextension.utils.getMetaKey +import com.github.continuedev.continueintellijextension.utils.* import com.intellij.remoterobot.RemoteRobot import com.intellij.remoterobot.fixtures.ComponentFixture import com.intellij.remoterobot.search.locators.byXpath @@ -18,9 +18,7 @@ import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import java.awt.event.KeyEvent import java.awt.event.KeyEvent.VK_I -import java.awt.event.KeyEvent.VK_J import java.time.Duration.ofMinutes import java.time.Duration.ofSeconds @@ -81,10 +79,15 @@ class InlineEdit { val enterBtn = find(byXpath("//div[@class='CustomButton']")) enterBtn.click() - find(byXpath("//div[@text='⌥⇧N']")).isShowing - find(byXpath("//div[@text='⌥⇧Y']")).isShowing - find(byXpath("//div[@text='Accept All (⌘⇧⏎)']")).isShowing - find(byXpath("//div[@text='Reject All (⌘⇧⌫)']")).isShowing + val rejectText = "${getAltKeyLabel()}${getShiftKeyLabel()}N" + val acceptText = "${getAltKeyLabel()}${getShiftKeyLabel()}Y" + val acceptAllText = "Accept All (${getMetaKeyLabel()}${getShiftKeyLabel()}⏎)" + val rejectAllText = "Reject All (${getMetaKeyLabel()}${getShiftKeyLabel()}⌫)" + + find(byXpath("//div[@text='$rejectText']")).isShowing + find(byXpath("//div[@text='$acceptText']")).isShowing + find(byXpath("//div[@text='$acceptAllText']")).isShowing + find(byXpath("//div[@text='$rejectAllText']")).isShowing } } } From 32cf97f3ba9a80cd6d3a6c1e3403ff4307a5baef Mon Sep 17 00:00:00 2001 From: Patrick Erichsen Date: Tue, 21 Jan 2025 15:57:20 -0800 Subject: [PATCH 4/4] Update InlineEditAction.kt --- .../continueintellijextension/editor/InlineEditAction.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt index 52e784d724..9f314ede6e 100644 --- a/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt +++ b/extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/editor/InlineEditAction.kt @@ -4,6 +4,7 @@ import com.github.continuedev.continueintellijextension.`continue`.GetTheme import com.github.continuedev.continueintellijextension.services.ContinueExtensionSettings import com.github.continuedev.continueintellijextension.services.ContinuePluginService import com.github.continuedev.continueintellijextension.utils.getMetaKeyLabel +import com.github.continuedev.continueintellijextension.utils.getShiftKeyLabel import com.intellij.openapi.Disposable import com.intellij.openapi.actionSystem.ActionUpdateThread import com.intellij.openapi.actionSystem.AnAction @@ -489,14 +490,14 @@ class CustomPanel( } val leftButton = - CustomButton("Reject All (${getMetaKeyLabel()}⇧⌫)") { onReject() } + CustomButton("Reject All (${getMetaKeyLabel()}${getShiftKeyLabel()}⌫)") { onReject() } .apply { background = JBColor(0x30FF0000.toInt(), 0x30FF0000.toInt()) foreground = JBColor(0xF5F5F5.toInt(), 0xF5F5F5.toInt()) } val rightButton = - CustomButton("Accept All (${getMetaKeyLabel()}⇧⏎)") { onAccept() } + CustomButton("Accept All (${getMetaKeyLabel()}${getShiftKeyLabel()}⏎)") { onAccept() } .apply { background = JBColor(0x3000FF00.toInt(), 0x3000FF00.toInt()) foreground = JBColor(0xF5F5F5.toInt(), 0xF5F5F5.toInt())