mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-97844 Resource bundle should be associated to file even written in constant
This commit is contained in:
+43
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user