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