From a9b111df6084e0c7ac5e5fccc20a2c45d57f5a86 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sun, 3 Jan 2021 16:51:36 +0100
Subject: [PATCH] add symbol contributor (icon not working)

---
 .../RelAstGrammarChooseByNameContributor.java | 35 +++++++++++++++++++
 .../impl/RelAstGrammarNamedElementImpl.java   | 25 +++++++++++++
 src/main/resources/META-INF/plugin.xml        |  3 ++
 3 files changed, 63 insertions(+)
 create mode 100644 src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java

diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java b/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java
new file mode 100644
index 0000000..51ad305
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarChooseByNameContributor.java
@@ -0,0 +1,35 @@
+package org.jastadd.tooling;
+
+import com.intellij.navigation.ChooseByNameContributor;
+import com.intellij.navigation.NavigationItem;
+import com.intellij.openapi.project.Project;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class RelAstGrammarChooseByNameContributor implements ChooseByNameContributor {
+
+  @NotNull
+  @Override
+  public String @NotNull [] getNames(Project project, boolean includeNonProjectItems) {
+    List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project);
+    List<String> names = new ArrayList<>(typeDecls.size());
+    for (RelAstGrammarTypeDecl typeDecl : typeDecls) {
+      if (typeDecl.getName() != null && typeDecl.getName().length() > 0) {
+        names.add(typeDecl.getName());
+      }
+    }
+    return names.toArray(new String[0]);
+  }
+
+  @NotNull
+  @Override
+  public NavigationItem @NotNull [] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) {
+    // TODO: include non project items
+    List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project, name);
+    return typeDecls.toArray(new NavigationItem[0]);
+  }
+
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
index 11c41f4..f684e42 100644
--- a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
+++ b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarNamedElementImpl.java
@@ -2,12 +2,16 @@ package org.jastadd.tooling.psi.impl;
 
 import com.intellij.extapi.psi.ASTWrapperPsiElement;
 import com.intellij.lang.ASTNode;
+import com.intellij.navigation.ItemPresentation;
 import com.intellij.psi.PsiReference;
 import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry;
+import org.jastadd.tooling.JastAddIcons;
 import org.jastadd.tooling.psi.RelAstGrammarNamedElement;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import javax.swing.*;
+
 public abstract class RelAstGrammarNamedElementImpl extends ASTWrapperPsiElement implements RelAstGrammarNamedElement {
 
   protected RelAstGrammarNamedElementImpl(@NotNull ASTNode node) {
@@ -25,4 +29,25 @@ public abstract class RelAstGrammarNamedElementImpl extends ASTWrapperPsiElement
     return ReferenceProvidersRegistry.getReferencesFromProviders(this);
   }
 
+  @Override
+  public ItemPresentation getPresentation() {
+    return new ItemPresentation() {
+      @Nullable
+      @Override
+      public String getPresentableText() {
+        return getName();
+      }
+
+      @Override
+      public String getLocationString() {
+        return getContainingFile().getName();
+      }
+
+      @Override
+      public Icon getIcon(boolean unused) {
+        return JastAddIcons.FILE;
+      }
+    };
+  }
+
 }
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 321963c..f2d489f 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -40,6 +40,9 @@
 
         <lang.findUsagesProvider language="JastAddGrammar"
                                  implementationClass="org.jastadd.tooling.RelAstGrammarFindUsageProvider"/>
+
+        <gotoSymbolContributor
+            implementation="org.jastadd.tooling.RelAstGrammarChooseByNameContributor"/>
     </extensions>
 
     <actions>
-- 
GitLab