Skip to content

Commit ca73a83

Browse files
committed
fix error handling
1 parent 7068e26 commit ca73a83

File tree

5 files changed

+55
-9
lines changed

5 files changed

+55
-9
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ChatController.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ class ChatController private constructor(
217217

218218
editor.document.insertString(offset, message.code)
219219

220-
ReferenceLogController.addReferenceLog(message.code, message.codeReference, editor, context.project)
220+
ReferenceLogController.addReferenceLog(message.code, message.codeReference, editor, context.project, null)
221221

222222
CodeWhispererUserModificationTracker.getInstance(context.project).enqueue(
223223
InsertedCodeModificationEntry(

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/ReferenceLogController.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,12 @@ import software.amazon.awssdk.services.codewhispererruntime.model.Reference
99
import software.amazon.awssdk.services.codewhispererruntime.model.Span
1010
import software.aws.toolkits.jetbrains.services.amazonqFeatureDev.session.CodeReferenceGenerated
1111
import software.aws.toolkits.jetbrains.services.codewhisperer.editor.CodeWhispererEditorUtil
12+
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CaretPosition
1213
import software.aws.toolkits.jetbrains.services.codewhisperer.toolwindow.CodeWhispererCodeReferenceManager
1314
import software.aws.toolkits.jetbrains.services.cwc.messages.CodeReference
1415

1516
object ReferenceLogController {
16-
fun addReferenceLog(originalCode: String, codeReferences: List<CodeReference>?, editor: Editor, project: Project) {
17+
fun addReferenceLog(originalCode: String, codeReferences: List<CodeReference>?, editor: Editor, project: Project, inlineChatStartPosition: CaretPosition?) {
1718
codeReferences?.let { references ->
1819
val cwReferences = references.map { reference ->
1920
Reference.builder()
@@ -36,7 +37,7 @@ object ReferenceLogController {
3637
originalCode,
3738
cwReferences,
3839
editor,
39-
CodeWhispererEditorUtil.getCaretPosition(editor),
40+
inlineChatStartPosition ?: CodeWhispererEditorUtil.getCaretPosition(editor),
4041
null,
4142
)
4243
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatController.kt

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ import software.aws.toolkits.jetbrains.services.amazonq.QWebviewPanel
5757
import software.aws.toolkits.jetbrains.services.amazonq.auth.AuthController
5858
import software.aws.toolkits.jetbrains.services.amazonq.toolwindow.AMAZON_Q_WINDOW_ID
5959
import software.aws.toolkits.jetbrains.services.codewhisperer.customization.CodeWhispererModelConfigurator
60+
import software.aws.toolkits.jetbrains.services.codewhisperer.model.CaretPosition
6061
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.ChatRequestData
6162
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.TriggerType
63+
import software.aws.toolkits.jetbrains.services.cwc.controller.ReferenceLogController
6264
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.messenger.ChatPromptHandler
6365
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.telemetry.TelemetryHelper
6466
import software.aws.toolkits.jetbrains.services.cwc.controller.chat.userIntent.UserIntentRecognizer
@@ -68,6 +70,7 @@ import software.aws.toolkits.jetbrains.services.cwc.inline.listeners.InlineChatF
6870
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessage
6971
import software.aws.toolkits.jetbrains.services.cwc.messages.ChatMessageType
7072
import software.aws.toolkits.jetbrains.services.cwc.storage.ChatSessionStorage
73+
import software.aws.toolkits.jetbrains.settings.CodeWhispererSettings
7174
import software.aws.toolkits.telemetry.FeatureId
7275
import java.util.UUID
7376
import java.util.concurrent.atomic.AtomicBoolean
@@ -285,9 +288,10 @@ class InlineChatController(
285288
.replace("&#39;", "'")
286289
.replace("=&gt;", "=>")
287290

288-
private fun processNewCode(editor: Editor, line: Int, code: String, prevMessage: String) {
291+
private fun processNewCode(editor: Editor, line: Int, event: ChatMessage, prevMessage: String) {
289292
if (isAbandoned.get()) return
290293
runBlocking {
294+
val code = event.message?.let { unescape(it) } ?: return@runBlocking
291295
logger.debug { "received inline chat recommendation with code: \n $code" }
292296
var insertLine = line
293297
var linesToAdd = emptyList<String>()
@@ -315,6 +319,12 @@ class InlineChatController(
315319
insertionLine.set(insertLine)
316320
acceptAction = {
317321
removeHighlighter(editor)
322+
try {
323+
val caretPosition = CaretPosition(offset = getLineStartOffset(editor.document, line), line = line)
324+
ReferenceLogController.addReferenceLog(code, event.codeReference, editor, project, inlineChatStartPosition = caretPosition)
325+
} catch (e: Exception) {
326+
logger.warn { "error logging reference for inline chat: ${e.stackTraceToString()}" }
327+
}
318328
}
319329
rejectAction = {
320330
val startOffset = getLineStartOffset(editor.document, line)
@@ -472,6 +482,13 @@ class InlineChatController(
472482
val endOffset = getLineEndOffset(editor.document, endLine)
473483
replaceString(editor.document, startOffset, endOffset, recommendation)
474484
removeHighlighter(editor)
485+
try {
486+
val caretPosition =
487+
CaretPosition(offset = selectionRange.startOffset, line = getLineNumber(editor.document, selectionRange.startOffset))
488+
ReferenceLogController.addReferenceLog(recommendation, event.codeReference, editor, project, inlineChatStartPosition = caretPosition)
489+
} catch (e: Exception) {
490+
logger.warn { "error logging reference for inline chat: ${e.stackTraceToString()}" }
491+
}
475492
}
476493
rejectAction = {
477494
val startOffset = getLineStartOffset(editor.document, startLine)
@@ -624,6 +641,7 @@ class InlineChatController(
624641

625642
val sessionInfo = sessionStorage.getSession(tabId, project)
626643
val mutex = Mutex()
644+
val isReferenceAllowed = CodeWhispererSettings.getInstance().isIncludeCodeWithReference()
627645

628646
var errorMessage = ""
629647
var prevMessage = ""
@@ -645,11 +663,17 @@ class InlineChatController(
645663
.onEach { event: ChatMessage ->
646664
if (event.message?.isNotEmpty() == true && prevMessage != event.message) {
647665
mutex.withLock {
666+
if (event.codeReference?.isNotEmpty() == true && !isReferenceAllowed) {
667+
canPopupAbort.set(true)
668+
undoChanges()
669+
errorMessage = "Suggestion had code reference; removed per setting."
670+
return@withLock
671+
}
648672
try {
649673
if (selectionRange != null) {
650674
processChatDiff(selectedCode, event, editor, selectionRange!!)
651675
} else {
652-
processNewCode(editor, selectedLineStart, unescape(event.message), prevMessage)
676+
processNewCode(editor, selectedLineStart, event, prevMessage)
653677
}
654678
} catch (e: Exception) {
655679
canPopupAbort.set(true)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatPopupFactory.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,10 @@ class InlineChatPopupFactory(
7070
errorMessage = submitHandler(prompt, selectedCode, selectedLineStart, editor)
7171
}
7272
if (errorMessage.isNotEmpty()) {
73-
setLabel(errorMessage)
74-
revalidate()
73+
withContext(EDT) {
74+
setErrorMessage(errorMessage)
75+
revalidate()
76+
}
7577
} else {
7678
val acceptAction = {
7779
acceptHandler.invoke()
@@ -81,6 +83,7 @@ class InlineChatPopupFactory(
8183
}
8284
withContext(EDT) {
8385
addCodeActionsPanel(acceptAction, rejectAction)
86+
revalidate()
8487
}
8588
}
8689
}

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/inline/InlineChatPopupPanel.kt

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@ class InlineChatPopupPanel(private val parentDisposable: Disposable) : JPanel()
8888
add(buttonsPanel, BorderLayout.EAST)
8989
}
9090

91+
private val emptyTextField = createTextField().apply {
92+
isEnabled = false
93+
}
94+
9195
override fun getPreferredSize(): Dimension = Dimension(popupWidth, popupHeight)
9296

9397
private fun createTextField(): JTextField = JTextField().apply {
@@ -141,9 +145,7 @@ class InlineChatPopupPanel(private val parentDisposable: Disposable) : JPanel()
141145
fun addCodeActionsPanel(acceptAction: () -> Unit, rejectAction: () -> Unit) {
142146
textLabel.text = message("amazonqInlineChat.popup.editCode")
143147
// this is a workaround somehow the textField will interfere with the enter handler
144-
val emptyTextField = createTextField()
145148
emptyTextField.text = textField.text
146-
emptyTextField.isEnabled = false
147149
inputPanel.remove(textField)
148150
inputPanel.add(emptyTextField, BorderLayout.CENTER)
149151

@@ -162,6 +164,22 @@ class InlineChatPopupPanel(private val parentDisposable: Disposable) : JPanel()
162164
revalidate()
163165
}
164166

167+
fun setErrorMessage(message: String) {
168+
setLabel(message)
169+
inputPanel.remove(emptyTextField)
170+
textField.text = ""
171+
textField.isEnabled = true
172+
inputPanel.add(textField, BorderLayout.CENTER)
173+
174+
buttonsPanel.remove(acceptButton)
175+
buttonsPanel.remove(rejectButton)
176+
buttonsPanel.add(submitButton, BorderLayout.WEST)
177+
buttonsPanel.add(cancelButton, BorderLayout.EAST)
178+
submitButton.isEnabled = false
179+
cancelButton.isEnabled = true
180+
revalidate()
181+
}
182+
165183
fun setLabel(text: String) {
166184
textLabel.text = text
167185
textField.isEnabled = false

0 commit comments

Comments
 (0)