diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt index 194e5a16685..c4a9e4edc92 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt @@ -18,11 +18,12 @@ package org.jetbrains.kotlin.idea import com.intellij.codeInsight.folding.JavaCodeFoldingSettings import com.intellij.lang.ASTNode -import com.intellij.lang.folding.FoldingBuilderEx +import com.intellij.lang.folding.CustomFoldingBuilder 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.psi.PsiComment import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.JetNodeTypes @@ -31,15 +32,13 @@ import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFunctionLiteral import org.jetbrains.kotlin.psi.JetImportList -import java.util.ArrayList -public class KotlinFoldingBuilder : FoldingBuilderEx(), DumbAware { - override fun buildFoldRegions(root: PsiElement, document: Document, quick: Boolean): Array { +public class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware { + override fun buildLanguageFoldRegions(descriptors: MutableList, + root: PsiElement, document: Document, quick: Boolean) { if (root !is JetFile) { - return FoldingDescriptor.EMPTY + return } - val descriptors = ArrayList() - val imports = root.getImportDirectives() if (imports.size() > 1) { val importKeyword = imports.get(0).getFirstChild() @@ -55,7 +54,6 @@ public class KotlinFoldingBuilder : FoldingBuilderEx(), DumbAware { } appendDescriptors(root.getNode(), document, descriptors) - return descriptors.copyToArray() } private fun appendDescriptors(node: ASTNode, document: Document, descriptors: MutableList) { @@ -96,29 +94,23 @@ public class KotlinFoldingBuilder : FoldingBuilderEx(), DumbAware { private fun isOneLine(textRange: TextRange, document: Document) = document.getLineNumber(textRange.getStartOffset()) == document.getLineNumber(textRange.getEndOffset()) - override fun getPlaceholderText(node: ASTNode): String? { - if (node.getElementType() == JetTokens.BLOCK_COMMENT) { - return "/.../" - } - if (node.getElementType() == KDocTokens.KDOC) { - return "/**...*/" - } - if (node.getPsi() is JetImportList) { - return "..." - } - return "{...}" + override fun getLanguagePlaceholderText(node: ASTNode, range: TextRange): String = when { + node.getElementType() == JetTokens.BLOCK_COMMENT -> "/.../" + node.getElementType() == KDocTokens.KDOC -> "/**...*/" + node.getPsi() is JetImportList -> "..." + else -> "{...}" } - override fun isCollapsedByDefault(astNode: ASTNode): Boolean { + override fun isRegionCollapsedByDefault(node: ASTNode): Boolean { val settings = JavaCodeFoldingSettings.getInstance() - if (astNode.getPsi() is JetImportList) { + if (node.getPsi() is JetImportList) { return settings.isCollapseImports() } - val type = astNode.getElementType() + val type = node.getElementType() if (type == JetTokens.BLOCK_COMMENT || type == KDocTokens.KDOC) { - if (isFirstElementInFile(astNode.getPsi())) { + if (isFirstElementInFile(node.getPsi())) { return settings.isCollapseFileHeader() } } @@ -126,6 +118,9 @@ public class KotlinFoldingBuilder : FoldingBuilderEx(), DumbAware { return false } + override fun isCustomFoldingRoot(node: ASTNode) + = node.getElementType() == JetNodeTypes.BLOCK || node.getElementType() == JetNodeTypes.CLASS_BODY + private fun isFirstElementInFile(element: PsiElement): Boolean { val parent = element.getParent() if (parent is JetFile) { diff --git a/idea/testData/folding/checkCollapse/customRegions.kt b/idea/testData/folding/checkCollapse/customRegions.kt new file mode 100644 index 00000000000..0dc1c0557ea --- /dev/null +++ b/idea/testData/folding/checkCollapse/customRegions.kt @@ -0,0 +1,18 @@ +class Foo { + // + fun foo() {} + + fun bar() { + + } + // + + fun xyzzy() { + // + printn("Xyzzy") + printn("Xyzzy") + printn("Xyzzy") + // + } +} + diff --git a/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java index 08bb9703742..44192ef2525 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java @@ -88,6 +88,12 @@ public class KotlinFoldingTestGenerated extends AbstractKotlinFoldingTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/folding/checkCollapse"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("customRegions.kt") + public void testCustomRegions() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/folding/checkCollapse/customRegions.kt"); + doSettingsFoldingTest(fileName); + } + @TestMetadata("functionLiteral.kt") public void testFunctionLiteral() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/folding/checkCollapse/functionLiteral.kt");