diff --git a/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt b/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt index 54fc805f522..6922bb403e6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt +++ b/idea/src/org/jetbrains/kotlin/idea/KotlinFoldingBuilder.kt @@ -81,7 +81,8 @@ class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware { val parentType = node.treeParent?.elementType return type == KtNodeTypes.FUNCTION_LITERAL || (type == KtNodeTypes.BLOCK && parentType != KtNodeTypes.FUNCTION_LITERAL) || - type == KtNodeTypes.CLASS_BODY || type == KtTokens.BLOCK_COMMENT || type == KDocTokens.KDOC + type == KtNodeTypes.CLASS_BODY || type == KtTokens.BLOCK_COMMENT || type == KDocTokens.KDOC || + type == KtNodeTypes.STRING_TEMPLATE } private fun getRangeToFold(node: ASTNode): TextRange { @@ -99,10 +100,18 @@ class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware { override fun getLanguagePlaceholderText(node: ASTNode, range: TextRange): String = when { node.elementType == KtTokens.BLOCK_COMMENT -> "/${getFirstLineOfComment(node)}.../" node.elementType == KDocTokens.KDOC -> "/**${getFirstLineOfComment(node)}...*/" + node.elementType == KtNodeTypes.STRING_TEMPLATE -> "\"\"\"${getFirstLineOfString(node)}...\"\"\"" node.psi is KtImportList -> "..." else -> "{...}" } + private fun getFirstLineOfString(node: ASTNode): String { + val targetStringLine = node.text.split("\n").asSequence().map { + it.replace("\"\"\"", "") + }.firstOrNull(String::isNotBlank) ?: return "" + return " ${targetStringLine.replace("\"\"\"", "").trim()} " + } + private fun getFirstLineOfComment(node: ASTNode): String { val targetCommentLine = node.text.split("\n").firstOrNull { getCommentContents(it).isNotEmpty() diff --git a/idea/testData/folding/checkCollapse/multilineStrings.kt b/idea/testData/folding/checkCollapse/multilineStrings.kt new file mode 100644 index 00000000000..614a915b8d3 --- /dev/null +++ b/idea/testData/folding/checkCollapse/multilineStrings.kt @@ -0,0 +1,32 @@ +val result1 = """ + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 1.0, 0.25, 1.0, 0.5, 2.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 4.0, 1.0, 0.5, 1.0, 1.0, 3.0, 4.0, 3.0, 0.25, 3.0, 0.5, 3.0, 3.0, 2.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 2.0, 2.0, 1.0, 0.5, 1.0, 0.5, 2.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 1.0, 0.25, 1.0, 0.5, 3.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 2.0, 0.5, 2.0, 0.5, 3.0, 3.0, 2.5 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 2.0, 2.0, 1.0, 0.3333333333333333, 3.0, 0.5, 2.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 2.0, 2.0, 3.0, 0.3333333333333333, 1.0, 0.5, 3.0, 2.0, 2.5 + 14.55576559546314 - 0.25, 4.0, 1.0, 0.5, 1.0, 1.0, 3.0, 4.0, 3.0, 0.3333333333333333, 1.0, 0.5, 3.0, 3.0, 2.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 2.0, 0.5, 2.0, 0.5, 3.0, 2.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 3.0, 2.0, 2.0, 0.5, 1.0, 0.5, 2.0, 2.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 3.0, 0.5, 2.0, 0.5, 2.0, 3.0, 2.5 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 2.0, 2.0, 1.0, 0.5, 3.0, 0.5, 1.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 3.0, 2.0, 3.0, 0.5, 3.0, 0.5, 3.0, 2.0, 2.5 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.3333333333333333, 1.0, 2.0, 1.0, 0.3333333333333333, 2.0, 0.5, 1.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 3.0, 2.0, 1.0, 0.5, 2.0, 0.5, 1.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 1.0, 0.25, 2.0, 0.5, 2.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 1.0, 0.3333333333333333, 2.0, 0.5, 3.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 2.0, 0.25, 2.0, 0.5, 3.0, 2.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 2.0, 0.3333333333333333, 2.0, 0.5, 3.0, 2.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 2.0, 0.5, 3.0, 0.5, 1.0, 3.0, 3.0 + 14.55576559546314 - 0.25, 3.0, 0.25, 0.25, 1.0, 0.25, 1.0, 2.0, 3.0, 0.3333333333333333, 1.0, 0.5, 3.0, 3.0, 2.5 +""" + +val result2 = """other multiline string +without spaces +""" + +val empty = """ + + +""" diff --git a/idea/testData/folding/noCollapse/singleLineString.kt b/idea/testData/folding/noCollapse/singleLineString.kt new file mode 100644 index 00000000000..86211d6db01 --- /dev/null +++ b/idea/testData/folding/noCollapse/singleLineString.kt @@ -0,0 +1,6 @@ +val result3 = """aaa""" +val result4 = "bbb" +val result5 = "ccc" + + "ddd" +val result6 = "eee" + + """fff""" diff --git a/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java index 8f575b0970f..69eaab3dcba 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/folding/KotlinFoldingTestGenerated.java @@ -78,6 +78,12 @@ public class KotlinFoldingTestGenerated extends AbstractKotlinFoldingTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/noCollapse/oneImport.kt"); doTest(fileName); } + + @TestMetadata("singleLineString.kt") + public void testSingleLineString() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/noCollapse/singleLineString.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/folding/checkCollapse") @@ -117,5 +123,11 @@ public class KotlinFoldingTestGenerated extends AbstractKotlinFoldingTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/checkCollapse/imports.kt"); doSettingsFoldingTest(fileName); } + + @TestMetadata("multilineStrings.kt") + public void testMultilineStrings() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/checkCollapse/multilineStrings.kt"); + doSettingsFoldingTest(fileName); + } } }