in intellij-plugin/educational-core/src/com/jetbrains/edu/learning/EduDocumentListener.kt [53:101]
override fun documentChanged(e: DocumentEvent) {
if (taskFile == null && !e.isInProjectContent()) return
val taskFile = (taskFile ?: e.taskFile) ?: return
if (!taskFile.isTrackChanges) {
return
}
val project = holder.course?.project
if (project != null) {
SyncChangesStateManager.getInstance(project).taskFileChanged(taskFile)
}
if (taskFile.answerPlaceholders.isEmpty()) return
if (e !is DocumentEventImpl) {
return
}
val offset = e.getOffset()
val change = e.getNewLength() - e.getOldLength()
val fragment = e.getNewFragment()
val oldFragment = e.getOldFragment()
for (placeholder in taskFile.answerPlaceholders) {
var placeholderStart = placeholder.offset
var placeholderEnd = placeholder.endOffset
val changes = getChangeForOffsets(offset, change, placeholder)
val changeForStartOffset = changes.getFirst()
val changeForEndOffset = changes.getSecond()
placeholderStart += changeForStartOffset
placeholderEnd += changeForEndOffset
if (placeholderStart - 1 == offset && fragment.toString().isEmpty() && oldFragment.toString().startsWith("\n")) {
placeholderStart -= 1
}
if (placeholderStart == offset && oldFragment.toString().isEmpty() && fragment.toString().startsWith("\n")) {
placeholderStart += 1
}
val length = placeholderEnd - placeholderStart
assert(length >= 0)
assert(placeholderStart >= 0)
updatePlaceholder(placeholder, placeholderStart, length)
}
}