[i18n] UastPatterns.stringLiteralExpression and UastLiteralReferenceProvider cleanup

This commit is contained in:
Nicolay Mitropolsky
2018-12-13 09:48:24 +03:00
parent ba4d24985b
commit ffad98d1c0
3 changed files with 32 additions and 32 deletions
@@ -19,7 +19,6 @@ import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.lang.properties.psi.impl.PropertyValueImpl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.patterns.PsiJavaPatterns;
import com.intellij.patterns.uast.ULiteralExpressionPattern;
import com.intellij.patterns.uast.UastPatterns;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
@@ -27,7 +26,9 @@ import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.searches.AnnotatedElementsSearch;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.uast.*;
import org.jetbrains.uast.UElement;
import org.jetbrains.uast.UExpression;
import org.jetbrains.uast.UField;
import java.util.ArrayList;
import java.util.Collections;
@@ -45,31 +46,29 @@ public class PropertiesReferenceContributor extends PsiReferenceContributor{
return true;
}
};
private static final ULiteralExpressionPattern BASE_PATTERN =
UastPatterns.stringLiteralExpression().and(UastPatterns.capture(UElement.class).withUastParent(UastPatterns.capture(UElement.class).filter(p -> {
if (!(p instanceof UPolyadicExpression)) return true;
return !(((UPolyadicExpression)p).getOperator() instanceof UastBinaryOperator.ArithmeticOperator);
})));
@Override
public void registerReferenceProviders(@NotNull final PsiReferenceRegistrar registrar) {
UastReferenceRegistrar.registerUastReferenceProvider(registrar, BASE_PATTERN, new UastPropertiesReferenceProvider(true), PsiReferenceRegistrar.DEFAULT_PRIORITY);
UastReferenceRegistrar.registerUastReferenceProvider(registrar, UastPatterns.injectionHostUExpression(),
new UastPropertiesReferenceProvider(true), PsiReferenceRegistrar.DEFAULT_PRIORITY);
UastReferenceRegistrar.registerUastReferenceProvider(registrar,
UastPatterns.stringLiteralExpression().annotationParam(AnnotationUtil.PROPERTY_KEY,
AnnotationUtil.PROPERTY_KEY_RESOURCE_BUNDLE_PARAMETER),
UastPatterns.injectionHostUExpression()
.annotationParam(AnnotationUtil.PROPERTY_KEY,
AnnotationUtil.PROPERTY_KEY_RESOURCE_BUNDLE_PARAMETER),
new ResourceBundleReferenceProvider(), PsiReferenceRegistrar.DEFAULT_PRIORITY);
UastReferenceRegistrar.registerUastReferenceProvider(registrar, BASE_PATTERN, new UastLiteralReferenceProvider() {
UastReferenceRegistrar
.registerUastReferenceProvider(registrar, UastPatterns.injectionHostUExpression(), new UastInjectionHostReferenceProvider() {
private final ResourceBundleReferenceProvider myUnderlying = new ResourceBundleReferenceProvider();
@NotNull
@Override
public PsiReference[] getReferencesByULiteral(@NotNull ULiteralExpression uLiteral,
@NotNull PsiLanguageInjectionHost host,
@NotNull ProcessingContext context) {
final UElement parent = uLiteral.getUastParent();
public PsiReference[] getReferencesForInjectionHost(@NotNull UExpression uExpression,
@NotNull PsiLanguageInjectionHost host,
@NotNull ProcessingContext context) {
final UElement parent = uExpression.getUastParent();
if (!(parent instanceof UField)) {
return PsiReference.EMPTY_ARRAY;
}
@@ -78,7 +77,7 @@ public class PropertiesReferenceContributor extends PsiReferenceContributor{
if (initializer == null) return PsiReference.EMPTY_ARRAY;
PsiElement initializerSource = initializer.getSourcePsi();
if (initializerSource == null) return PsiReference.EMPTY_ARRAY;
PsiElement elementSource = uLiteral.getSourcePsi();
PsiElement elementSource = uExpression.getSourcePsi();
if (initializerSource != elementSource ||
!field.isFinal() ||
!field.getType().equalsToText(CommonClassNames.JAVA_LANG_STRING)) {
@@ -99,7 +98,7 @@ public class PropertiesReferenceContributor extends PsiReferenceContributor{
if (AnnotationUtil.PROPERTY_KEY_RESOURCE_BUNDLE_PARAMETER.equals(pair.getName())) {
final PsiAnnotationMemberValue value = pair.getValue();
if (value instanceof PsiReferenceExpression && ((PsiReferenceExpression)value).resolve() == field.getSourcePsi()) {
Collections.addAll(references, myUnderlying.getReferencesByElement(uLiteral, context));
Collections.addAll(references, myUnderlying.getReferencesForInjectionHost(uExpression, host, context));
return false;
}
}
@@ -4,11 +4,9 @@ package com.intellij.lang.properties;
import com.intellij.psi.*;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.uast.UElement;
import org.jetbrains.uast.ULiteralExpression;
import org.jetbrains.uast.UastLiteralUtils;
import org.jetbrains.uast.UExpression;
public class ResourceBundleReferenceProvider extends UastReferenceProvider {
public class ResourceBundleReferenceProvider extends UastInjectionHostReferenceProvider {
@Override
public boolean acceptsTarget(@NotNull PsiElement target) {
return target instanceof PsiFile && PropertiesImplUtil.isPropertiesFile((PsiFile)target);
@@ -16,10 +14,9 @@ public class ResourceBundleReferenceProvider extends UastReferenceProvider {
@NotNull
@Override
public PsiReference[] getReferencesByElement(@NotNull UElement element, @NotNull ProcessingContext context) {
if (!(element instanceof ULiteralExpression)) return PsiReference.EMPTY_ARRAY;
PsiLanguageInjectionHost host = UastLiteralUtils.getPsiLanguageInjectionHost((ULiteralExpression)element);
if (host == null) return PsiReference.EMPTY_ARRAY;
public PsiReference[] getReferencesForInjectionHost(@NotNull UExpression uExpression,
@NotNull PsiLanguageInjectionHost host,
@NotNull ProcessingContext context) {
return new PsiReference[]{new ResourceBundleReference(host, false)};
}
}
@@ -7,15 +7,18 @@ import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiLanguageInjectionHost;
import com.intellij.psi.PsiReference;
import com.intellij.psi.UastStringLiteralReferenceProvider;
import com.intellij.psi.UastInjectionHostReferenceProvider;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.uast.*;
import org.jetbrains.uast.UCallExpression;
import org.jetbrains.uast.UElement;
import org.jetbrains.uast.UExpression;
import org.jetbrains.uast.UIfExpression;
/**
* @author cdr
*/
class UastPropertiesReferenceProvider extends UastStringLiteralReferenceProvider {
class UastPropertiesReferenceProvider extends UastInjectionHostReferenceProvider {
private final boolean myDefaultSoft;
@@ -28,17 +31,18 @@ class UastPropertiesReferenceProvider extends UastStringLiteralReferenceProvider
return target instanceof IProperty;
}
@NotNull
@Override
public PsiReference[] getReferencesByULiteral(@NotNull ULiteralExpression element,
@NotNull PsiLanguageInjectionHost host,
@NotNull ProcessingContext context) {
public PsiReference[] getReferencesForInjectionHost(@NotNull UExpression element,
@NotNull PsiLanguageInjectionHost host,
@NotNull ProcessingContext context) {
Object value = null;
String bundleName = null;
boolean soft = myDefaultSoft;
if (canBePropertyKeyRef(element)) {
value = element.getValue();
value = element.evaluate();
final Ref<UExpression> resourceBundleValue = Ref.create();
if (JavaI18nUtil.mustBePropertyKey(element, resourceBundleValue)) {