From 34ba46d9fe3d1fedee49675f5365a8d5e8fa2f65 Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Sat, 2 Jan 2021 02:10:46 +0100
Subject: [PATCH] switch to kotlin gradle dsl and make build gradle compliant

---
 CHANGELOG.md                                  |   7 +
 README.md                                     |   5 +
 build.gradle                                  |  94 ----------
 build.gradle.kts                              | 164 ++++++++++++++++++
 gradle.properties                             |  22 +++
 settings.gradle => settings.gradle.kts        |   2 +-
 src/main/grammar/RelAstGrammar.bnf            |  10 +-
 .../RelAstGrammarCompletionContributor.java   |  12 +-
 .../RelAstGrammarFindUsageProvider.java       |  12 +-
 .../tooling/RelAstGrammarReference.java       |   8 +-
 .../jastadd/tooling/RelAstGrammarUtil.java    |  14 +-
 .../psi/RelAstGrammarTypeDeclExtension.java   |   4 +
 .../RelAstGrammarTypeReferenceExtension.java  |   4 +
 .../psi/impl/RelAstGrammarPsiImplUtil.java    |  74 --------
 .../RelAstGrammarTypeDeclImplExtension.java   |  47 +++++
 ...lAstGrammarTypeReferenceImplExtension.java |  35 ++++
 src/main/resources/META-INF/plugin.xml        |   6 +-
 17 files changed, 320 insertions(+), 200 deletions(-)
 create mode 100644 CHANGELOG.md
 create mode 100644 README.md
 delete mode 100644 build.gradle
 create mode 100644 build.gradle.kts
 create mode 100644 gradle.properties
 rename settings.gradle => settings.gradle.kts (100%)
 create mode 100644 src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java
 create mode 100644 src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java
 delete mode 100644 src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java
 create mode 100644 src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java
 create mode 100644 src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java

diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..201bebf
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+<!-- Keep a Changelog guide -> https://keepachangelog.com -->
+
+# JastAdd Plugin Changelog
+
+## [Unreleased]
+### Changed
+- Changed build script to Kotlin DSL
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9136fd6
--- /dev/null
+++ b/README.md
@@ -0,0 +1,5 @@
+# JastAdd Language Support
+
+<!-- Plugin description -->
+This plugin provides support for JastAdd and Relational RAGs
+<!-- Plugin description end -->
diff --git a/build.gradle b/build.gradle
deleted file mode 100644
index 9235182..0000000
--- a/build.gradle
+++ /dev/null
@@ -1,94 +0,0 @@
-plugins {
-    id 'java'
-    id 'org.jetbrains.intellij' version '0.6.5'
-    id "org.jetbrains.grammarkit" version "2020.3.2"
-    id 'idea'
-}
-
-group = "org.jastadd"
-version = "1.0-SNAPSHOT"
-
-repositories {
-    mavenCentral()
-}
-
-runIde {
-    jvmArgs '--add-exports', 'java.base/jdk.internal.vm=ALL-UNNAMED'
-}
-
-//Kotlin DSL:
-//
-//tasks.runIde {
-//    jvmArgs("--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED")
-//}
-
-
-sourceSets {
-    main.java.srcDirs += "src/gen/java"
-}
-
-apply plugin: 'idea'
-apply plugin: 'org.jetbrains.grammarkit'
-
-idea {
-    module {
-        generatedSourceDirs += file('src/gen/java')
-    }
-}
-
-dependencies {
-    testImplementation group: 'junit', name: 'junit', version: '4.12'
-}
-
-// See https://github.com/JetBrains/gradle-intellij-plugin/
-intellij {
-    version = "2020.2.4"
-    plugins = ['java']
-}
-
-
-
-import org.jetbrains.grammarkit.tasks.*
-
-grammarKit {
-    // version of IntelliJ patched JFlex (see bintray link below), Default is 1.7.0-1
-    jflexRelease = '1.7.0-1'
-
-    // tag or short commit hash of Grammar-Kit to use (see link below). Default is 2020.3.1
-    grammarKitRelease = '2020.3.1'
-}
-
-patchPluginXml {
-    changeNotes """
-      Add change notes here.<br>
-      <em>most HTML tags may be used</em>"""
-}
-
-task generateRelAstGrammarParser(type: GenerateParser) {
-
-    // source bnf file
-    source = "src/main/grammar/RelAstGrammar.bnf"
-
-    // optional, task-specific root for the generated files. Default: none
-    targetRoot = 'src/gen/java'
-
-    // path to a parser file, relative to the targetRoot
-    pathToParser = '/org/jastadd/tooling/RelAstGrammarParser.java'
-
-    // path to a directory with generated psi files, relative to the targetRoot
-    pathToPsiRoot = '/org/jastadd/tooling/psi'
-
-    // if set, plugin will remove a parser output file and psi output directory before generating new ones. Default: false
-    purgeOldFiles = true
-}
-
-task generateRelAstGrammarLexer(type: GenerateLexer) {
-
-    source = "src/main/grammar/RelAstGrammar.flex"
-
-    targetDir = 'src/gen/java/org/jastadd/tooling/lexer/'
-
-    targetClass = 'RelAstGrammarLexer'
-
-    purgeOldFiles = true
-}
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000..0bf2dc5
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,164 @@
+import org.jetbrains.changelog.closure
+import org.jetbrains.changelog.markdownToHTML
+import org.jetbrains.grammarkit.tasks.GenerateLexer
+import org.jetbrains.grammarkit.tasks.GenerateParser
+
+plugins {
+    // IDE support
+    idea
+    // Java support
+    id("java")
+    // gradle-intellij-plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin
+    id("org.jetbrains.intellij") version "0.6.5"
+    // gradle-changelog-plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin
+    id("org.jetbrains.changelog") version "0.6.2"
+    // Grammar-Kit - read more: https://github.com/JetBrains/Grammar-Kit
+    id("org.jetbrains.grammarkit") version "2020.3.2"
+}
+
+// Import variables from gradle.properties file
+val pluginGroup: String by project
+// `pluginName_` variable ends with `_` because of the collision with Kotlin magic getter in the `intellij` closure.
+// Read more about the issue: https://github.com/JetBrains/intellij-platform-plugin-template/issues/29
+val pluginName_: String by project
+val pluginVersion: String by project
+val pluginSinceBuild: String by project
+val pluginUntilBuild: String by project
+val pluginVerifierIdeVersions: String by project
+
+val platformType: String by project
+val platformVersion: String by project
+val platformPlugins: String by project
+val platformDownloadSources: String by project
+
+
+
+apply {
+    plugin("idea")
+    plugin("org.jetbrains.grammarkit")
+    plugin("org.jetbrains.intellij")
+}
+
+group = pluginGroup
+version = pluginVersion
+
+// Configure project's dependencies
+repositories {
+    mavenCentral()
+    jcenter()
+}
+
+idea {
+    module {
+        generatedSourceDirs.add(file("src/gen"))
+    }
+}
+
+// Configure gradle-intellij-plugin plugin.
+// Read more: https://github.com/JetBrains/gradle-intellij-plugin
+intellij {
+    pluginName = pluginName_
+//    version = platformVersion
+//    type = platformType
+    downloadSources = platformDownloadSources.toBoolean()
+    updateSinceUntilBuild = true
+
+    // Plugin Dependencies. Uses `platformPlugins` property from the gradle.properties file.
+    setPlugins("java")
+}
+
+sourceSets {
+    main {
+        java.srcDir("src/gen/java")
+    }
+}
+
+//import org.jetbrains.grammarkit.tasks.*
+//
+grammarKit {
+    // version of IntelliJ patched JFlex (see bintray link below), Default is 1.7.0-1
+    jflexRelease = "1.7.0-1"
+
+    // tag or short commit hash of Grammar-Kit to use (see link below). Default is 2020.3.1
+    grammarKitRelease = "2020.3.1"
+}
+
+tasks {
+
+    val generateRelAstGrammarLexer = task<GenerateLexer>("generateRelAstGrammarLexer") {
+        source = "src/main/grammar/RelAstGrammar.flex"
+        targetDir = "src/gen/java/org/jastadd/tooling/lexer/"
+        targetClass = "RelAstGrammarLexer"
+        purgeOldFiles = true
+    }
+
+    // not fully working because of https://github.com/JetBrains/gradle-grammar-kit-plugin/issues/3
+    val generateRelAstGrammarParser = task<GenerateParser>("generateRelAstGrammarParser") {
+        source = "src/main/grammar/RelAstGrammar.bnf"
+        targetRoot = "src/gen/java"
+        pathToParser = "/org/jastadd/tooling/RelAstGrammarParser.java"
+        pathToPsiRoot = "/org/jastadd/tooling/psi"
+        purgeOldFiles = true
+    }
+
+    compileJava {
+        dependsOn(generateRelAstGrammarLexer)
+        dependsOn(generateRelAstGrammarParser)
+    }
+
+    withType<JavaCompile> {
+        sourceCompatibility = "11" // "1.8"
+        targetCompatibility = "11" // "1.8"
+    }
+
+    runIde {
+        jvmArgs("--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED")
+    }
+
+    buildSearchableOptions {
+        jvmArgs("--add-exports", "java.base/jdk.internal.vm=ALL-UNNAMED")
+        enabled = false // see https://youtrack.jetbrains.com/issue/KTIJ-782
+    }
+
+    patchPluginXml {
+
+        version(pluginVersion)
+        setSinceBuild(pluginSinceBuild)
+        untilBuild(pluginUntilBuild)
+
+        // Extract the <!-- Plugin description --> section from README.md and provide for the plugin's manifest
+        pluginDescription(
+            closure {
+                File("./README.md").readText().lines().run {
+                    val start = "<!-- Plugin description -->"
+                    val end = "<!-- Plugin description end -->"
+
+                    if (!containsAll(listOf(start, end))) {
+                        throw GradleException("Plugin description section not found in README.md:\n$start ... $end")
+                    }
+                    subList(indexOf(start) + 1, indexOf(end))
+                }.joinToString("\n").run { markdownToHTML(this) }
+            }
+        )
+
+        // Get the latest available change notes from the changelog file
+        changeNotes(
+            closure {
+                changelog.getLatest().toHTML()
+            }
+        )
+    }
+
+    runPluginVerifier {
+        ideVersions(pluginVerifierIdeVersions)
+    }
+
+    publishPlugin {
+        dependsOn("patchChangelog")
+        token(System.getenv("PUBLISH_TOKEN"))
+        // pluginVersion is based on the SemVer (https://semver.org) and supports pre-release labels, like 2.1.7-alpha.3
+        // Specify pre-release label to publish the plugin in a custom Release Channel automatically. Read more:
+        // https://jetbrains.org/intellij/sdk/docs/tutorials/build_system/deployment.html#specifying-a-release-channel
+        channels(pluginVersion.split('-').getOrElse(1) { "default" }.split('.').first())
+    }
+}
diff --git a/gradle.properties b/gradle.properties
new file mode 100644
index 0000000..a548210
--- /dev/null
+++ b/gradle.properties
@@ -0,0 +1,22 @@
+# IntelliJ Platform Artifacts Repositories
+# -> https://www.jetbrains.org/intellij/sdk/docs/reference_guide/intellij_artifacts.html
+
+pluginGroup = org.jastadd
+pluginName_ = JastAddGrammar
+pluginVersion = 0.1.0
+pluginSinceBuild = 201
+pluginUntilBuild = 203.*
+# Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl
+# See https://jb.gg/intellij-platform-builds-list for available build versions
+pluginVerifierIdeVersions = 2020.3.1
+
+platformType = IC
+platformVersion = 2020.2.4
+platformDownloadSources = true
+# Plugin Dependencies -> https://www.jetbrains.org/intellij/sdk/docs/basics/plugin_structure/plugin_dependencies.html
+# Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22
+platformPlugins = com.intellij.modules.java
+
+# Opt-out flag for bundling Kotlin standard library.
+# See https://kotlinlang.org/docs/reference/using-gradle.html#dependency-on-the-standard-library for details.
+kotlin.stdlib.default.dependency = false
diff --git a/settings.gradle b/settings.gradle.kts
similarity index 100%
rename from settings.gradle
rename to settings.gradle.kts
index cbf5c3b..2f0d5d4 100644
--- a/settings.gradle
+++ b/settings.gradle.kts
@@ -1,2 +1,2 @@
-rootProject.name = "JastAddGrammar"
 
+rootProject.name = "JastAddGrammar"
diff --git a/src/main/grammar/RelAstGrammar.bnf b/src/main/grammar/RelAstGrammar.bnf
index 9e632fc..081d3f4 100644
--- a/src/main/grammar/RelAstGrammar.bnf
+++ b/src/main/grammar/RelAstGrammar.bnf
@@ -21,9 +21,8 @@ comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
 
 type_decl ::= ABSTRACT? declared_name (COL type_reference)? (ASSIGN (component | nta_component)*)? SCOL
 {
-  mixin="org.jastadd.tooling.psi.impl.RelAstGrammarNamedElementImpl"
-  implements="org.jastadd.tooling.psi.RelAstGrammarNamedElement"
-  methods=[getName setName getNameIdentifier]
+  extends="org.jastadd.tooling.psi.impl.RelAstGrammarTypeDeclImplExtension"
+  implements="org.jastadd.tooling.psi.RelAstGrammarTypeDeclExtension"
 }
 
 nta_component ::= SLASH component SLASH
@@ -46,9 +45,8 @@ navigable_role ::= type_reference DOT declared_name (STAR | QUESTION_MARK)?
 declared_name ::= ID
 type_reference ::= ID
 {
-  mixin="org.jastadd.tooling.psi.impl.RelAstGrammarNamedElementImpl"
-  implements="org.jastadd.tooling.psi.RelAstGrammarNamedElement"
-  methods=[getName setName getNameIdentifier]
+  extends="org.jastadd.tooling.psi.impl.RelAstGrammarTypeReferenceImplExtension"
+  implements="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceExtension"
 }
 
 java_name ::= ID
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
index 8429001..e871ccc 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
@@ -7,10 +7,13 @@ import com.intellij.util.ProcessingContext;
 import org.jastadd.tooling.parser.RelAstGrammarTypes;
 import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
 import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
 import org.jetbrains.annotations.NotNull;
 
 public class RelAstGrammarCompletionContributor extends CompletionContributor {
 
+  public static final String COMPLETION_ELEMENT_SUFFIX = "IntellijIdeaRulezzz";
+
   public RelAstGrammarCompletionContributor() {
 
     // add completion in definition of relations
@@ -20,7 +23,8 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
                                    @NotNull ProcessingContext context,
                                    @NotNull CompletionResultSet resultSet) {
           for (RelAstGrammarTypeDecl decl : RelAstGrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
-            resultSet.addElement(LookupElementBuilder.create(RelAstGrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName())));
+            RelAstGrammarTypeReference ref = RelAstGrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName());
+            resultSet.addElement(LookupElementBuilder.create(ref).withIcon(JastAddIcons.FILE).withTypeText(decl.getContainingFile().getName()));
           }
         }
       }
@@ -28,7 +32,7 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
 
     // add "* ", "? " after REL ID DOT ID
     extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .withTextLengthLongerThan(COMPLETION_ELEMENT_SUFFIX.length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
         .afterLeaf(".")
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel"))),
@@ -45,7 +49,7 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     // add "*", "?" after <-  ID DOT ID
     // add "*", "?" after <-> ID DOT ID
     extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .withTextLengthLongerThan(COMPLETION_ELEMENT_SUFFIX.length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
         .afterLeaf(".")
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))
         .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("<-", "<->"))),
@@ -95,7 +99,7 @@ public class RelAstGrammarCompletionContributor extends CompletionContributor {
     // add "." after <-> ID
     // add "." after <- ID
     extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID)
-        .withTextLengthLongerThan("IntellijIdeaRulezzz".length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
+        .withTextLengthLongerThan(COMPLETION_ELEMENT_SUFFIX.length()) // see https://intellij-support.jetbrains.com/hc/en-us/community/posts/206752355-The-dreaded-IntellijIdeaRulezzz-string
         .afterLeaf("rel", "<->", "<-"),
       new CompletionProvider<>() {
         public void addCompletions(@NotNull CompletionParameters parameters,
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java b/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
index 3f8f4c5..4133679 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarFindUsageProvider.java
@@ -47,18 +47,20 @@ public class RelAstGrammarFindUsageProvider implements FindUsagesProvider {
   @NotNull
   @Override
   public String getDescriptiveName(@NotNull PsiElement element) {
-    if (element instanceof RelAstGrammarTypeDecl && ((RelAstGrammarTypeDecl) element).getName() != null) {
-      return ((RelAstGrammarTypeDecl) element).getName();
-    } else {
-      return "";
+    if (element instanceof RelAstGrammarTypeDecl) {
+      RelAstGrammarTypeDecl decl = (RelAstGrammarTypeDecl) element;
+      if (decl.getName() != null) {
+        return decl.getName();
+      }
     }
+    return "";
   }
 
   @NotNull
   @Override
   public String getNodeText(@NotNull PsiElement element, boolean useFullName) {
     if (element instanceof RelAstGrammarTypeDecl) {
-      return ((RelAstGrammarTypeDecl) element).getText();
+      return element.getText();
     } else {
       return "";
     }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java b/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
index 09a4de0..ae8f873 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarReference.java
@@ -6,7 +6,6 @@ import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.psi.*;
 import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
-import org.jastadd.tooling.psi.impl.RelAstGrammarPsiImplUtil;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -24,7 +23,7 @@ public class RelAstGrammarReference extends PsiReferenceBase<PsiElement> impleme
 
   @NotNull
   @Override
-  public ResolveResult[] multiResolve(boolean incompleteCode) {
+  public ResolveResult @NotNull [] multiResolve(boolean incompleteCode) {
     Project project = myElement.getProject();
     final List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project, key);
     List<ResolveResult> results = new ArrayList<>();
@@ -43,14 +42,15 @@ public class RelAstGrammarReference extends PsiReferenceBase<PsiElement> impleme
 
   @NotNull
   @Override
-  public Object[] getVariants() {
+  public Object @NotNull [] getVariants() {
     Project project = myElement.getProject();
     List<RelAstGrammarTypeDecl> typeDecls = RelAstGrammarUtil.findTypeDecl(project);
     List<LookupElement> variants = new ArrayList<>();
     for (final RelAstGrammarTypeDecl typeDecl : typeDecls) {
-      if (RelAstGrammarPsiImplUtil.getName(typeDecl) != null && typeDecl.getName().length() > 0) {
+      if (typeDecl.getName() != null && typeDecl.getName().length() > 0) {
         variants.add(LookupElementBuilder
           .create(typeDecl).withIcon(JastAddIcons.FILE)
+          .withPresentableText(typeDecl.getName())
           .withTypeText(typeDecl.getContainingFile().getName())
         );
       }
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java b/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
index fe5c59b..8a480a0 100644
--- a/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarUtil.java
@@ -1,10 +1,6 @@
 package org.jastadd.tooling;
 
 
-import com.intellij.codeInspection.ProblemHighlightType;
-import com.intellij.lang.annotation.AnnotationHolder;
-import com.intellij.lang.annotation.HighlightSeverity;
-import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
@@ -18,11 +14,15 @@ import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.*;
-import java.util.stream.Collectors;
 
 
 public class RelAstGrammarUtil {
 
+  private RelAstGrammarUtil() {
+    // appease SonarLint java:S1118
+    throw new IllegalStateException("Utility class");
+  }
+
   /**
    * Searches the entire project for RelAst grammar files with TypeDecls with the given name.
    *
@@ -41,9 +41,7 @@ public class RelAstGrammarUtil {
         RelAstGrammarTypeDecl[] typeDecls = PsiTreeUtil.getChildrenOfType(simpleFile, RelAstGrammarTypeDecl.class);
         if (typeDecls != null) {
           for (RelAstGrammarTypeDecl typeDecl : typeDecls) {
-            // FIXME workaround because mixins are not working with gradle-grammar-kit-plugin
-            // see https://github.com/JetBrains/gradle-grammar-kit-plugin/issues/23
-            if (name.equals(org.jastadd.tooling.psi.impl.RelAstGrammarPsiImplUtil.getName(typeDecl))) {
+            if (name.equals(typeDecl.getName())) {
               result.add(typeDecl);
             }
           }
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java
new file mode 100644
index 0000000..79837b7
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeDeclExtension.java
@@ -0,0 +1,4 @@
+package org.jastadd.tooling.psi;
+
+public interface RelAstGrammarTypeDeclExtension extends RelAstGrammarNamedElement {
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java
new file mode 100644
index 0000000..a6c95e7
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/RelAstGrammarTypeReferenceExtension.java
@@ -0,0 +1,4 @@
+package org.jastadd.tooling.psi;
+
+public interface RelAstGrammarTypeReferenceExtension extends RelAstGrammarNamedElement {
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java
deleted file mode 100644
index 22766e5..0000000
--- a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarPsiImplUtil.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package org.jastadd.tooling.psi.impl;
-
-import com.intellij.lang.ASTNode;
-import com.intellij.psi.PsiElement;
-import org.jastadd.tooling.parser.RelAstGrammarTypes;
-import org.jastadd.tooling.psi.RelAstGrammarDeclaredName;
-import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
-import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
-import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
-
-public class RelAstGrammarPsiImplUtil {
-  public static String getName(RelAstGrammarTypeDecl element) {
-    // this finds the *first* ID, which is what we want
-    ASTNode keyNode = element.getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
-    if (keyNode != null) {
-      return keyNode.getText();
-    } else {
-      System.out.println("getName NULL");
-      return null;
-    }
-  }
-
-  public static PsiElement setName(RelAstGrammarTypeDecl element, String newName) {
-    ASTNode keyNode = element.getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
-    if (keyNode != null) {
-      RelAstGrammarDeclaredName name = RelAstGrammarElementFactory.createDeclaredName(element.getProject(), newName);
-      ASTNode newKeyNode = name.getNode();
-      element.getNode().replaceChild(keyNode, newKeyNode);
-    }
-    return element;
-  }
-
-  public static PsiElement getNameIdentifier(RelAstGrammarTypeDecl element) {
-    ASTNode keyNode = element.getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
-    if (keyNode != null) {
-      return keyNode.getPsi();
-    } else {
-      System.out.println("getNameIdentifier NULL");
-      return null;
-    }
-  }
-
-  public static String getName(RelAstGrammarTypeReference element) {
-    // this finds the *first* ID, which is what we want
-    ASTNode keyNode = element.getNode();
-    if (keyNode != null) {
-      return keyNode.getText();
-    } else {
-      System.out.println("RelAstGrammarTypeReference.getName() returned NULL");
-      return null;
-    }
-  }
-
-  public static PsiElement setName(RelAstGrammarTypeReference element, String newName) {
-    ASTNode keyNode = element.getNode().getFirstChildNode();
-    if (keyNode != null) {
-      RelAstGrammarTypeReference name = RelAstGrammarElementFactory.createTypeReference(element.getProject(), newName);
-      ASTNode newKeyNode = name.getNode().getFirstChildNode();
-      element.getNode().replaceChild(keyNode, newKeyNode);
-    }
-    return element;
-  }
-
-  public static PsiElement getNameIdentifier(RelAstGrammarTypeReference element) {
-    ASTNode keyNode = element.getNode();
-    if (keyNode != null) {
-      return keyNode.getPsi();
-    } else {
-      System.out.println("getNameIdentifier2 NULL");
-      return null;
-    }
-  }
-
-}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java
new file mode 100644
index 0000000..b51ed4f
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeDeclImplExtension.java
@@ -0,0 +1,47 @@
+package org.jastadd.tooling.psi.impl;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.psi.PsiElement;
+import org.jastadd.tooling.parser.RelAstGrammarTypes;
+import org.jastadd.tooling.psi.RelAstGrammarDeclaredName;
+import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDeclExtension;
+import org.jetbrains.annotations.NotNull;
+
+public class RelAstGrammarTypeDeclImplExtension extends RelAstGrammarNamedElementImpl implements RelAstGrammarTypeDeclExtension {
+
+  public RelAstGrammarTypeDeclImplExtension(@NotNull ASTNode node) {
+    super(node);
+  }
+
+  public String getName() {
+    // this finds the *first* ID, which is what we want
+    ASTNode keyNode = getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      return keyNode.getText();
+    } else {
+      return null;
+    }
+  }
+
+  public PsiElement setName(@NotNull String newName) {
+    ASTNode keyNode = getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      RelAstGrammarDeclaredName name = RelAstGrammarElementFactory.createDeclaredName(getProject(), newName);
+      ASTNode newKeyNode = name.getNode();
+      getNode().replaceChild(keyNode, newKeyNode);
+    }
+    return this;
+  }
+
+  public PsiElement getNameIdentifier() {
+    ASTNode keyNode = getNode().findChildByType(RelAstGrammarTypes.DECLARED_NAME);
+    if (keyNode != null) {
+      return keyNode.getPsi();
+    } else {
+      return null;
+    }
+  }
+
+
+}
diff --git a/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java
new file mode 100644
index 0000000..74f719d
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/psi/impl/RelAstGrammarTypeReferenceImplExtension.java
@@ -0,0 +1,35 @@
+package org.jastadd.tooling.psi.impl;
+
+import com.intellij.lang.ASTNode;
+import com.intellij.psi.PsiElement;
+import org.jastadd.tooling.psi.RelAstGrammarElementFactory;
+import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
+import org.jastadd.tooling.psi.RelAstGrammarTypeReferenceExtension;
+import org.jetbrains.annotations.NotNull;
+
+public class RelAstGrammarTypeReferenceImplExtension extends RelAstGrammarNamedElementImpl implements RelAstGrammarTypeReferenceExtension {
+
+  public RelAstGrammarTypeReferenceImplExtension(@NotNull ASTNode node) {
+    super(node);
+  }
+
+  public String getName() {
+    // this finds the *first* ID, which is what we want
+    return getNode().getText();
+  }
+
+  public PsiElement setName(@NotNull String newName) {
+    ASTNode keyNode = getNode().getFirstChildNode();
+    if (keyNode != null) {
+      RelAstGrammarTypeReference name = RelAstGrammarElementFactory.createTypeReference(getProject(), newName);
+      ASTNode newKeyNode = name.getNode().getFirstChildNode();
+      getNode().replaceChild(keyNode, newKeyNode);
+    }
+    return this;
+  }
+
+  public PsiElement getNameIdentifier() {
+    return getNode().getPsi();
+  }
+
+}
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index 7bb097d..321963c 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -3,9 +3,6 @@
     <name>JastAdd Grammar Language</name>
     <vendor email="johannes.mey@tu-dresden.de" url="jastadd.org">The JastAdd Team</vendor>
 
-    <description><![CDATA[
-    A plugin for JastAdd grammars specified in ast and relast files.
-    ]]></description>
 
     <!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
          on how to target different products -->
@@ -37,7 +34,8 @@
         <lang.refactoringSupport language="JastAddGrammar"
                                  implementationClass="org.jastadd.tooling.RelAstGrammarRefactoringSupportProvider"/>
 
-        <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference" implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/>
+        <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference"
+                                 implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/>
 
 
         <lang.findUsagesProvider language="JastAddGrammar"
-- 
GitLab