override fun documentChanged()

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)
        }
    }