IntelliJ Platform SDK DevGuide

12. Folding Builder

折叠构建器可帮助您折叠代码区域并将其替换为特定文本.

12.1.

定义折叠构建器

我们默认使用其值替换属性的用法.

package com.simpleplugin; import com.intellij.lang.ASTNode; import com.intellij.lang.folding.*; import com.intellij.openapi.editor.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.simpleplugin.psi.SimpleProperty; import org.jetbrains.annotations.*; import java.util.*; public class SimpleFoldingBuilder extends FoldingBuilderEx { @NotNull @Override public FoldingDescriptor[] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) { FoldingGroup group = FoldingGroup.newGroup("simple"); List<FoldingDescriptor> descriptors = new ArrayList<FoldingDescriptor>(); Collection<PsiLiteralExpression> literalExpressions = PsiTreeUtil.findChildrenOfType(root, PsiLiteralExpression.class); for (final PsiLiteralExpression literalExpression : literalExpressions) { String value = literalExpression.getValue() instanceof String ? (String) literalExpression.getValue() : null; if (value != null && value.startsWith("simple:")) { Project project = literalExpression.getProject(); String key = value.substring(7); final List<SimpleProperty> properties = SimpleUtil.findProperties(project, key); if (properties.size() == 1) { descriptors.add(new FoldingDescriptor(literalExpression.getNode(), new TextRange(literalExpression.getTextRange().getStartOffset() + 1, literalExpression.getTextRange().getEndOffset() - 1), group) { @Nullable @Override public String getPlaceholderText() { // IMPORTANT: keys can come with no values, so a test for null is needed // IMPORTANT: Convert embedded \n to backslash n, so that the string will look like it has LF embedded // in it and embedded " to escaped " String valueOf = properties.get(0).getValue(); return valueOf == null ? "" : valueOf.replaceAll("\n", "\\n").replaceAll("\"", "\\\\\""); } }); } } } return descriptors.toArray(new FoldingDescriptor[descriptors.size()]); } @Nullable @Override public String getPlaceholderText(@NotNull ASTNode node) { return "..."; } @Override public boolean isCollapsedByDefault(@NotNull ASTNode node) { return true; } }

12.2.

注册折叠构建器

<lang.foldingBuilder language="JAVA" implementationClass="com.simpleplugin.SimpleFoldingBuilder"/>

12.3.

运行该项目

现在,当我们打开一个Java文件时,它会显示属性的值而不是键.

折叠

Last modified: 11 May 2019