diff --git a/src/main/java/org/jastadd/tooling/aspect/AspectStructureViewElement.java b/src/main/java/org/jastadd/tooling/aspect/AspectStructureViewElement.java index e4e40a1884863e6e00f55a2bc63e70b0664c88e9..23b477df6712205245ae6545fe99065ca491a6ec 100644 --- a/src/main/java/org/jastadd/tooling/aspect/AspectStructureViewElement.java +++ b/src/main/java/org/jastadd/tooling/aspect/AspectStructureViewElement.java @@ -1,23 +1,24 @@ package org.jastadd.tooling.aspect; +import com.intellij.icons.AllIcons; import com.intellij.ide.projectView.PresentationData; import com.intellij.ide.structureView.StructureViewTreeElement; import com.intellij.ide.util.treeView.smartTree.SortableTreeElement; import com.intellij.ide.util.treeView.smartTree.TreeElement; import com.intellij.navigation.ItemPresentation; +import com.intellij.openapi.util.NlsSafe; import com.intellij.psi.NavigatablePsiElement; +import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; -import org.jastadd.tooling.aspect.psi.AspectFile; -import org.jastadd.tooling.aspect.psi.JastAddAspectAspectBodyDeclaration; -import org.jastadd.tooling.aspect.psi.JastAddAspectAspectDeclaration; -import org.jastadd.tooling.aspect.psi.JastAddAspectTypeDeclaration; -import org.jastadd.tooling.aspect.psi.impl.JastAddAspectAspectDeclarationImpl; -import org.jastadd.tooling.aspect.psi.impl.JastAddAspectAspectInhAttributeDeclarationImpl; -import org.jastadd.tooling.aspect.psi.impl.JastAddAspectAspectSynAttributeDeclarationImpl; -import org.jastadd.tooling.aspect.psi.impl.JastAddAspectCollectionAttributeImpl; +import org.jastadd.tooling.aspect.psi.*; +import org.jastadd.tooling.aspect.psi.impl.*; +import org.jastadd.tooling.util.JastAddIcons; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import javax.swing.*; import java.util.Objects; +import java.util.stream.Collectors; public class AspectStructureViewElement implements StructureViewTreeElement, SortableTreeElement { @@ -58,9 +59,133 @@ public class AspectStructureViewElement implements StructureViewTreeElement, Sor @Override public ItemPresentation getPresentation() { ItemPresentation presentation = myElement.getPresentation(); + + if (presentation == null) { + if (myElement instanceof JastAddAspectAspectMethodDeclaration) { + presentation = new ItemPresentation() { + @Override + public String getPresentableText() { + return AspectStructureViewElement.getPresentableText((JastAddAspectAspectMethodDeclaration) myElement); + } + + @Override + public Icon getIcon(boolean unused) { + return AllIcons.Nodes.Method; + } + }; + } else if (myElement instanceof JastAddAspectAspectClassDeclaration) { + presentation = new ItemPresentation() { + @Override + public String getPresentableText() { + return AspectStructureViewElement.getPresentableText((JastAddAspectAspectClassDeclaration) myElement); + } + + @Override + public Icon getIcon(boolean unused) { + return AllIcons.Nodes.Class; + } + }; + } else if (myElement instanceof JastAddAspectAspectEnumDeclaration) { + presentation = new ItemPresentation() { + @Override + public String getPresentableText() { + return AspectStructureViewElement.getPresentableText((JastAddAspectAspectEnumDeclaration) myElement); + } + + @Override + public Icon getIcon(boolean unused) { + return AllIcons.Nodes.Enum; + } + }; + } else if (myElement instanceof JastAddAspectAspectInterfaceDeclaration) { + presentation = new ItemPresentation() { + @Override + public String getPresentableText() { + return AspectStructureViewElement.getPresentableText((JastAddAspectAspectInterfaceDeclaration) myElement); + } + + @Override + public Icon getIcon(boolean unused) { + return AllIcons.Nodes.Interface; + } + }; + } else if (myElement instanceof JastAddAspectAspectFieldDeclaration) { + presentation = new ItemPresentation() { + @Override + public String getPresentableText() { + return AspectStructureViewElement.getPresentableText((JastAddAspectAspectFieldDeclaration) myElement); + } + + @Override + public Icon getIcon(boolean unused) { + return AllIcons.Nodes.Field; + } + }; + } else if (myElement instanceof JastAddAspectAspectConstructorDeclaration) { + presentation = new ItemPresentation() { + @Override + public String getPresentableText() { + return AspectStructureViewElement.getPresentableText((JastAddAspectAspectConstructorDeclaration) myElement); + } + + @Override + public Icon getIcon(boolean unused) { + return AllIcons.Nodes.Method; + } + }; + } + + } + return presentation != null ? presentation : new PresentationData(); } + private static String getPresentableText(JastAddAspectAspectClassDeclaration decl) { + return decl.getModifiers().getText() + + " class " + decl.getClassDeclaration().getSimpleTypeName().getText(); + } + + private static String getPresentableText(JastAddAspectAspectEnumDeclaration decl) { + return decl.getModifiers().getText() + + " class " + decl.getSimpleTypeName().getText(); + } + + private static String getPresentableText(JastAddAspectAspectInterfaceDeclaration decl) { + return decl.getModifiers().getText() + + " class " + decl.getSimpleTypeName().getText(); + } + + private static String getPresentableText(JastAddAspectAspectFieldDeclaration decl) { + return decl.getModifiers().getText() + + " " + decl.getAstTypeName().getText() + + " : " + decl.getAspectType().getText(); + } + + private static String getPresentableText(JastAddAspectAspectConstructorDeclaration decl) { + return decl.getModifiers().getText() + + " " + decl.getAstTypeNameList().get(0).getText() + + "." + decl.getAstTypeNameList().get(1).getText() + + decl.getFormalParameters().getFormalParameterList().stream() + .map(JastAddAspectFormalParameter::getType) + .map(PsiElement::getText).collect(Collectors.joining(", ", "(", ")")); + } + + private static String getPresentableText(JastAddAspectAspectMethodDeclaration decl) { + return decl.getModifiers().getText() + + " " + decl.getAstTypeName().getText() + + "." + AspectStructureViewElement.getPresentableText(decl.getMethodDeclarator()) + " : " + + decl.getAspectResultType().getText(); + } + + private static String getPresentableText(JastAddAspectMethodDeclarator declarator) { + return declarator.getJavaIdentifier().getText() + + declarator.getFormalParameters().getFormalParameterList().stream() + .map(JastAddAspectFormalParameter::getType) + .map(PsiElement::getText).collect(Collectors.joining(", ", "(", ")")); + } + + + @Override public TreeElement @NotNull [] getChildren() { if (myElement instanceof AspectFile) { @@ -80,6 +205,18 @@ public class AspectStructureViewElement implements StructureViewTreeElement, Sor return new AspectStructureViewElement((JastAddAspectAspectInhAttributeDeclarationImpl) decl.getAspectInhAttributeDeclaration()); } else if (decl.getCollectionAttribute() != null) { return new AspectStructureViewElement((JastAddAspectCollectionAttributeImpl) decl.getCollectionAttribute()); + } else if (decl.getAspectMethodDeclaration() != null) { + return new AspectStructureViewElement((JastAddAspectAspectMethodDeclarationImpl) decl.getAspectMethodDeclaration()); + } else if (decl.getAspectClassDeclaration() != null) { + return new AspectStructureViewElement((JastAddAspectAspectClassDeclarationImpl) decl.getAspectClassDeclaration()); + } else if (decl.getAspectEnumDeclaration() != null) { + return new AspectStructureViewElement((JastAddAspectAspectEnumDeclarationImpl) decl.getAspectEnumDeclaration()); + } else if (decl.getAspectInterfaceDeclaration() != null) { + return new AspectStructureViewElement((JastAddAspectAspectInterfaceDeclarationImpl) decl.getAspectInterfaceDeclaration()); + } else if (decl.getAspectFieldDeclaration() != null) { + return new AspectStructureViewElement((JastAddAspectAspectFieldDeclarationImpl) decl.getAspectFieldDeclaration()); + } else if (decl.getAspectConstructorDeclaration()!= null) { + return new AspectStructureViewElement((JastAddAspectAspectConstructorDeclarationImpl) decl.getAspectConstructorDeclaration()); } return null; }) @@ -87,6 +224,13 @@ public class AspectStructureViewElement implements StructureViewTreeElement, Sor .toArray(TreeElement[]::new); } + + // aspect_refine_method_declaration + // aspect_refine_constructor_declaration + // aspect_rewrite + // aspect_add_interface + // aspect_extend_interface + return EMPTY_ARRAY; }