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);
+ }
+ };
+ }
+}