in plugins/amazonq/codewhisperer/jetbrains-community/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/listeners/CodeWhispererCodeScanDocumentListener.kt [22:58]
override fun documentChanged(event: DocumentEvent) {
val file = FileDocumentManager.getInstance().getFile(event.document) ?: return
val scanManager = CodeWhispererCodeScanManager.getInstance(project)
val treeModel = scanManager.getScanTree().model
val fileEditorManager = FileEditorManager.getInstance(project)
val activeEditor = fileEditorManager.selectedEditor
val deletedLineCount = event.oldFragment.toString().count { it == '\n' }
val insertedLineCount = event.newFragment.toString().count { it == '\n' }
val lineOffset = when {
deletedLineCount == 0 && insertedLineCount != 0 -> insertedLineCount
deletedLineCount != 0 && insertedLineCount == 0 -> -deletedLineCount
else -> 0
}
val editedTextRange = event.oldRange
scanManager.updateScanNodesForOffSet(file, lineOffset, editedTextRange)
val nodes = scanManager.getOverlappingScanNodes(file, editedTextRange)
nodes.forEach {
val issue = it.userObject as CodeWhispererCodeScanIssue
synchronized(it) {
treeModel.valueForPathChanged(TreePath(it.path), issue.copy(isInvalid = true))
}
issue.rangeHighlighter?.textAttributes = null
issue.rangeHighlighter?.dispose()
scanManager.removeIssue(issue)
}
scanManager.updateScanNodes(file)
if (activeEditor != null && activeEditor.file == file &&
file.isFile && CodeWhispererExplorerActionManager.getInstance().isAutoEnabledForCodeScan() &&
!CodeWhispererExplorerActionManager.getInstance().isMonthlyQuotaForCodeScansExceeded() &&
!isUserBuilderId(project)
) {
scanManager.createDebouncedRunCodeScan(CodeWhispererConstants.CodeAnalysisScope.FILE)
}
}