From 857c2df9bbe6fc9d5fd1a703776bb2f9e658b94f Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Wed, 18 Feb 2015 15:22:55 +0300 Subject: [PATCH] IDEA-97844 Resource bundle should be associated to file even written in constant --- .../PropertiesReferenceContributor.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/plugins/java-i18n/src/com/intellij/lang/properties/PropertiesReferenceContributor.java b/plugins/java-i18n/src/com/intellij/lang/properties/PropertiesReferenceContributor.java index bce0f3683c6e..e776b705828f 100644 --- a/plugins/java-i18n/src/com/intellij/lang/properties/PropertiesReferenceContributor.java +++ b/plugins/java-i18n/src/com/intellij/lang/properties/PropertiesReferenceContributor.java @@ -20,9 +20,15 @@ import com.intellij.lang.properties.psi.impl.PropertyValueImpl; import com.intellij.patterns.PsiJavaPatterns; import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.ProcessingContext; +import gnu.trove.THashSet; +import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; +import java.util.Collections; +import java.util.Set; + import static com.intellij.patterns.PsiJavaPatterns.literalExpression; import static com.intellij.patterns.PsiJavaPatterns.psiNameValuePair; @@ -43,6 +49,43 @@ public class PropertiesReferenceContributor extends PsiReferenceContributor{ psiNameValuePair().withName(AnnotationUtil.PROPERTY_KEY_RESOURCE_BUNDLE_PARAMETER)), new ResourceBundleReferenceProvider()); + registrar.registerReferenceProvider(literalExpression(), new PsiReferenceProvider() { + private final PsiReferenceProvider myUnderlying = new ResourceBundleReferenceProvider(); + + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + final PsiElement parent = element.getParent(); + if (!(parent instanceof PsiField)) { + return PsiReference.EMPTY_ARRAY; + } + final PsiField field = (PsiField)parent; + if (field.getInitializer() != element || !field.hasModifierProperty(PsiModifier.FINAL)) { + return PsiReference.EMPTY_ARRAY; + } + Set references = new THashSet(TObjectHashingStrategy.IDENTITY); + for (PsiMethod method : PsiTreeUtil.findChildrenOfType(element.getContainingFile(), PsiMethod.class)) { + for (PsiParameter parameter : method.getParameterList().getParameters()) { + final PsiModifierList modifierList = parameter.getModifierList(); + if (modifierList != null) { + final PsiAnnotation annotation = modifierList.findAnnotation(AnnotationUtil.PROPERTY_KEY); + if (annotation != null) { + for (PsiNameValuePair pair : annotation.getParameterList().getAttributes()) { + if (AnnotationUtil.PROPERTY_KEY_RESOURCE_BUNDLE_PARAMETER.equals(pair.getName())) { + final PsiAnnotationMemberValue value = pair.getValue(); + if (value instanceof PsiReferenceExpression && ((PsiReferenceExpression)value).resolve() == field) { + Collections.addAll(references, myUnderlying.getReferencesByElement(element, context)); + } + } + } + } + } + } + } + return references.toArray(new PsiReference[references.size()]); + } + }); + registrar.registerReferenceProvider(PsiJavaPatterns.psiElement(PropertyValueImpl.class), new PsiReferenceProvider() { @NotNull @Override