package ee.edio.garmin.editor; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.intellij.codeInsight.folding.CodeFoldingSettings; import com.intellij.lang.ASTNode; import com.intellij.lang.folding.FoldingBuilderEx; import com.intellij.lang.folding.FoldingDescriptor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.DumbAware; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import ee.edio.garmin.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; public class MonkeyFoldingBuilder extends FoldingBuilderEx implements DumbAware { @NotNull @Override public FoldingDescriptor[] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) { if (!(root instanceof MonkeyFile)) { return FoldingDescriptor.EMPTY; } MonkeyFile file = (MonkeyFile) root; if (!file.isContentsLoaded()) { return FoldingDescriptor.EMPTY; } List<FoldingDescriptor> result = Lists.newArrayList(); /*final PsiElement lastChild = file.getLastChild(); if (lastChild != null && lastChild instanceof MonkeyTypeDeclaration) { MonkeyTypeDeclaration typeDecl = (MonkeyTypeDeclaration) lastChild; List<MonkeyClassBodyDeclaration> classBodyDeclarationList = typeDecl.getClassDeclaration().getNormalClassDeclaration().getClassBody().getClassBodyDeclarationList(); for (MonkeyClassBodyDeclaration classBodyDeclaration : classBodyDeclarationList) { final MonkeyFunctionDeclaration functionDeclaration = classBodyDeclaration.getMemberDecl().getFunctionDeclaration(); if (functionDeclaration != null) { final List<MonkeyBlockStatement> blockStatementList = functionDeclaration.getBlockStatementList(); if (!blockStatementList.isEmpty()) { MonkeyBlockStatement block = blockStatementList.get(0); if (block != null && block.getTextRange().getLength() > 1) { result.add(new FoldingDescriptor(block, block.getTextRange())); } } } } }*/ return Iterables.toArray(result, FoldingDescriptor.class); } @Nullable @Override public String getPlaceholderText(@NotNull ASTNode node) { return "..."; } @Override public boolean isCollapsedByDefault(@NotNull ASTNode node) { CodeFoldingSettings codeFoldingSettings = CodeFoldingSettings.getInstance(); final IElementType elementType = node.getElementType(); final ASTNode treeParent = node.getTreeParent(); if (treeParent != null && treeParent.getPsi() instanceof MonkeyFunctionDeclaration) { return codeFoldingSettings.COLLAPSE_METHODS; } else if (elementType == MonkeyTypes.USING_DECLARATION) { return codeFoldingSettings.COLLAPSE_IMPORTS; } return false; } }