From fbee8d618a9be1cd4808f6f1f7a3b30e79771aca Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Sun, 3 Jan 2021 17:01:52 +0100 Subject: [PATCH] add structure view --- .../RelAstGrammarStructureViewElement.java | 74 +++++++++++++++++++ .../RelAstGrammarStructureViewFactory.java | 26 +++++++ .../RelAstGrammarStructureViewModel.java | 34 +++++++++ src/main/resources/META-INF/plugin.xml | 6 +- 4 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java create mode 100644 src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java create mode 100644 src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java new file mode 100644 index 0000000..dd6e74d --- /dev/null +++ b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewElement.java @@ -0,0 +1,74 @@ +package org.jastadd.tooling; + +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.psi.NavigatablePsiElement; +import com.intellij.psi.util.PsiTreeUtil; +import org.jastadd.tooling.psi.RelAstGrammarFile; +import org.jastadd.tooling.psi.RelAstGrammarTypeDecl; +import org.jastadd.tooling.psi.impl.RelAstGrammarTypeDeclImpl; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class RelAstGrammarStructureViewElement implements StructureViewTreeElement, SortableTreeElement { + + private final NavigatablePsiElement myElement; + + public RelAstGrammarStructureViewElement(NavigatablePsiElement element) { + this.myElement = element; + } + + @Override + public Object getValue() { + return myElement; + } + + @Override + public void navigate(boolean requestFocus) { + myElement.navigate(requestFocus); + } + + @Override + public boolean canNavigate() { + return myElement.canNavigate(); + } + + @Override + public boolean canNavigateToSource() { + return myElement.canNavigateToSource(); + } + + @NotNull + @Override + public String getAlphaSortKey() { + String name = myElement.getName(); + return name != null ? name : ""; + } + + @NotNull + @Override + public ItemPresentation getPresentation() { + ItemPresentation presentation = myElement.getPresentation(); + return presentation != null ? presentation : new PresentationData(); + } + + @NotNull + @Override + public TreeElement @NotNull [] getChildren() { + if (myElement instanceof RelAstGrammarFile) { + List<RelAstGrammarTypeDecl> properties = PsiTreeUtil.getChildrenOfTypeAsList(myElement, RelAstGrammarTypeDecl.class); + List<TreeElement> treeElements = new ArrayList<>(properties.size()); + for (RelAstGrammarTypeDecl property : properties) { + treeElements.add(new RelAstGrammarStructureViewElement((RelAstGrammarTypeDeclImpl) property)); + } + return treeElements.toArray(new TreeElement[0]); + } + return EMPTY_ARRAY; + } + +} diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java new file mode 100644 index 0000000..23b14e4 --- /dev/null +++ b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewFactory.java @@ -0,0 +1,26 @@ +package org.jastadd.tooling; + +import com.intellij.ide.structureView.StructureViewBuilder; +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.TreeBasedStructureViewBuilder; +import com.intellij.lang.PsiStructureViewFactory; +import com.intellij.openapi.editor.Editor; +import com.intellij.psi.PsiFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class RelAstGrammarStructureViewFactory implements PsiStructureViewFactory { + + @Nullable + @Override + public StructureViewBuilder getStructureViewBuilder(@NotNull final PsiFile psiFile) { + return new TreeBasedStructureViewBuilder() { + @NotNull + @Override + public StructureViewModel createStructureViewModel(@Nullable Editor editor) { + return new RelAstGrammarStructureViewModel(psiFile); + } + }; + } + +} diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java new file mode 100644 index 0000000..9f164f0 --- /dev/null +++ b/src/main/java/org/jastadd/tooling/RelAstGrammarStructureViewModel.java @@ -0,0 +1,34 @@ +package org.jastadd.tooling; + +import com.intellij.ide.structureView.StructureViewModel; +import com.intellij.ide.structureView.StructureViewModelBase; +import com.intellij.ide.structureView.StructureViewTreeElement; +import com.intellij.ide.util.treeView.smartTree.Sorter; +import com.intellij.psi.PsiFile; +import org.jastadd.tooling.psi.RelAstGrammarFile; +import org.jetbrains.annotations.NotNull; + +public class RelAstGrammarStructureViewModel extends StructureViewModelBase implements + StructureViewModel.ElementInfoProvider { + + public RelAstGrammarStructureViewModel(PsiFile psiFile) { + super(psiFile, new RelAstGrammarStructureViewElement(psiFile)); + } + + @NotNull + public Sorter[] getSorters() { + return new Sorter[]{Sorter.ALPHA_SORTER}; + } + + + @Override + public boolean isAlwaysShowsPlus(StructureViewTreeElement element) { + return false; + } + + @Override + public boolean isAlwaysLeaf(StructureViewTreeElement element) { + return element instanceof RelAstGrammarFile; + } + +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index f2d489f..29eb792 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -41,8 +41,10 @@ <lang.findUsagesProvider language="JastAddGrammar" implementationClass="org.jastadd.tooling.RelAstGrammarFindUsageProvider"/> - <gotoSymbolContributor - implementation="org.jastadd.tooling.RelAstGrammarChooseByNameContributor"/> + <gotoSymbolContributor implementation="org.jastadd.tooling.RelAstGrammarChooseByNameContributor"/> + + <lang.psiStructureViewFactory language="JastAddGrammar" + implementationClass="org.jastadd.tooling.RelAstGrammarStructureViewFactory"/> </extensions> <actions> -- GitLab