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);
+ }
}
}