diff --git a/src/main/grammar/RelAstGrammar.bnf b/src/main/grammar/RelAstGrammar.bnf
index 007479465b3deb99352e68528fad68bc4b934b32..e522f8e51a82aea6b448cd03e90b5816f4753c9a 100644
--- a/src/main/grammar/RelAstGrammar.bnf
+++ b/src/main/grammar/RelAstGrammar.bnf
@@ -19,20 +19,25 @@ relAstGrammarFile ::= comment* ((type_decl | relation) comment*)*
comment ::= (WHITESPACE | MULTILINECOMMENT | DOCCOMMENT | SINGLELINECOMMENT)
-type_decl ::= ABSTRACT? ID (COL ID)? (ASSIGN (component | nta_component)*)? SCOL {methods=[getName]}
+type_decl ::= ABSTRACT? declared_name (COL type_reference)? (ASSIGN (component | nta_component)*)? SCOL {methods=[getName]}
nta_component ::= SLASH component SLASH
-component ::= (ID (COL ID)? STAR?) | (LBRACKET ID (COL ID)? RBRACKET) | (LT ID (COL (java_type_use))? GT)
+component ::= (declared_name COL type_reference STAR?) | (type_reference STAR?) | (LBRACKET declared_name COL type_reference RBRACKET) | (LBRACKET type_reference RBRACKET) | (LT declared_name (COL (java_type_use))? GT)
java_type_use ::= parameterized_java_type_use | simple_java_type_use
parameterized_java_type_use ::= simple_java_type_use LT java_type_use (COMMA java_type_use)* GT
-simple_java_type_use ::= ID (DOT ID)*
+simple_java_type_use ::= java_name (DOT java_name)*
relation ::= REL ((unnamed_role LEFT navigable_role) | (navigable_role RIGHT unnamed_role) | (navigable_role BIDIRECTIONAL navigable_role)) SCOL
-unnamed_role ::= ID | navigable_role
+unnamed_role ::= type_reference | navigable_role
-navigable_role ::= ID DOT ID (STAR | QUESTION_MARK)?
+navigable_role ::= type_reference DOT declared_name (STAR | QUESTION_MARK)?
+
+// for auto-completion, it is helpful if we can distinguish the different IDs
+declared_name ::= ID
+type_reference ::= ID
+java_name ::= ID
diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac56ff83acc56e5edfb88cf77d0368ccec907396
--- /dev/null
+++ b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java
@@ -0,0 +1,43 @@
+package org.jastadd.tooling;
+
+import com.intellij.codeInsight.completion.*;
+import com.intellij.codeInsight.lookup.LookupElementBuilder;
+import com.intellij.patterns.PlatformPatterns;
+import com.intellij.psi.tree.TokenSet;
+import com.intellij.util.ProcessingContext;
+import org.jastadd.tooling.parser.RelAstGrammarTypes;
+import org.jastadd.tooling.psi.RelAstGrammarTypeDecl;
+import org.jastadd.tooling.psi.RelAstGrammarTypeReference;
+import org.jetbrains.annotations.NotNull;
+
+public class RelAstGrammarCompletionContributor extends CompletionContributor {
+
+ public RelAstGrammarCompletionContributor() {
+ extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID).withParent(RelAstGrammarTypeReference.class),
+ new CompletionProvider<>() {
+ public void addCompletions(@NotNull CompletionParameters parameters,
+ @NotNull ProcessingContext context,
+ @NotNull CompletionResultSet resultSet) {
+
+ for (RelAstGrammarTypeDecl decl : RelAstGrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
+ resultSet.addElement(LookupElementBuilder.create(decl.getDeclaredName().getText()));
+ }
+ }
+ }
+ );
+
+ extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID).afterLeaf("rel", "<->", "->", "<-", ":"),
+ new CompletionProvider<>() {
+ public void addCompletions(@NotNull CompletionParameters parameters,
+ @NotNull ProcessingContext context,
+ @NotNull CompletionResultSet resultSet) {
+ for (RelAstGrammarTypeDecl decl : RelAstGrammarUtil.findTypeDecl(parameters.getPosition().getProject())) {
+ resultSet.addElement(LookupElementBuilder.create(decl.getDeclaredName().getText()));
+ }
+ }
+ }
+ );
+
+ }
+
+}
diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml
index ce9e6d9fd17967180c7a400dbfad10380f75a4b1..2e3ccc1f4125abd56930578cd5dfef1b33b1ba74 100644
--- a/src/main/resources/META-INF/plugin.xml
+++ b/src/main/resources/META-INF/plugin.xml
@@ -27,6 +27,9 @@
<codeInsight.lineMarkerProvider language="JAVA"
implementationClass="org.jastadd.tooling.RelAstGrammarLineMarkerProvider"/>
+
+ <completion.contributor language="JastAddGrammar"
+ implementationClass="org.jastadd.tooling.RelAstGrammarCompletionContributor"/>
</extensions>
<actions>