From b2380fb77e5a5f2556e9f4d5660114b0520821ec Mon Sep 17 00:00:00 2001 From: Manodnya Bhoite Date: Fri, 11 Apr 2025 01:49:41 -0700 Subject: [PATCH 1/4] Add editor position Conflicts: plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/SendChatPrompt.kt --- .../amazonq/webview/BrowserConnector.kt | 23 ++++--------- .../service/CodeWhispererService.kt | 2 +- .../service/CodeWhispererServiceNew.kt | 2 +- .../codewhisperer/CodeWhispererServiceTest.kt | 2 +- .../dependencies/ModuleDependencyProvider.kt | 2 +- .../amazonq/lsp/flareChat/ChatEditorUtils.kt | 15 -------- .../lsp/model/aws/chat/SendChatPrompt.kt | 4 +-- .../TextDocumentServiceHandler.kt | 2 +- .../util/{FileUriUtil.kt => LspEditorUtil.kt} | 34 +++++++++++++++++-- .../amazonq/lsp/util/WorkspaceFolderUtil.kt | 2 +- .../lsp/workspace/WorkspaceServiceHandler.kt | 2 +- .../TextDocumentServiceHandlerTest.kt | 6 ++-- .../amazonq/lsp/util/FileUriUtilTest.kt | 24 ++++++------- 13 files changed, 63 insertions(+), 57 deletions(-) delete mode 100644 plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatEditorUtils.kt rename plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/{FileUriUtil.kt => LspEditorUtil.kt} (50%) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt index de793733c79..a9a3f912ffe 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt @@ -8,6 +8,7 @@ import com.google.gson.Gson import com.intellij.ide.BrowserUtil import com.intellij.ide.util.RunOnceUtil import com.intellij.openapi.application.runInEdt +import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.options.ShowSettingsUtil import com.intellij.openapi.project.Project import com.intellij.ui.jcef.JBCefJSQuery.Response @@ -22,8 +23,7 @@ import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import org.cef.browser.CefBrowser -import org.eclipse.lsp4j.Position -import org.eclipse.lsp4j.Range +import org.eclipse.lsp4j.TextDocumentIdentifier import software.aws.toolkits.core.utils.error import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn @@ -34,7 +34,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService import software.aws.toolkits.jetbrains.services.amazonq.lsp.encryption.JwtEncryptionManager import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.AwsServerCapabilitiesProvider import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager -import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.getTextDocumentIdentifier import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AUTH_FOLLOW_UP_CLICKED import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.AuthFollowUpClickNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.ButtonClickNotification @@ -107,6 +106,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBa import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabBarActionRequest import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.TabEventRequest +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString import software.aws.toolkits.jetbrains.services.amazonq.util.command import software.aws.toolkits.jetbrains.services.amazonq.util.tabType import software.aws.toolkits.jetbrains.services.amazonq.webview.theme.AmazonQTheme @@ -236,19 +237,9 @@ class BrowserConnector( requestFromUi.params.prompt.escapedPrompt, node.command ) - val textDocumentIdentifier = getTextDocumentIdentifier(project) - val cursorState = CursorState( - Range( - Position( - 0, - 0 - ), - Position( - 1, - 1 - ) - ) - ) + val editor = FileEditorManager.getInstance(project).selectedTextEditor + val textDocumentIdentifier = editor?.let { TextDocumentIdentifier(toUriString(it.virtualFile)) } + val cursorState = editor?.let { LspEditorUtil.getCursorState(it) } val chatParams = ChatParams( requestFromUi.params.tabId, diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt index 147b31d3562..a0c1e8a0147 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererService.kt @@ -48,7 +48,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocume import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionListWithReferences import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionTriggerKind import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionWithReferencesParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorManager import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorUtil.getCaretPosition diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt index a939012ded0..234843e417d 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/service/CodeWhispererServiceNew.kt @@ -46,7 +46,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocume import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionListWithReferences import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionTriggerKind import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionWithReferencesParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorManagerNew import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorUtil.getCaretPosition import software.aws.toolkits.jetbrains.services.codewhisperer.explorer.CodeWhispererExplorerActionManager diff --git a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt index c787e1679a9..dbe0a5d8ad9 100644 --- a/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt +++ b/plugins/amazonq/codewhisperer/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/codewhisperer/CodeWhispererServiceTest.kt @@ -19,7 +19,7 @@ import org.mockito.kotlin.spy import org.mockito.kotlin.stub import org.mockito.kotlin.whenever import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.textDocument.InlineCompletionTriggerKind -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererCustomization import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator import software.aws.toolkits.jetbrains.services.codewhisperer.language.languages.CodeWhispererJava diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/ModuleDependencyProvider.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/ModuleDependencyProvider.kt index e8d0087e7d2..af9af6f4eb7 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/ModuleDependencyProvider.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/dependencies/ModuleDependencyProvider.kt @@ -8,7 +8,7 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.vfs.VirtualFile import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.dependencies.DidChangeDependencyPathsParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString interface ModuleDependencyProvider { companion object { diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatEditorUtils.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatEditorUtils.kt deleted file mode 100644 index c102acc410a..00000000000 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/flareChat/ChatEditorUtils.kt +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2025 Amazon.com, Inc. or its affiliates. All Rights Reserved. -// SPDX-License-Identifier: Apache-2.0 - -package software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat - -import com.intellij.openapi.fileEditor.FileEditorManager -import com.intellij.openapi.project.Project -import org.eclipse.lsp4j.TextDocumentIdentifier -import kotlin.io.path.Path - -fun getTextDocumentIdentifier(project: Project): TextDocumentIdentifier { - val selectedEditor = FileEditorManager.getInstance(project).selectedEditor - val filePath = Path(selectedEditor?.file?.path.orEmpty()).toUri() - return TextDocumentIdentifier(filePath.toString()) -} diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/SendChatPrompt.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/SendChatPrompt.kt index ae58bf8c45d..136f9adc336 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/SendChatPrompt.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/SendChatPrompt.kt @@ -9,8 +9,8 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ContextCom data class ChatParams( val tabId: String, val prompt: ChatPrompt, - val textDocument: TextDocumentIdentifier, - val cursorState: CursorState, + val textDocument: TextDocumentIdentifier?, + val cursorState: CursorState?, val context: List?, ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt index 537a804a297..1a2c0bb7447 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandler.kt @@ -27,7 +27,7 @@ import org.eclipse.lsp4j.TextDocumentIdentifier import org.eclipse.lsp4j.TextDocumentItem import org.eclipse.lsp4j.VersionedTextDocumentIdentifier import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread class TextDocumentServiceHandler( diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtil.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt similarity index 50% rename from plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtil.kt rename to plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt index b2821257a49..f79117f569f 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtil.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt @@ -3,15 +3,22 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.util +import com.intellij.openapi.application.runReadAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.fileEditor.FileEditorManager +import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile +import org.eclipse.lsp4j.Position +import org.eclipse.lsp4j.Range import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorState import java.io.File import java.net.URI import java.net.URISyntaxException -object FileUriUtil { +object LspEditorUtil { fun toUriString(virtualFile: VirtualFile): String? { val protocol = virtualFile.fileSystem.protocol @@ -38,5 +45,28 @@ object FileUriUtil { } } - private val LOG = getLogger() + fun getCursorState(editor: Editor): CursorState = + runReadAction { + val selectionModel = editor.selectionModel + val document = editor.document + + // Get start position + val startOffset = selectionModel.selectionStart + val startLine = document.getLineNumber(startOffset) + val startColumn = startOffset - document.getLineStartOffset(startLine) + + // Get end position + val endOffset = selectionModel.selectionEnd + val endLine = document.getLineNumber(endOffset) + val endColumn = endOffset - document.getLineStartOffset(endLine) + + return@runReadAction CursorState( + Range( + Position(startLine, startColumn), + Position(endLine, endColumn) + ) + ) + } + + private val LOG = getLogger() } diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt index 87e570b9f48..be98a8a9c5e 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/WorkspaceFolderUtil.kt @@ -7,7 +7,7 @@ import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project import com.intellij.openapi.roots.ModuleRootManager import org.eclipse.lsp4j.WorkspaceFolder -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString object WorkspaceFolderUtil { fun createWorkspaceFolders(project: Project): List = diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt index a457a6e0ef5..a5df9e76571 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/workspace/WorkspaceServiceHandler.kt @@ -33,7 +33,7 @@ import org.eclipse.lsp4j.TextDocumentItem import org.eclipse.lsp4j.WorkspaceFolder import org.eclipse.lsp4j.WorkspaceFoldersChangeEvent import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil.toUriString +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil.toUriString import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.WorkspaceFolderUtil.createWorkspaceFolders import software.aws.toolkits.jetbrains.utils.pluginAwareExecuteOnPooledThread import java.nio.file.FileSystems diff --git a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt index b96b00c4758..ecb5104adfa 100644 --- a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt +++ b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/textdocument/TextDocumentServiceHandlerTest.kt @@ -40,7 +40,7 @@ import org.junit.Rule import org.junit.Test import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLanguageServer import software.aws.toolkits.jetbrains.services.amazonq.lsp.AmazonQLspService -import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.FileUriUtil +import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.LspEditorUtil import java.net.URI import java.nio.file.Path import java.util.concurrent.CompletableFuture @@ -230,8 +230,8 @@ class TextDocumentServiceHandlerTest { val document = mockk() val file = createMockVirtualFile(URI.create("")) - mockkObject(FileUriUtil) { - every { FileUriUtil.toUriString(file) } returns null + mockkObject(LspEditorUtil) { + every { LspEditorUtil.toUriString(file) } returns null val fileDocumentManager = mockk { every { getFile(document) } returns file diff --git a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtilTest.kt b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtilTest.kt index 4418cb33ac8..abefcf9f152 100644 --- a/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtilTest.kt +++ b/plugins/amazonq/shared/jetbrains-community/tst/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/FileUriUtilTest.kt @@ -38,7 +38,7 @@ class FileUriUtilTest { @Test fun `test basic unix path`() { val virtualFile = createMockVirtualFile("/path/to/file.txt") - val uri = FileUriUtil.toUriString(virtualFile) + val uri = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("file:///path/to/file.txt") assertThat(uri).isEqualTo(expected) } @@ -46,7 +46,7 @@ class FileUriUtilTest { @Test fun `test unix directory path`() { val virtualFile = createMockVirtualFile("/path/to/directory/", mockIsDirectory = true) - val uri = FileUriUtil.toUriString(virtualFile) + val uri = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("file:///path/to/directory") assertThat(uri).isEqualTo(expected) } @@ -54,7 +54,7 @@ class FileUriUtilTest { @Test fun `test path with spaces`() { val virtualFile = createMockVirtualFile("/path/with spaces/file.txt") - val uri = FileUriUtil.toUriString(virtualFile) + val uri = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("file:///path/with%20spaces/file.txt") assertThat(uri).isEqualTo(expected) } @@ -62,7 +62,7 @@ class FileUriUtilTest { @Test fun `test root path`() { val virtualFile = createMockVirtualFile("/") - val uri = FileUriUtil.toUriString(virtualFile) + val uri = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("file:///") assertThat(uri).isEqualTo(expected) } @@ -70,7 +70,7 @@ class FileUriUtilTest { @Test fun `test path with multiple separators`() { val virtualFile = createMockVirtualFile("/path//to///file.txt") - val uri = FileUriUtil.toUriString(virtualFile) + val uri = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("file:///path/to/file.txt") assertThat(uri).isEqualTo(expected) } @@ -79,7 +79,7 @@ class FileUriUtilTest { fun `test very long path`() { val longPath = "/a".repeat(256) + "/file.txt" val virtualFile = createMockVirtualFile(longPath) - val uri = FileUriUtil.toUriString(virtualFile) + val uri = LspEditorUtil.toUriString(virtualFile) if (uri != null) { assertThat(uri.startsWith("file:///")).isTrue assertThat(uri.endsWith("/file.txt")).isTrue @@ -89,7 +89,7 @@ class FileUriUtilTest { @Test fun `test relative path`() { val virtualFile = createMockVirtualFile("./relative/path/file.txt") - val uri = FileUriUtil.toUriString(virtualFile) + val uri = LspEditorUtil.toUriString(virtualFile) if (uri != null) { assertThat(uri.contains("file.txt")).isTrue assertThat(uri.startsWith("file:///")).isTrue @@ -102,7 +102,7 @@ class FileUriUtilTest { "jar:file:///path/to/archive.jar!/com/example/Test.class", "jar" ) - val result = FileUriUtil.toUriString(virtualFile) + val result = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("jar:file:///path/to/archive.jar!/com/example/Test.class") assertThat(result).isEqualTo(expected) } @@ -113,7 +113,7 @@ class FileUriUtilTest { "jrt://java.base/java/lang/String.class", "jrt" ) - val result = FileUriUtil.toUriString(virtualFile) + val result = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("jrt://java.base/java/lang/String.class") assertThat(result).isEqualTo(expected) } @@ -124,7 +124,7 @@ class FileUriUtilTest { "invalid:url:format", "jar" ) - val result = FileUriUtil.toUriString(virtualFile) + val result = LspEditorUtil.toUriString(virtualFile) assertThat(result).isNull() } @@ -135,7 +135,7 @@ class FileUriUtilTest { "jar", true ) - val result = FileUriUtil.toUriString(virtualFile) + val result = LspEditorUtil.toUriString(virtualFile) val expected = normalizeFileUri("jar:file:///path/to/archive.jar!/com/example") assertThat(result).isEqualTo(expected) } @@ -147,7 +147,7 @@ class FileUriUtilTest { "jar", true ) - val result = FileUriUtil.toUriString(virtualFile) + val result = LspEditorUtil.toUriString(virtualFile) assertThat(result).isNull() } } From 237b74669c9d37443be2b4315b70cfe6146398db Mon Sep 17 00:00:00 2001 From: Richard Li Date: Thu, 8 May 2025 14:10:49 -0700 Subject: [PATCH 2/4] lint --- .../jetbrains/services/amazonq/webview/BrowserConnector.kt | 1 - .../jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt | 2 -- 2 files changed, 3 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt index a9a3f912ffe..e1d0e775316 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt @@ -70,7 +70,6 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyC import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CopyCodeToClipboardParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CreatePromptNotification import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CreatePromptParams -import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorState import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedChatParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.EncryptedQuickActionChatParams import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.FeedbackNotification diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt index f79117f569f..ac463e0788b 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt @@ -5,8 +5,6 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.util import com.intellij.openapi.application.runReadAction import com.intellij.openapi.editor.Editor -import com.intellij.openapi.fileEditor.FileEditorManager -import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VfsUtilCore import com.intellij.openapi.vfs.VirtualFile import org.eclipse.lsp4j.Position From 06363228c3f2c8e8bcded5a90cf8a7ddee2ad815 Mon Sep 17 00:00:00 2001 From: Richard Li Date: Thu, 8 May 2025 14:40:12 -0700 Subject: [PATCH 3/4] cursor --- .../amazonq/toolwindow/AmazonQPanel.kt | 4 +- .../amazonq/lsp/model/aws/chat/CursorState.kt | 11 +++++- .../amazonq/lsp/util/LspEditorUtil.kt | 37 +++++++++++-------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt index 41487d0a658..75cf419c23d 100644 --- a/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt +++ b/plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/toolwindow/AmazonQPanel.kt @@ -56,9 +56,7 @@ class AmazonQPanel(val project: Project, private val scope: CoroutineScope) : Di AsyncChatUiListener.TOPIC, object : AsyncChatUiListener { override fun onChange(message: String) { - runInEdt { - browser.get()?.postChat(message) - } + browser.get()?.postChat(message) } } ) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt index 2baa0221f50..aa40f662e4d 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt @@ -4,7 +4,14 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat import org.eclipse.lsp4j.Range +import org.eclipse.lsp4j.Position -data class CursorState( +sealed interface CursorState + +data class CursorPosition( + val position: Position, +) : CursorState + +data class CursorRange( val range: Range, -) +) : CursorState diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt index ac463e0788b..e7ece95f539 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt @@ -11,6 +11,8 @@ import org.eclipse.lsp4j.Position import org.eclipse.lsp4j.Range import software.aws.toolkits.core.utils.getLogger import software.aws.toolkits.core.utils.warn +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorPosition +import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorRange import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat.CursorState import java.io.File import java.net.URI @@ -43,27 +45,30 @@ object LspEditorUtil { } } + /** + * Works but is divergent from [FocusAreaContextExtrator] + */ fun getCursorState(editor: Editor): CursorState = runReadAction { val selectionModel = editor.selectionModel - val document = editor.document + if (selectionModel.hasSelection()) { + val selectedStartPos = editor.offsetToLogicalPosition(selectionModel.selectionStart) + val selectedEndPos = editor.offsetToLogicalPosition(selectionModel.selectionEnd) - // Get start position - val startOffset = selectionModel.selectionStart - val startLine = document.getLineNumber(startOffset) - val startColumn = startOffset - document.getLineStartOffset(startLine) - - // Get end position - val endOffset = selectionModel.selectionEnd - val endLine = document.getLineNumber(endOffset) - val endColumn = endOffset - document.getLineStartOffset(endLine) - - return@runReadAction CursorState( - Range( - Position(startLine, startColumn), - Position(endLine, endColumn) + return@runReadAction CursorRange( + Range( + Position(selectedStartPos.line, selectedStartPos.column), + Position(selectedEndPos.line, selectedEndPos.column) + ) + ) + } else { + return@runReadAction CursorPosition( + Position( + editor.caretModel.primaryCaret.logicalPosition.line, + editor.caretModel.primaryCaret.logicalPosition.column + ) ) - ) + } } private val LOG = getLogger() From a0255f9bc96c0dccd25d59bee103ebcd2c7a3782 Mon Sep 17 00:00:00 2001 From: Richard Li Date: Thu, 8 May 2025 15:05:20 -0700 Subject: [PATCH 4/4] lint --- .../services/amazonq/lsp/model/aws/chat/CursorState.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt index aa40f662e4d..c638e76ab28 100644 --- a/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt +++ b/plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/model/aws/chat/CursorState.kt @@ -3,8 +3,8 @@ package software.aws.toolkits.jetbrains.services.amazonq.lsp.model.aws.chat -import org.eclipse.lsp4j.Range import org.eclipse.lsp4j.Position +import org.eclipse.lsp4j.Range sealed interface CursorState