From 83237e626abe3978446c9d126c77932080a9c0e9 Mon Sep 17 00:00:00 2001 From: Max Medvedev Date: Sun, 7 Jul 2013 08:03:46 +0400 Subject: [PATCH] IDEA-99638 completion in @Language("") --- .../inject/java/LanguageReference.java | 6 +- .../util/StringLiteralReference.java | 8 +-- .../META-INF/intellilang-groovy-support.xml | 1 + .../groovy/GrLanguageReferenceProvider.java | 66 +++++++++++++++++++ 4 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GrLanguageReferenceProvider.java diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java index c6cc44a12198..09dc40917bf7 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java @@ -18,7 +18,7 @@ package org.intellij.plugins.intelliLang.inject.java; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiLiteralExpression; +import com.intellij.psi.PsiLiteral; import com.intellij.psi.injection.Injectable; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; @@ -34,9 +34,9 @@ import java.util.List; * Provides completion for available Language-IDs in *
@Language("[ctrl-space]")
*/ -final class LanguageReference extends StringLiteralReference { +public final class LanguageReference extends StringLiteralReference { - public LanguageReference(PsiLiteralExpression value) { + public LanguageReference(PsiLiteral value) { super(value); } diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/StringLiteralReference.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/StringLiteralReference.java index 0fcd26db7ffe..b38174beabcd 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/StringLiteralReference.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/StringLiteralReference.java @@ -18,19 +18,19 @@ package org.intellij.plugins.intelliLang.util; import com.intellij.openapi.util.TextRange; import com.intellij.psi.ElementManipulators; import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiLiteralExpression; +import com.intellij.psi.PsiLiteral; import com.intellij.psi.PsiReference; import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Base class for references in String literals. */ public abstract class StringLiteralReference implements PsiReference { - protected final PsiLiteralExpression myValue; + protected final PsiLiteral myValue; - public StringLiteralReference(PsiLiteralExpression value) { + public StringLiteralReference(PsiLiteral value) { myValue = value; } diff --git a/plugins/groovy/src/META-INF/intellilang-groovy-support.xml b/plugins/groovy/src/META-INF/intellilang-groovy-support.xml index 4e5e6ae724fa..6cee04476cfe 100644 --- a/plugins/groovy/src/META-INF/intellilang-groovy-support.xml +++ b/plugins/groovy/src/META-INF/intellilang-groovy-support.xml @@ -12,6 +12,7 @@ + diff --git a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GrLanguageReferenceProvider.java b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GrLanguageReferenceProvider.java new file mode 100644 index 000000000000..3fbb5cc65683 --- /dev/null +++ b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GrLanguageReferenceProvider.java @@ -0,0 +1,66 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.intellij.plugins.intelliLang.inject.groovy; + +import com.intellij.openapi.util.Comparing; +import com.intellij.patterns.PatternCondition; +import com.intellij.psi.*; +import com.intellij.util.ProcessingContext; +import org.intellij.plugins.intelliLang.Configuration; +import org.intellij.plugins.intelliLang.inject.java.LanguageReference; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.literals.GrLiteral; + +import static com.intellij.patterns.StandardPatterns.string; +import static org.jetbrains.plugins.groovy.lang.psi.patterns.GroovyPatterns.groovyLiteralExpression; + + +/** + * Created by Max Medvedev on 9/9/13 + */ +public class GrLanguageReferenceProvider extends PsiReferenceContributor { + @Override + public void registerReferenceProviders(PsiReferenceRegistrar registrar) { + final Configuration configuration = Configuration.getInstance(); + registrar.registerReferenceProvider( + groovyLiteralExpression().annotationParam(string().with(isLanguageAnnotation(configuration)), "value").and( + groovyLiteralExpression().with(isStringLiteral())), new PsiReferenceProvider() { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull final PsiElement element, @NotNull final ProcessingContext context) { + return new PsiReference[]{new LanguageReference((PsiLiteral)element)}; + } + }); + } + + private static PatternCondition isStringLiteral() { + return new PatternCondition("isStringLiteral") { + @Override + public boolean accepts(@NotNull final GrLiteral expression, final ProcessingContext context) { + return expression.getValue() instanceof String; + } + }; + } + + private static PatternCondition isLanguageAnnotation(final Configuration configuration) { + return new PatternCondition("isLanguageAnnotation") { + @Override + public boolean accepts(@NotNull final String s, final ProcessingContext context) { + return Comparing.equal(configuration.getAdvancedConfiguration().getLanguageAnnotationClass(), s); + } + }; + } +}