From 762e9af19785bb5feee1418355c63abff5dc49b6 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 31 Jan 2012 20:19:33 +0400 Subject: [PATCH] Added folding building for templates. --- .../jetbrains/jet/plugin/JetFoldingBuilder.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java b/idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java index f36545242dd..aa01f8b61bc 100644 --- a/idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java +++ b/idea/src/org/jetbrains/jet/plugin/JetFoldingBuilder.java @@ -6,10 +6,13 @@ import com.intellij.lang.folding.FoldingDescriptor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.TextRange; +import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.JetNodeTypes; +import org.jetbrains.jet.lexer.JetTokens; import java.util.ArrayList; +import java.util.Collections; import java.util.List; /** @@ -26,9 +29,14 @@ public class JetFoldingBuilder implements FoldingBuilder, DumbAware { private void appendDescriptors(ASTNode node, Document document, List descriptors) { TextRange textRange = node.getTextRange(); - if ((node.getElementType() == JetNodeTypes.BLOCK || node.getElementType() == JetNodeTypes.CLASS_BODY) && + IElementType type = node.getElementType(); + if ((type == JetNodeTypes.BLOCK || type == JetNodeTypes.CLASS_BODY) && !isOneLine(textRange, document)) { descriptors.add(new FoldingDescriptor(node, textRange)); + } else if (type == JetNodeTypes.PARENTHESIZED && node.getFirstChildNode().getElementType() == JetTokens.IDE_TEMPLATE_START) { + if (node.getTreeParent().getTextLength() > 0) { + descriptors.add(new FoldingDescriptor(node, textRange, null, Collections.emptySet(), true)); + } } ASTNode child = node.getFirstChildNode(); while (child != null) { @@ -37,12 +45,16 @@ public class JetFoldingBuilder implements FoldingBuilder, DumbAware { } } - private boolean isOneLine(TextRange textRange, Document document) { + private static boolean isOneLine(TextRange textRange, Document document) { return document.getLineNumber(textRange.getStartOffset()) == document.getLineNumber(textRange.getEndOffset()); } @Override public String getPlaceholderText(@NotNull ASTNode astNode) { + if (astNode.getElementType() == JetNodeTypes.PARENTHESIZED && astNode.getFirstChildNode().getElementType() == JetTokens.IDE_TEMPLATE_START) { + ASTNode placeholderExpression = astNode.getFirstChildNode().getTreeNext(); + return placeholderExpression.getText(); + } return "{...}"; }