fun computeLineDiff()

in src/main/kotlin/org/jetbrains/qodana/DiffLocator.kt [22:67]


        fun computeLineDiff(before: String, after: String, columns: List<Int>): List<DiffResult> {
            if (columns.any { it >= before.length }) return emptyList() // safety check
            val rows = generator.generateDiffRows(
                mutableListOf(before),
                mutableListOf(after)
            )
            val row = rows.first()
            val array = mutableListOf<Int?>()
            for (i in before.indices) {
                array.add(i, null)
            }
            var oldIdx = 0
            var newIdx = 0
            var inRemove = false
            var inAdd = false
            var i = 0
            while (i < row.oldLine.length && oldIdx < before.length) {
                val char = row.oldLine[i]
                when (char) {
                    RMV -> {
                        if (inAdd) return emptyList() // problem while comparison
                        inRemove = !inRemove
                    }
                    ADD -> {
                        if (inRemove) return emptyList() // problem while comparison
                        inAdd = !inAdd
                    }
                    else -> {
                        if (inRemove) {
                            oldIdx++
                        } else if (inAdd) {
                            newIdx++
                        } else {
                            array[oldIdx] = newIdx
                            newIdx++
                            oldIdx++
                        }
                    }
                }
                i++
            }

            return columns.map {
                DiffResult(it, array[it], if(array[it] != null) DiffStatus.CHANGE else DiffStatus.DELETE)
            }.toList()
        }