From 180f70b5737baae9740b6aeb87d24ed927254911 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 9 Aug 2016 20:27:45 +0200 Subject: [PATCH] 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) --- .../src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt index 846d7f55dee..0997ecd840d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt @@ -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) { 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 -> "/**...*/"