don't use document for checking whether a folding region is one-line, use only PSI, as it may not correspond to the state of the document (EA-81838 - IOOBE: LineSet.findLineIndex)

This commit is contained in:
Dmitry Jemerov
2016-08-09 20:27:45 +02:00
parent a4aa3cdf57
commit 180f70b573
@@ -23,6 +23,7 @@ import com.intellij.lang.folding.FoldingDescriptor
import com.intellij.openapi.editor.Document
import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.util.TextRange
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.kotlin.KtNodeTypes
@@ -61,7 +62,9 @@ class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
private fun appendDescriptors(node: ASTNode, document: Document, descriptors: MutableList<FoldingDescriptor>) {
if (needFolding(node)) {
val textRange = getRangeToFold(node)
if (!isOneLine(textRange, document)) {
val relativeRange = textRange.shiftRight(-node.textRange.startOffset)
val foldRegionText = node.chars.subSequence(relativeRange.startOffset, relativeRange.endOffset)
if (StringUtil.countNewLines(foldRegionText) > 0) {
descriptors.add(FoldingDescriptor(node, textRange))
}
}
@@ -93,9 +96,6 @@ class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
return node.textRange
}
private fun isOneLine(textRange: TextRange, document: Document) =
document.getLineNumber(textRange.startOffset) == document.getLineNumber(textRange.endOffset)
override fun getLanguagePlaceholderText(node: ASTNode, range: TextRange): String = when {
node.elementType == KtTokens.BLOCK_COMMENT -> "/.../"
node.elementType == KDocTokens.KDOC -> "/**...*/"