Skip to content

Commit 5d2c6f5

Browse files
fix(amazonq): address codeReview comments
1 parent b26778c commit 5d2c6f5

File tree

2 files changed

+72
-70
lines changed

2 files changed

+72
-70
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/webview/BrowserConnector.kt

Lines changed: 69 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ class BrowserConnector(
136136
) {
137137
val uiReady = CompletableDeferred<Boolean>()
138138
private val chatCommunicationManager = ChatCommunicationManager.getInstance(project)
139-
private val codeScanManager = CodeWhispererCodeScanManager.getInstance(project)
140139

141140
suspend fun connect(
142141
browser: Browser,
@@ -622,77 +621,13 @@ class BrowserConnector(
622621
throw error
623622
}
624623
chatCommunicationManager.removePartialChatMessage(partialResultToken)
625-
val params = value?.let { encryptionManager?.decrypt(it) }.orEmpty()
626-
val jsonObject = Gson().fromJson(params, Map::class.java)
627-
val additionalMessages = jsonObject["additionalMessages"] as? MutableList<Map<String, Any>>
628-
val findingsMessage = additionalMessages?.find { message ->
629-
(message["messageId"] as String).endsWith(CODE_REVIEW_FINDINGS_SUFFIX) ||
630-
(message["messageId"] as String).endsWith(DISPLAY_FINDINGS_SUFFIX)
631-
}
632-
val scannedFiles = mutableListOf<VirtualFile>()
633-
if (findingsMessage != null) {
634-
additionalMessages.remove(findingsMessage)
635-
val gson = Gson()
636-
val jsonFindings = gson.fromJson(findingsMessage["body"] as String, List::class.java)
637-
val mappedFindings = mutableListOf<CodeWhispererCodeScanIssue>()
638-
for (aggregatedIssueUnformatted in jsonFindings) {
639-
val aggregatedIssue = gson.fromJson(gson.toJson(aggregatedIssueUnformatted), AggregatedCodeScanIssue::class.java)
640-
val file = try {
641-
LocalFileSystem.getInstance().findFileByIoFile(
642-
Path.of(aggregatedIssue.filePath).toFile(),
643-
)
644-
} catch (e: Exception) {
645-
null
646-
}
647-
if (file?.isDirectory == false) {
648-
scannedFiles.add(file)
649-
runReadAction {
650-
FileDocumentManager.getInstance().getDocument(file)
651-
}?.let { document ->
652-
for (issue in aggregatedIssue.issues) {
653-
val endLineInDocument = minOf(maxOf(0, issue.endLine - 1), document.lineCount - 1)
654-
val endCol = document.getLineEndOffset(endLineInDocument) - document.getLineStartOffset(endLineInDocument) + 1
655-
val isIssueIgnored = codeScanManager.isIgnoredIssue(issue.title, document, file, issue.startLine - 1)
656-
if (isIssueIgnored) {
657-
continue
658-
}
659-
mappedFindings.add(
660-
CodeWhispererCodeScanIssue(
661-
startLine = issue.startLine,
662-
startCol = 1,
663-
endLine = issue.endLine,
664-
endCol = endCol,
665-
file = file,
666-
project = project,
667-
title = issue.title,
668-
description = issue.description,
669-
detectorId = issue.detectorId,
670-
detectorName = issue.detectorName,
671-
findingId = issue.findingId,
672-
ruleId = issue.ruleId,
673-
relatedVulnerabilities = issue.relatedVulnerabilities,
674-
severity = issue.severity,
675-
recommendation = issue.recommendation,
676-
suggestedFixes = issue.suggestedFixes,
677-
codeSnippet = emptyList(),
678-
isVisible = true,
679-
autoDetected = issue.autoDetected,
680-
scanJobId = issue.scanJobId,
681-
),
682-
)
683-
}
684-
}
685-
}
686-
}
687-
688-
codeScanManager.addOnDemandIssues(mappedFindings, scannedFiles, CodeWhispererConstants.CodeAnalysisScope.AGENTIC)
689-
codeScanManager.showCodeScanUI()
690-
}
624+
val decryptedMessage = Gson().fromJson(value?.let { encryptionManager?.decrypt(it) }.orEmpty(), Map::class.java)
625+
parseFindingsMessages(decryptedMessage)
691626

692627
val messageToChat = ChatCommunicationManager.convertToJsonToSendToChat(
693628
SEND_CHAT_COMMAND_PROMPT,
694629
tabId,
695-
Gson().toJson(jsonObject),
630+
Gson().toJson(decryptedMessage),
696631
isPartialResult = false
697632
)
698633
browser.postChat(messageToChat)
@@ -706,6 +641,72 @@ class BrowserConnector(
706641
}
707642
}
708643

644+
private fun parseFindingsMessages(messagesMap: Map<*, *>) {
645+
val additionalMessages = messagesMap["additionalMessages"] as? MutableList<Map<String, Any>>
646+
val findingsMessages = additionalMessages?.filter { message ->
647+
message["messageId"] != null && (message["messageId"] as String).endsWith(CODE_REVIEW_FINDINGS_SUFFIX) ||
648+
(message["messageId"] as String).endsWith(DISPLAY_FINDINGS_SUFFIX)
649+
}
650+
val scannedFiles = mutableListOf<VirtualFile>()
651+
if (findingsMessages != null) {
652+
for (findingsMessage in findingsMessages) {
653+
additionalMessages.remove(findingsMessage)
654+
val gson = Gson()
655+
val jsonFindings = gson.fromJson(findingsMessage["body"] as String, List::class.java)
656+
val mappedFindings = mutableListOf<CodeWhispererCodeScanIssue>()
657+
for (aggregatedIssueUnformatted in jsonFindings) {
658+
val aggregatedIssue = gson.fromJson(gson.toJson(aggregatedIssueUnformatted), AggregatedCodeScanIssue::class.java)
659+
val file = LocalFileSystem.getInstance().findFileByIoFile(
660+
Path.of(aggregatedIssue.filePath).toFile())
661+
if (file?.isDirectory == false) {
662+
scannedFiles.add(file)
663+
runReadAction {
664+
FileDocumentManager.getInstance().getDocument(file)
665+
}?.let { document ->
666+
for (issue in aggregatedIssue.issues) {
667+
val endLineInDocument = minOf(maxOf(0, issue.endLine - 1), document.lineCount - 1)
668+
val endCol = document.getLineEndOffset(endLineInDocument) - document.getLineStartOffset(endLineInDocument) + 1
669+
val isIssueIgnored = CodeWhispererCodeScanManager.getInstance(project)
670+
.isIgnoredIssue(issue.title, document, file, issue.startLine - 1)
671+
if (isIssueIgnored) {
672+
continue
673+
}
674+
mappedFindings.add(
675+
CodeWhispererCodeScanIssue(
676+
startLine = issue.startLine,
677+
startCol = 1,
678+
endLine = issue.endLine,
679+
endCol = endCol,
680+
file = file,
681+
project = project,
682+
title = issue.title,
683+
description = issue.description,
684+
detectorId = issue.detectorId,
685+
detectorName = issue.detectorName,
686+
findingId = issue.findingId,
687+
ruleId = issue.ruleId,
688+
relatedVulnerabilities = issue.relatedVulnerabilities,
689+
severity = issue.severity,
690+
recommendation = issue.recommendation,
691+
suggestedFixes = issue.suggestedFixes,
692+
codeSnippet = emptyList(),
693+
isVisible = true,
694+
autoDetected = issue.autoDetected,
695+
scanJobId = issue.scanJobId,
696+
),
697+
698+
)
699+
}
700+
}
701+
}
702+
}
703+
704+
CodeWhispererCodeScanManager.getInstance(project).addOnDemandIssues(mappedFindings, scannedFiles, CodeWhispererConstants.CodeAnalysisScope.AGENTIC)
705+
CodeWhispererCodeScanManager.getInstance(project).showCodeScanUI()
706+
}
707+
}
708+
}
709+
709710
private suspend fun updateQuickActionsInBrowser(browser: Browser) {
710711
val isFeatureDevAvailable = isFeatureDevAvailable(project)
711712
val isCodeTransformAvailable = isCodeTransformAvailable(project)

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/commands/codescan/actions/HandleIssueCommandAction.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent
1010
import com.intellij.openapi.actionSystem.DataKey
1111
import com.intellij.openapi.application.ApplicationManager
1212
import com.intellij.openapi.project.DumbAware
13+
import com.intellij.ui.dsl.stringToInt
1314
import kotlinx.coroutines.runBlocking
1415
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.ChatCommunicationManager
1516
import software.aws.toolkits.jetbrains.services.amazonq.lsp.flareChat.FlareUiMessage
@@ -27,8 +28,8 @@ class HandleIssueCommandAction : AnAction(), DumbAware {
2728
fun createLineRangeText(issueContext: MutableMap<String, String>): String {
2829
val startLineString = issueContext["startLine"]
2930
val endLineString = issueContext["endLine"]
30-
val startLineInteger = Integer.parseInt(startLineString)
31-
val endLineInteger = Integer.parseInt(endLineString)
31+
val startLineInteger = stringToInt(startLineString!!)
32+
val endLineInteger = stringToInt(endLineString!!)
3233
return if (startLineInteger == endLineInteger) {
3334
"[$startLineInteger]"
3435
} else {

0 commit comments

Comments
 (0)