PageRenderTime 58ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/src/com/r4intellij/editor/RFoldingBuilder.java

https://code.google.com/
Java | 128 lines | 76 code | 22 blank | 30 comment | 21 complexity | 4d0cdb4912a50c470ae1ba07a2af65ba MD5 | raw file
  1. /*
  2. * Copyright 2011 Holger Brandl
  3. *
  4. * This code is licensed under BSD. For details see
  5. * http://www.opensource.org/licenses/bsd-license.php
  6. */
  7. package com.r4intellij.editor;
  8. import com.intellij.lang.ASTNode;
  9. import com.intellij.lang.folding.FoldingBuilder;
  10. import com.intellij.lang.folding.FoldingDescriptor;
  11. import com.intellij.openapi.editor.Document;
  12. import com.intellij.openapi.util.TextRange;
  13. import com.intellij.psi.PsiElement;
  14. import com.r4intellij.lang.parser.RParserDefinition;
  15. import com.r4intellij.psi.RFile;
  16. import com.r4intellij.psi.RFundef;
  17. import com.r4intellij.psi.RFundefArgs;
  18. import com.r4intellij.psi.RSection;
  19. import com.r4intellij.psi.impl.RSectionImpl;
  20. import org.jetbrains.annotations.NotNull;
  21. import java.util.ArrayList;
  22. import java.util.List;
  23. import static com.r4intellij.psi.RTypes.R_FUNDEF;
  24. import static com.r4intellij.psi.RTypes.R_SECTION;
  25. /**
  26. * Defines how code folding should behave for Arc files
  27. */
  28. public class RFoldingBuilder implements FoldingBuilder {
  29. public String getPlaceholderText(@NotNull ASTNode node) {
  30. if (node.getElementType() == R_FUNDEF) {
  31. RFundef def = (RFundef) node.getPsi();
  32. RFundefArgs funargs = def.getFundefArgs();
  33. if (funargs != null) {
  34. return "function(" + funargs.getText() + ")...";
  35. } else {
  36. return "function()...";
  37. }
  38. }
  39. if (node.getPsi() instanceof RSection) {
  40. RSectionImpl rSection = (RSectionImpl) node.getPsi();
  41. return "# Section: " + rSection.getName();
  42. }
  43. // } else if (node.getElementType() == MACRO_DEFINITION) {
  44. // Mac def = (Mac) node.getPsi();
  45. // return "(mac " + def.getName() + " ...)";
  46. // } else if (node.getElementType() == SINGLE_ARG_ANONYMOUS_FUNCTION_DEFINITION) {
  47. // return "[...]";
  48. // } else if (node.getElementType() == ANONYMOUS_FUNCTION_DEFINITION) {
  49. // return "(fn ...)";
  50. // } else if (node.getElementType() == BLOCK_COMMENT || node.getElementType() == MULTILINE_COMMENT) {
  51. // String text = node.getText();
  52. // return text.length() > 20 ? text.substring(0, 20) + "..." : text;
  53. // }
  54. return null;
  55. }
  56. public boolean isCollapsedByDefault(ASTNode node) {
  57. return false;
  58. }
  59. public FoldingDescriptor[] buildFoldRegions(ASTNode node, Document document) {
  60. touchTree(node);
  61. List<FoldingDescriptor> descriptors = new ArrayList<FoldingDescriptor>();
  62. appendDescriptors(node, descriptors);
  63. return descriptors.toArray(new FoldingDescriptor[descriptors.size()]);
  64. }
  65. /**
  66. * We have to touch the PSI tree to get the folding to show up when we first open a file
  67. */
  68. private void touchTree(ASTNode node) {
  69. if (node.getElementType() == RParserDefinition.FILE) {
  70. final PsiElement firstChild = node.getPsi().getFirstChild();
  71. }
  72. }
  73. private void appendDescriptors(final ASTNode node, final List<FoldingDescriptor> descriptors) {
  74. if (node.getElementType() == R_FUNDEF) {
  75. descriptors.add(new FoldingDescriptor(node, node.getTextRange()));
  76. } else if (node.getElementType() == R_SECTION) {
  77. // descriptors.add(new FoldingDescriptor(node, node.getTextRange()));
  78. // PsiElement sectionElement = node.getPsi().getParent().getNextSibling();
  79. PsiElement sectionElement = null;
  80. List<RSection> rSections = ((RFile) node.getPsi().getContainingFile()).calcSections();
  81. for (RSection rSection : rSections) {
  82. if (rSection.getTextOffset() > node.getPsi().getTextOffset()) {
  83. sectionElement = rSection;
  84. break;
  85. }
  86. }
  87. int end = sectionElement != null ? sectionElement.getTextOffset() - 1 : node.getPsi().getContainingFile().getTextRange().getEndOffset();
  88. descriptors.add(new FoldingDescriptor(node, new TextRange(node.getStartOffset(), end)));
  89. }
  90. ASTNode child = node.getFirstChildNode();
  91. while (child != null) {
  92. appendDescriptors(child, descriptors);
  93. child = child.getTreeNext();
  94. }
  95. }
  96. private boolean isFoldableNode(ASTNode node) {
  97. return (node.getElementType() == R_FUNDEF
  98. || node.getElementType() == R_SECTION
  99. // || (node.getElementType() == MACRO_DEFINITION)
  100. // || (node.getElementType() == SINGLE_ARG_ANONYMOUS_FUNCTION_DEFINITION)
  101. // || (node.getElementType() == ANONYMOUS_FUNCTION_DEFINITION)
  102. // || (node.getElementType() == MULTILINE_COMMENT)
  103. // || (node.getElementType() == BLOCK_COMMENT
  104. );
  105. }
  106. }