KT-5193 Make multiline strings foldable (#938)
* KT-5193 Make multiline strings foldable #KT-5193 Fixed * Avoid multiple replace call
This commit is contained in:
committed by
Dmitry Jemerov
parent
1a1eb7dcfa
commit
e1eba8f5c8
@@ -81,7 +81,8 @@ class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
|
|||||||
val parentType = node.treeParent?.elementType
|
val parentType = node.treeParent?.elementType
|
||||||
return type == KtNodeTypes.FUNCTION_LITERAL ||
|
return type == KtNodeTypes.FUNCTION_LITERAL ||
|
||||||
(type == KtNodeTypes.BLOCK && parentType != 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 {
|
private fun getRangeToFold(node: ASTNode): TextRange {
|
||||||
@@ -99,10 +100,18 @@ class KotlinFoldingBuilder : CustomFoldingBuilder(), DumbAware {
|
|||||||
override fun getLanguagePlaceholderText(node: ASTNode, range: TextRange): String = when {
|
override fun getLanguagePlaceholderText(node: ASTNode, range: TextRange): String = when {
|
||||||
node.elementType == KtTokens.BLOCK_COMMENT -> "/${getFirstLineOfComment(node)}.../"
|
node.elementType == KtTokens.BLOCK_COMMENT -> "/${getFirstLineOfComment(node)}.../"
|
||||||
node.elementType == KDocTokens.KDOC -> "/**${getFirstLineOfComment(node)}...*/"
|
node.elementType == KDocTokens.KDOC -> "/**${getFirstLineOfComment(node)}...*/"
|
||||||
|
node.elementType == KtNodeTypes.STRING_TEMPLATE -> "\"\"\"${getFirstLineOfString(node)}...\"\"\""
|
||||||
node.psi is KtImportList -> "..."
|
node.psi is KtImportList -> "..."
|
||||||
else -> "{...}"
|
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 {
|
private fun getFirstLineOfComment(node: ASTNode): String {
|
||||||
val targetCommentLine = node.text.split("\n").firstOrNull {
|
val targetCommentLine = node.text.split("\n").firstOrNull {
|
||||||
getCommentContents(it).isNotEmpty()
|
getCommentContents(it).isNotEmpty()
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
val result1 = <fold text='""" 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 ..."""' expand='true'>"""
|
||||||
|
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
|
||||||
|
"""</fold>
|
||||||
|
|
||||||
|
val result2 = <fold text='""" other multiline string ..."""' expand='true'>"""other multiline string
|
||||||
|
without spaces
|
||||||
|
"""</fold>
|
||||||
|
|
||||||
|
val empty = <fold text='"""..."""' expand='true'>"""
|
||||||
|
|
||||||
|
|
||||||
|
"""</fold>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
val result3 = """aaa"""
|
||||||
|
val result4 = "bbb"
|
||||||
|
val result5 = "ccc" +
|
||||||
|
"ddd"
|
||||||
|
val result6 = "eee" +
|
||||||
|
"""fff"""
|
||||||
@@ -78,6 +78,12 @@ public class KotlinFoldingTestGenerated extends AbstractKotlinFoldingTest {
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/noCollapse/oneImport.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/noCollapse/oneImport.kt");
|
||||||
doTest(fileName);
|
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")
|
@TestMetadata("idea/testData/folding/checkCollapse")
|
||||||
@@ -117,5 +123,11 @@ public class KotlinFoldingTestGenerated extends AbstractKotlinFoldingTest {
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/checkCollapse/imports.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/checkCollapse/imports.kt");
|
||||||
doSettingsFoldingTest(fileName);
|
doSettingsFoldingTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("multilineStrings.kt")
|
||||||
|
public void testMultilineStrings() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/folding/checkCollapse/multilineStrings.kt");
|
||||||
|
doSettingsFoldingTest(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user