@@ -136,7 +136,6 @@ class BrowserConnector(
136
136
) {
137
137
val uiReady = CompletableDeferred <Boolean >()
138
138
private val chatCommunicationManager = ChatCommunicationManager .getInstance(project)
139
- private val codeScanManager = CodeWhispererCodeScanManager .getInstance(project)
140
139
141
140
suspend fun connect (
142
141
browser : Browser ,
@@ -622,77 +621,13 @@ class BrowserConnector(
622
621
throw error
623
622
}
624
623
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)
691
626
692
627
val messageToChat = ChatCommunicationManager .convertToJsonToSendToChat(
693
628
SEND_CHAT_COMMAND_PROMPT ,
694
629
tabId,
695
- Gson ().toJson(jsonObject ),
630
+ Gson ().toJson(decryptedMessage ),
696
631
isPartialResult = false
697
632
)
698
633
browser.postChat(messageToChat)
@@ -706,6 +641,72 @@ class BrowserConnector(
706
641
}
707
642
}
708
643
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
+
709
710
private suspend fun updateQuickActionsInBrowser (browser : Browser ) {
710
711
val isFeatureDevAvailable = isFeatureDevAvailable(project)
711
712
val isCodeTransformAvailable = isCodeTransformAvailable(project)
0 commit comments