From 9029afb7a8863e7d3ae3883a1d18bbdf9a190c80 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Fri, 1 Jan 2021 18:41:10 +0100
Subject: [PATCH] add usage provider

---
 .../RelAstGrammarFindUsageProvider.java       | 67 +++++++++++++++++++
 src/main/resources/META-INF/plugin.xml        |  4 ++
 2 files changed, 71 insertions(+)
 create mode 100644 src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java

diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java b/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
new file mode 100644
index 0000000..3f8f4c5
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
@@ -0,0 +1,67 @@
+package org.jastadd.tooling;
+
+import com.intellij.lang.cacheBuilder.DefaultWordsScanner;
+import com.intellij.lang.cacheBuilder.WordsScanner;
+import com.intellij.lang.findUsages.FindUsagesProvider;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.tree.TokenSet;
+import org.jastadd.tooling.lexer.RelAstGrammarFlexAdapter;
+import org.jastadd.tooling.parser.RelAstGrammarTypes;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class RelAstGrammarFindUsageProvider implements FindUsagesProvider {
+
+  @Nullable
+  @Override
+  public WordsScanner getWordsScanner() {
+    // TODO comments are not working
+    return new DefaultWordsScanner(new RelAstGrammarFlexAdapter(),
+      TokenSet.create(RelAstGrammarTypes.ID),
+      TokenSet.create(RelAstGrammarTypes.MULTILINECOMMENT, RelAstGrammarTypes.DOCCOMMENT, RelAstGrammarTypes.SINGLELINECOMMENT),
+      TokenSet.EMPTY);
+  }
+
+  @Override
+  public boolean canFindUsagesFor(@NotNull PsiElement psiElement) {
+    return psiElement instanceof RelAstGrammarTypeDecl; // was: PsiNamedElement
+  }
+
+  @Nullable
+  @Override
+  public String getHelpId(@NotNull PsiElement psiElement) {
+    return null;
+  }
+
+  @NotNull
+  @Override
+  public String getType(@NotNull PsiElement element) {
+    if (element instanceof RelAstGrammarTypeDecl) {
+      return "JastAdd Nonterminal Type";
+    } else {
+      return "";
+    }
+  }
+
+  @NotNull
+  @Override
+  public String getDescriptiveName(@NotNull PsiElement element) {
+    if (element instanceof RelAstGrammarTypeDecl && ((RelAstGrammarTypeDecl) element).getName() != null) {
+      return ((RelAstGrammarTypeDecl) element).getName();
+    } else {
+      return "";
+    }
+  }
+
+  @NotNull
+  @Override
+  public String getNodeText(@NotNull PsiElement element, boolean useFullName) {
+    if (element instanceof RelAstGrammarTypeDecl) {
+      return ((RelAstGrammarTypeDecl) element).getText();
+    } else {
+      return "";
+    }
+  }
+
+}
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 6c566e8..7bb097d 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -38,6 +38,10 @@
                                  implementationClass="org.jastadd.tooling.RelAstGrammarRefactoringSupportProvider"/>
 
         <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference" implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/>
+
+
+        <lang.findUsagesProvider language="JastAddGrammar"
+                                 implementationClass="org.jastadd.tooling.RelAstGrammarFindUsageProvider"/>
     </extensions>
 
     <actions>
-- 
GitLab