Skip to content

Commit 9c1aae4

Browse files
committed
feat(folding): add file reference folding support #101
This commit introduces a new file reference folding builder for the DevIn language, enhancing code folding capabilities within the IDE. The builder, located in `exts/devin-lang/src/main/kotlin/cc/unitmesh/devti/language/folding/DevInFileReferenceFoldingBuilder.kt`, is designed to collapse and expand sections of code that reference files, improving readability and navigation within complex file structures. The `buildFoldRegions` method is responsible for identifying elements within the PsiElement tree that represent file references and creating corresponding FoldingDescriptors. These descriptors are then used to define the regions that can be folded and unfolded by the IDE. The existing `exts/devin-lang/src/main/resources/cc.unitmesh.devti.language.xml` file has been modified to register the new folding builder alongside the existing custom variable folding builder. This ensures that both types of code folding are available to users of the DevIn language plugin.
1 parent 78d95fb commit 9c1aae4

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cc.unitmesh.devti.language.folding
2+
3+
import cc.unitmesh.devti.language.psi.DevInTypes
4+
import com.intellij.lang.ASTNode
5+
import com.intellij.lang.folding.FoldingBuilderEx
6+
import com.intellij.lang.folding.FoldingDescriptor
7+
import com.intellij.openapi.editor.Document
8+
import com.intellij.psi.PsiElement
9+
import com.intellij.psi.PsiElementVisitor
10+
import com.intellij.psi.util.elementType
11+
12+
class DevInFileReferenceFoldingBuilder : FoldingBuilderEx() {
13+
override fun isCollapsedByDefault(node: ASTNode): Boolean = true
14+
override fun getPlaceholderText(node: ASTNode): String {
15+
val parent = node.treeParent ?: return node.text
16+
val prop = parent.findChildByType(DevInTypes.PROPERTY_VALUE) ?: return node.text
17+
18+
return prop.text.split("/").last()
19+
}
20+
21+
override fun buildFoldRegions(root: PsiElement, document: Document, quick: Boolean): Array<FoldingDescriptor> {
22+
val descriptors = ArrayList<FoldingDescriptor>()
23+
root.accept(object : PsiElementVisitor() {
24+
override fun visitElement(element: PsiElement) {
25+
if (element.elementType == DevInTypes.AGENT_ID && element.text == "file" && isFileReference(element)) {
26+
descriptors.add(FoldingDescriptor(element.node, element.textRange, null, emptySet(), true))
27+
}
28+
29+
element.acceptChildren(this)
30+
}
31+
32+
private fun isFileReference(element: PsiElement): Boolean {
33+
val text = element.text
34+
return text.split("/").isNotEmpty()
35+
}
36+
})
37+
38+
return descriptors.toTypedArray()
39+
}
40+
}

exts/devin-lang/src/main/resources/cc.unitmesh.devti.language.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
<lang.foldingBuilder language="DevIn"
2424
implementationClass="cc.unitmesh.devti.language.folding.DevInCustomVariableFoldingBuilder"/>
25+
<lang.foldingBuilder language="DevIn"
26+
implementationClass="cc.unitmesh.devti.language.folding.DevInFileReferenceFoldingBuilder"/>
2527

2628
<languageInjector implementation="cc.unitmesh.devti.language.DevInLanguageInjector"/>
2729
</extensions>

0 commit comments

Comments
 (0)