diff --git a/compiler/tests-common/tests/org/jetbrains/kotlin/codeMetaInfo/CodeMetaInfoRenderer.kt b/compiler/tests-common/tests/org/jetbrains/kotlin/codeMetaInfo/CodeMetaInfoRenderer.kt index 20684f1b177..dd41af597ab 100644 --- a/compiler/tests-common/tests/org/jetbrains/kotlin/codeMetaInfo/CodeMetaInfoRenderer.kt +++ b/compiler/tests-common/tests/org/jetbrains/kotlin/codeMetaInfo/CodeMetaInfoRenderer.kt @@ -9,59 +9,68 @@ import com.intellij.util.containers.Stack import org.jetbrains.kotlin.checkers.utils.CheckerTestUtil import org.jetbrains.kotlin.codeMetaInfo.model.CodeMetaInfo import java.io.File +import java.lang.StringBuilder object CodeMetaInfoRenderer { fun renderTagsToText( codeMetaInfos: List, originalText: String - ): StringBuffer { - val result = StringBuffer() + ): StringBuilder { + return StringBuilder().apply { + renderTagsToText(this, codeMetaInfos, originalText) + } + } + + fun renderTagsToText( + builder: StringBuilder, + codeMetaInfos: List, + originalText: String + ) { if (codeMetaInfos.isEmpty()) { - result.append(originalText) - return result + builder.append(originalText) + return } val sortedMetaInfos = getSortedCodeMetaInfos(codeMetaInfos) val opened = Stack() for ((i, c) in originalText.withIndex()) { - checkOpenedAndCloseStringIfNeeded(opened, i, result) + checkOpenedAndCloseStringIfNeeded(opened, i, builder) val matchedCodeMetaInfos = sortedMetaInfos.filter { it.start == i } if (matchedCodeMetaInfos.isNotEmpty()) { - openStartTag(result) + openStartTag(builder) val iterator = matchedCodeMetaInfos.listIterator() var current: CodeMetaInfo? = iterator.next() while (current != null) { val next: CodeMetaInfo? = if (iterator.hasNext()) iterator.next() else null opened.push(current) - result.append(current.asString()) + builder.append(current.asString()) when { next == null -> - closeStartTag(result) + closeStartTag(builder) next.end == current.end -> - result.append(", ") + builder.append(", ") else -> - closeStartAndOpenNewTag(result) + closeStartAndOpenNewTag(builder) } current = next } } - result.append(c) + builder.append(c) } - checkOpenedAndCloseStringIfNeeded(opened, originalText.length, result) - return result + checkOpenedAndCloseStringIfNeeded(opened, originalText.length, builder) } private fun getSortedCodeMetaInfos(metaInfos: Collection): List { return metaInfos.sortedWith(compareBy { it.start }.then(compareByDescending { it.end })) } - private fun closeString(result: StringBuffer) = result.append("") - private fun openStartTag(result: StringBuffer) = result.append("") - private fun closeStartAndOpenNewTag(result: StringBuffer) = result.append("!>") + private fun openStartTag(result: StringBuilder) = result.append("") + private fun closeStartAndOpenNewTag(result: StringBuilder) = result.append("!>, end: Int, result: StringBuffer) { + private fun checkOpenedAndCloseStringIfNeeded(opened: Stack, end: Int, result: StringBuilder) { var prev: CodeMetaInfo? = null while (!opened.isEmpty() && end == opened.peek().end) { if (prev == null || prev.start != opened.peek().start)