Skip to content

Commit bcc1ab6

Browse files
authored
Add Q changelogs. Fix project root issue with codescan (#4398)
1 parent dd93e63 commit bcc1ab6

File tree

6 files changed

+52
-30
lines changed

6 files changed

+52
-30
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Amazon Q: Security scans can now run on all files in the project"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Amazon Q: Send security issue to chat for explanation and fix"
4+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type" : "feature",
3+
"description" : "Amazon Q: Security scans can now run automatically when file changes are made"
4+
}

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanManager.kt

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,10 @@ class CodeWhispererCodeScanManager(val project: Project) {
435435
?: error(message("codewhisperer.codescan.problems_window_not_found"))
436436

437437
private fun reset() = runInEdt {
438+
// clear the codeScanTreeNodeRoot
439+
synchronized(codeScanTreeNodeRoot) {
440+
codeScanTreeNodeRoot.removeAllChildren()
441+
}
438442
// Remove previous document listeners before starting a new scan.
439443
fileNodeLookup.clear()
440444
// Erase all range highlighter before cleaning up.
@@ -454,27 +458,13 @@ class CodeWhispererCodeScanManager(val project: Project) {
454458
val editorFactory = EditorFactory.getInstance()
455459
editorFactory.eventMulticaster.addDocumentListener(documentListener, project)
456460
editorFactory.addEditorFactoryListener(fileListener, project)
461+
EditorFactory.getInstance().eventMulticaster.addEditorMouseMotionListener(
462+
editorMouseListener,
463+
codeScanIssuesContent
464+
)
457465
}
458466
}
459467

460-
private fun addListeners() {
461-
fileNodeLookup.keys.forEach { file ->
462-
runInEdt {
463-
val document = FileDocumentManager.getInstance().getDocument(file)
464-
if (document == null) {
465-
LOG.error { message("codewhisperer.codescan.file_not_found", file.path) }
466-
return@runInEdt
467-
}
468-
document.addDocumentListener(documentListener, codeScanIssuesContent)
469-
}
470-
}
471-
EditorFactory.getInstance().eventMulticaster.removeEditorMouseMotionListener(editorMouseListener)
472-
EditorFactory.getInstance().eventMulticaster.addEditorMouseMotionListener(
473-
editorMouseListener,
474-
codeScanIssuesContent
475-
)
476-
}
477-
478468
private fun beforeCodeScan() {
479469
addCodeScanUI(setSelected = true)
480470
// Show in progress indicator
@@ -518,7 +508,17 @@ class CodeWhispererCodeScanManager(val project: Project) {
518508
private fun createCodeScanIssuesTree(codeScanIssues: List<CodeWhispererCodeScanIssue>): DefaultMutableTreeNode {
519509
LOG.debug { "Rendering response from the scan API" }
520510

521-
codeScanTreeNodeRoot.removeAllChildren()
511+
synchronized(codeScanTreeNodeRoot) {
512+
codeScanTreeNodeRoot.removeAllChildren()
513+
}
514+
// clear file node lookup and scan node lookup
515+
synchronized(fileNodeLookup) {
516+
fileNodeLookup.clear()
517+
}
518+
synchronized(scanNodesLookup) {
519+
scanNodesLookup.clear()
520+
}
521+
522522
codeScanIssues.forEach { issue ->
523523
val fileNode = synchronized(fileNodeLookup) {
524524
fileNodeLookup.getOrPut(issue.file) {
@@ -536,8 +536,6 @@ class CodeWhispererCodeScanManager(val project: Project) {
536536
mutableListOf()
537537
}.add(scanNode)
538538
}
539-
// Add document and editor listeners to the documents having scan issues.
540-
addListeners()
541539
return codeScanTreeNodeRoot
542540
}
543541

@@ -559,10 +557,14 @@ class CodeWhispererCodeScanManager(val project: Project) {
559557
}
560558
}
561559
// Remove the old scan nodes from the file node.
562-
fileNode.removeAllChildren()
560+
synchronized(fileNode) {
561+
fileNode.removeAllChildren()
562+
}
563563
// Remove the entry for the file from the scan nodes lookup.
564-
if (scanNodesLookup.containsKey(file)) {
565-
scanNodesLookup.remove(file)
564+
synchronized(scanNodesLookup) {
565+
if (scanNodesLookup.containsKey(file)) {
566+
scanNodesLookup.remove(file)
567+
}
566568
}
567569

568570
// Add new issues to the file node.
@@ -579,8 +581,6 @@ class CodeWhispererCodeScanManager(val project: Project) {
579581
fileNodeLookup.remove(file)
580582
}
581583

582-
// Add document and editor listeners to the documents having scan issues.
583-
addListeners()
584584
return codeScanTreeNodeRoot
585585
}
586586

@@ -606,7 +606,7 @@ class CodeWhispererCodeScanManager(val project: Project) {
606606
codeScanIssuesContent.displayName =
607607
message("codewhisperer.codescan.scan_display_with_issues", totalIssuesCount, INACTIVE_TEXT_COLOR)
608608
}
609-
codeScanResultsPanel.updateAndDisplayScanResults(codeScanTreeModel, scannedFiles, isProjectTruncated)
609+
codeScanResultsPanel.updateAndDisplayScanResults(codeScanTreeModel, scannedFiles, isProjectTruncated, scope)
610610
}
611611
}
612612

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/CodeWhispererCodeScanResultsView.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.listeners
2121
import software.aws.toolkits.jetbrains.services.codewhisperer.layout.CodeWhispererLayoutConfig
2222
import software.aws.toolkits.jetbrains.services.codewhisperer.layout.CodeWhispererLayoutConfig.addHorizontalGlue
2323
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererColorUtil.INACTIVE_TEXT_COLOR
24+
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants
2425
import software.aws.toolkits.resources.message
2526
import java.awt.BorderLayout
2627
import java.awt.Component
@@ -118,7 +119,12 @@ internal class CodeWhispererCodeScanResultsView(private val project: Project) :
118119
/**
119120
* Updates the [codeScanTree] with the new tree model root and displays the same on the UI.
120121
*/
121-
fun updateAndDisplayScanResults(scanTreeModel: CodeWhispererCodeScanTreeModel, scannedFiles: List<VirtualFile>, isProjectTruncated: Boolean) {
122+
fun updateAndDisplayScanResults(
123+
scanTreeModel: CodeWhispererCodeScanTreeModel,
124+
scannedFiles: List<VirtualFile>,
125+
isProjectTruncated: Boolean,
126+
scope: CodeWhispererConstants.CodeAnalysisScope
127+
) {
122128
codeScanTree.apply {
123129
model = scanTreeModel
124130
repaint()
@@ -142,7 +148,9 @@ internal class CodeWhispererCodeScanResultsView(private val project: Project) :
142148
repaint()
143149
}
144150

145-
changeInfoLabelToDisplayScanCompleted(scannedFiles.size, isProjectTruncated)
151+
if (scope == CodeWhispererConstants.CodeAnalysisScope.PROJECT) {
152+
changeInfoLabelToDisplayScanCompleted(scannedFiles.size, isProjectTruncated)
153+
}
146154
}
147155

148156
fun setStoppingCodeScan() {

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/sessionconfig/CodeScanSessionConfig.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ class CodeScanSessionConfig(
4040
private val project: Project,
4141
private val scope: CodeAnalysisScope
4242
) {
43-
var projectRoot = project.guessProjectDir() ?: error("Cannot guess base directory for project ${project.name}")
43+
var projectRoot = project.basePath?.let { Path.of(it) }?.toFile()?.toVirtualFile() ?: run {
44+
project.guessProjectDir() ?: error("Cannot guess base directory for project ${project.name}")
45+
}
4446
private set
4547

4648
private var isProjectTruncated = false

0 commit comments

Comments
 (0)