diff --git a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java index ac56ff83acc56e5edfb88cf77d0368ccec907396..84290018dea71e54249295ff3e40f41b0f78568d 100644 --- a/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java +++ b/src/main/java/org/jastadd/tooling/RelAstGrammarCompletionContributor.java @@ -3,37 +3,118 @@ 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.RelAstGrammarElementFactory; 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), + + // add completion in definition of relations + 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())); + resultSet.addElement(LookupElementBuilder.create(RelAstGrammarElementFactory.createTypeReference(parameters.getPosition().getProject(), decl.getName()))); } } } ); - extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID).afterLeaf("rel", "<->", "->", "<-", ":"), + // 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 + .afterLeaf(".") + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().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())); - } + resultSet = resultSet.withPrefixMatcher(""); + resultSet.addElement(LookupElementBuilder.create("* ").bold().withPresentableText("*")); + resultSet.addElement(LookupElementBuilder.create("? ").bold().withPresentableText("?")); + } + } + ); + // 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 + .afterLeaf(".") + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("<-", "<->"))), + new CompletionProvider<>() { + public void addCompletions(@NotNull CompletionParameters parameters, + @NotNull ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + resultSet = resultSet.withPrefixMatcher(""); + resultSet.addElement(LookupElementBuilder.create("*").bold()); + resultSet.addElement(LookupElementBuilder.create("?").bold()); + } + } + ); + // add " -> ", " <-> " after REL ID DOT ID <SPACE> + extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID) + .afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(".")) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)))) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel")))), + new CompletionProvider<>() { + public void addCompletions(@NotNull CompletionParameters parameters, + @NotNull ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + resultSet.addElement(LookupElementBuilder.create("-> ").bold().withPresentableText("->")); + resultSet.addElement(LookupElementBuilder.create("<-> ").bold().withPresentableText("<->")); + } + } + ); + // add " -> ", " <-> " after REL ID DOT ID * <SPACE> + // add " -> ", " <-> " after REL ID DOT ID ? <SPACE> + extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID) + .afterLeaf("?", "*") + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("."))) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID))))) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel"))))), + new CompletionProvider<>() { + public void addCompletions(@NotNull CompletionParameters parameters, + @NotNull ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + resultSet.addElement(LookupElementBuilder.create("-> ").bold().withPresentableText("->")); + resultSet.addElement(LookupElementBuilder.create("<-> ").bold().withPresentableText("<->")); + } + } + ); + // add "." after REL ID + // 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 + .afterLeaf("rel", "<->", "<-"), + new CompletionProvider<>() { + public void addCompletions(@NotNull CompletionParameters parameters, + @NotNull ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + resultSet = resultSet.withPrefixMatcher(""); + resultSet.addElement(LookupElementBuilder.create(".").bold()); + } + } + ); + // add " <- " after REL ID <SPACE> + extend(CompletionType.BASIC, PlatformPatterns.psiElement(RelAstGrammarTypes.ID) + .afterLeaf(PlatformPatterns.psiElement(RelAstGrammarTypes.ID)) + .afterLeaf(PlatformPatterns.psiElement().afterLeaf("rel")), + new CompletionProvider<>() { + public void addCompletions(@NotNull CompletionParameters parameters, + @NotNull ProcessingContext context, + @NotNull CompletionResultSet resultSet) { + resultSet.addElement(LookupElementBuilder.create("<- ").bold().withPresentableText("<-")); } } ); diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 14dfe451c56758b960b913fc81512850482aa529..6c566e8bda4fe61f5c58aebc9e52240dcd6c3a72 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -28,15 +28,14 @@ <codeInsight.lineMarkerProvider language="JAVA" implementationClass="org.jastadd.tooling.RelAstGrammarLineMarkerProvider"/> -<!-- <completion.contributor language="JastAddGrammar"--> -<!-- implementationClass="org.jastadd.tooling.RelAstGrammarCompletionContributor"/>--> + <completion.contributor language="JastAddGrammar" + implementationClass="org.jastadd.tooling.RelAstGrammarCompletionContributor"/> <psi.referenceContributor implementation="org.jastadd.tooling.RelAstGrammarReferenceContributor"/> <lang.refactoringSupport language="JastAddGrammar" implementationClass="org.jastadd.tooling.RelAstGrammarRefactoringSupportProvider"/> - <lang.elementManipulator /> <lang.elementManipulator forClass="org.jastadd.tooling.psi.RelAstGrammarTypeReference" implementationClass="org.jastadd.tooling.psi.RelAstGrammarTypeReferenceManipulator"/> </extensions>