IDEA-97844 Resource bundle should be associated to file even written in constant

This commit is contained in:
Dmitry Batkovich
2015-02-18 15:22:55 +03:00
parent 76da0a1b6d
commit 857c2df9bb
@@ -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<PsiReference> references = new THashSet<PsiReference>(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