diff --git a/CHANGELOG.md b/CHANGELOG.md index b03834d3988b4bb53aca8ff01d9e8f0cbccb696e..379e15647eb3ae29e4e67ac39506c301b87eef75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ - Note that although it works in the Java embeddings within aspects, it does *not* work in "real" Java classes. - Please use this feature with caution. As with most refactoring tools, it is quite fragile and won't give correct results in all cases. +- Folding support for aspect files. + - Aspects and most blocks now can be folded. ### Changed diff --git a/src/main/grammar/Aspect.bnf b/src/main/grammar/Aspect.bnf index 3dd6a28e556abd7d816b8be2889bbcc9450832db..aca28a62073d58a3b791091d1a9fdb38f5951942 100644 --- a/src/main/grammar/Aspect.bnf +++ b/src/main/grammar/Aspect.bnf @@ -173,7 +173,7 @@ class_body_declaration ::= initializer | modifiers ( unmodified_class_declaratio interface_declaration ::= unmodified_interface_declaration -unmodified_interface_declaration ::= INTERFACE IDENTIFIER type_parameters? (EXTENDS type_name_list)? LBRACE interface_member_declaration RBRACE +unmodified_interface_declaration ::= INTERFACE IDENTIFIER type_parameters? (EXTENDS type_name_list)? LBRACE interface_member_declaration* RBRACE interface_member_declaration ::= modifiers (unmodified_class_declaration | unmodified_interface_declaration | field_declaration | method_declaration) | SEMICOLON diff --git a/src/main/java/org/jastadd/tooling/aspect/AspectFoldingBuilder.java b/src/main/java/org/jastadd/tooling/aspect/AspectFoldingBuilder.java new file mode 100644 index 0000000000000000000000000000000000000000..5e28dbfe6259e790e2dc3f12669d00bbfbb79245 --- /dev/null +++ b/src/main/java/org/jastadd/tooling/aspect/AspectFoldingBuilder.java @@ -0,0 +1,69 @@ +package org.jastadd.tooling.aspect; + + +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.editor.FoldingGroup; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import org.jastadd.tooling.aspect.psi.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class AspectFoldingBuilder extends FoldingBuilderEx { + + @Override + public FoldingDescriptor @NotNull [] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) { + List<FoldingDescriptor> descriptors = new ArrayList<>(); + Collection<JastAddAspectAspectDeclaration> aspectDeclarations = PsiTreeUtil.findChildrenOfType(root, JastAddAspectAspectDeclaration.class); + for (final JastAddAspectAspectDeclaration aspectDeclaration : aspectDeclarations) { + descriptors.add(new FoldingDescriptor(aspectDeclaration.getNode(), + new TextRange(aspectDeclaration.getAspectBody().getTextRange().getStartOffset() + 1, + aspectDeclaration.getAspectBody().getTextRange().getEndOffset() - 1))); + } + Collection<JastAddAspectClassDeclaration> classDeclarations = PsiTreeUtil.findChildrenOfType(root, JastAddAspectClassDeclaration.class); + for (final JastAddAspectClassDeclaration classDeclaration : classDeclarations) { + descriptors.add(new FoldingDescriptor(classDeclaration.getNode(), + new TextRange(classDeclaration.getClassBody().getTextRange().getStartOffset() + 1, + classDeclaration.getClassBody().getTextRange().getEndOffset() - 1))); + } + Collection<JastAddAspectEnumBody> enumBodies = PsiTreeUtil.findChildrenOfType(root, JastAddAspectEnumBody.class); + for (final JastAddAspectEnumBody enumBody : enumBodies) { + descriptors.add(new FoldingDescriptor(enumBody.getNode(), + new TextRange(enumBody.getTextRange().getStartOffset() + 1, + enumBody.getTextRange().getEndOffset() - 1))); + } + Collection<JastAddAspectAnnotationTypeBody> annotationTypeBodies = PsiTreeUtil.findChildrenOfType(root, JastAddAspectAnnotationTypeBody.class); + for (final JastAddAspectAnnotationTypeBody annotationTypeBody : annotationTypeBodies) { + descriptors.add(new FoldingDescriptor(annotationTypeBody.getNode(), + new TextRange(annotationTypeBody.getTextRange().getStartOffset() + 1, + annotationTypeBody.getTextRange().getEndOffset() - 1))); + } + Collection<JastAddAspectBlock> aspectBlocks = PsiTreeUtil.findChildrenOfType(root, JastAddAspectBlock.class); + for (final JastAddAspectBlock block : aspectBlocks) { + descriptors.add(new FoldingDescriptor(block.getNode(), + new TextRange(block.getTextRange().getStartOffset() + 1, + block.getTextRange().getEndOffset() - 1))); + } + return descriptors.toArray(new FoldingDescriptor[0]); + } + + @Nullable + @Override + public String getPlaceholderText(@NotNull ASTNode node) { + return " ... "; + } + + @Override + public boolean isCollapsedByDefault(@NotNull ASTNode node) { + return false; + } + +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index a9b7feec56cba1ca3ce62fdb1bbb238ad4fef635..a41624890b5ba72d39f91aa10a63e9fb19276af3 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -89,6 +89,9 @@ implementationClass="org.jastadd.tooling.aspect.psi.JastAddAspectClassOrInterfaceTypeManipulator"/> <lang.formatter language="JastAddAspect" implementationClass="org.jastadd.tooling.aspect.AspectFormattingModelBuilder"/> + + <lang.foldingBuilder language="JastAddAspect" implementationClass="org.jastadd.tooling.aspect.AspectFoldingBuilder"/> + FoldingBuilder"/> </extensions> <actions>