package com.bitbakery.plugin.arc;
/*
* Copyright (c) Kurt Christensen, 2009
*
* Licensed under the Artistic License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at:
*
* http://www.opensource.org/licenses/artistic-license-2.0.php
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License..
*/
import static com.bitbakery.plugin.arc.lexer.ArcTokenTypes.*;
import com.bitbakery.plugin.arc.psi.ArcElementTypes;
import static com.bitbakery.plugin.arc.psi.ArcElementTypes.*;
import com.bitbakery.plugin.arc.psi.Def;
import com.bitbakery.plugin.arc.psi.Mac;
import com.intellij.lang.ASTNode;
import com.intellij.lang.folding.FoldingBuilder;
import com.intellij.lang.folding.FoldingDescriptor;
import com.intellij.openapi.editor.Document;
import com.intellij.psi.PsiElement;
import java.util.ArrayList;
import java.util.List;
/**
* Defines how code folding should behave for Arc files
*/
public class ArcFoldingBuilder implements FoldingBuilder {
public String getPlaceholderText(ASTNode node) {
if (node.getElementType() == FUNCTION_DEFINITION) {
Def def = (Def) node.getPsi();
return "(def " + def.getName() + " ...)";
} else if (node.getElementType() == MACRO_DEFINITION) {
Mac def = (Mac) node.getPsi();
return "(mac " + def.getName() + " ...)";
} else if (node.getElementType() == SINGLE_ARG_ANONYMOUS_FUNCTION_DEFINITION) {
return "[...]";
} else if (node.getElementType() == ANONYMOUS_FUNCTION_DEFINITION) {
return "(fn ...)";
} else if (node.getElementType() == BLOCK_COMMENT || node.getElementType() == MULTILINE_COMMENT) {
String text = node.getText();
return text.length() > 20 ? text.substring(0, 20) + "..." : text;
}
return null;
}
public boolean isCollapsedByDefault(ASTNode node) {
return false;
}
public FoldingDescriptor[] buildFoldRegions(ASTNode node, Document document) {
touchTree(node);
List<FoldingDescriptor> descriptors = new ArrayList<FoldingDescriptor>();
appendDescriptors(node, descriptors);
return descriptors.toArray(new FoldingDescriptor[descriptors.size()]);
}
/**
* We have to touch the PSI tree to get the folding to show up when we first open a file
*/
private void touchTree(ASTNode node) {
if (node.getElementType() == ArcElementTypes.FILE) {
final PsiElement firstChild = node.getPsi().getFirstChild();
}
}
private void appendDescriptors(final ASTNode node, final List<FoldingDescriptor> descriptors) {
if (isFoldableNode(node)) {
descriptors.add(new FoldingDescriptor(node, node.getTextRange()));
}
ASTNode child = node.getFirstChildNode();
while (child != null) {
appendDescriptors(child, descriptors);
child = child.getTreeNext();
}
}
private boolean isFoldableNode(ASTNode node) {
return (node.getElementType() == FUNCTION_DEFINITION)
|| (node.getElementType() == MACRO_DEFINITION)
|| (node.getElementType() == SINGLE_ARG_ANONYMOUS_FUNCTION_DEFINITION)
|| (node.getElementType() == ANONYMOUS_FUNCTION_DEFINITION)
|| (node.getElementType() == MULTILINE_COMMENT)
|| (node.getElementType() == BLOCK_COMMENT);
}
}