-
Notifications
You must be signed in to change notification settings - Fork 273
fix(amazonq): insert to cursor button in chat applies edit to active file #5897
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
Changes from 6 commits
a4e01da
4825236
18d754f
86bdfd8
e59852e
ef96d4c
2d59143
f62a93c
753ac30
534a6f3
7f213cd
3f983ac
2e3f1a7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
"type" : "bugfix", | ||
"description" : "- Fixed \"Insert to Cursor\" button to correctly insert code blocks at the current cursor position in the active file" | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,11 +4,20 @@ | |
package software.aws.toolkits.jetbrains.services.amazonq.lsp.util | ||
|
||
import com.intellij.openapi.application.runReadAction | ||
import com.intellij.openapi.command.WriteCommandAction | ||
import com.intellij.openapi.editor.Document | ||
import com.intellij.openapi.editor.Editor | ||
import com.intellij.openapi.editor.LogicalPosition | ||
import com.intellij.openapi.fileEditor.FileDocumentManager | ||
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 com.intellij.openapi.vfs.VirtualFileManager | ||
import org.eclipse.lsp4j.Position | ||
import org.eclipse.lsp4j.Range | ||
import org.eclipse.lsp4j.TextEdit | ||
import org.eclipse.lsp4j.WorkspaceEdit | ||
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 | ||
|
@@ -63,13 +72,54 @@ | |
) | ||
} else { | ||
return@runReadAction CursorPosition( | ||
Position( | ||
editor.caretModel.primaryCaret.logicalPosition.line, | ||
editor.caretModel.primaryCaret.logicalPosition.column | ||
) | ||
getCursorPosition(editor) | ||
Check warning on line 75 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
) | ||
} | ||
} | ||
|
||
fun getCursorPosition(editor: Editor): Position = | ||
runReadAction { | ||
Position( | ||
editor.caretModel.primaryCaret.logicalPosition.line, | ||
editor.caretModel.primaryCaret.logicalPosition.column | ||
) | ||
} | ||
Check warning on line 86 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
|
||
fun applyWorkspaceEdit(project: Project, edit: WorkspaceEdit) { | ||
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. follow up later with tests for at least this method |
||
WriteCommandAction.runWriteCommandAction(project) { | ||
Check warning on line 89 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
edit.documentChanges?.forEach { change -> | ||
if (change.isLeft) { | ||
val textDocumentEdit = change.left | ||
applyEditsToFile(project, textDocumentEdit.textDocument.uri, textDocumentEdit.edits) | ||
Check warning on line 93 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
} | ||
} | ||
Check warning on line 95 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
|
||
edit.changes?.forEach { (uri, textEdits) -> | ||
applyEditsToFile(project, uri, textEdits) | ||
} | ||
} | ||
} | ||
Check warning on line 101 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
|
||
private fun applyEditsToFile(project: Project, uri: String, textEdits: List<TextEdit>) { | ||
val file = VirtualFileManager.getInstance().findFileByUrl(uri) ?: return | ||
val document = FileDocumentManager.getInstance().getDocument(file) ?: return | ||
val editor = FileEditorManager.getInstance(project).getSelectedEditor(file)?.let { | ||
if (it is com.intellij.openapi.fileEditor.TextEditor) it.editor else null | ||
} | ||
|
||
textEdits.forEach { textEdit -> | ||
val startOffset = calculateOffset(editor, document, textEdit.range.start) | ||
val endOffset = calculateOffset(editor, document, textEdit.range.end) | ||
document.replaceString(startOffset, endOffset, textEdit.newText) | ||
} | ||
} | ||
Check warning on line 115 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
|
||
private fun calculateOffset(editor: Editor?, document: Document, position: Position): Int = | ||
if (editor != null) { | ||
|
||
editor.logicalPositionToOffset(LogicalPosition(position.line, position.character)) | ||
Check warning on line 119 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
} else { | ||
document.getLineStartOffset(position.line) + position.character | ||
} | ||
Check warning on line 122 in plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/util/LspEditorUtil.kt
|
||
|
||
private val LOG = getLogger<LspEditorUtil>() | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
see SEND_CHAT_COMMAND_PROMPT to see how we can reduce number of serializer calls