moving PsiReferenceContributor to application level

This commit is contained in:
Dmitry Avdeev
2011-05-05 11:45:54 +04:00
parent 28a5aa4e74
commit 0ef6dd5d0c
21 changed files with 104 additions and 154 deletions
@@ -15,7 +15,6 @@
*/
package com.intellij.psi.impl;
import com.intellij.openapi.project.Project;
import com.intellij.psi.CommonReferenceProviderTypes;
import com.intellij.psi.PsiReferenceProvider;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
@@ -27,8 +26,8 @@ public class CommonReferenceProviderTypesImpl extends CommonReferenceProviderTyp
private final JavaClassReferenceProvider myProvider;
public CommonReferenceProviderTypesImpl(Project project) {
myProvider = new JavaClassReferenceProvider(project);
public CommonReferenceProviderTypesImpl() {
myProvider = new JavaClassReferenceProvider();
}
public PsiReferenceProvider getClassReferenceProvider() {
@@ -16,12 +16,10 @@
package com.intellij.psi.impl.source.resolve.reference.impl.providers;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NotNullLazyValue;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.templateLanguages.OuterLanguageElement;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.containers.ContainerUtil;
@@ -41,13 +39,12 @@ import java.util.Set;
*/
public class JavaClassListReferenceProvider extends JavaClassReferenceProvider {
public JavaClassListReferenceProvider(final Project project) {
super(GlobalSearchScope.allScope(project), project);
public JavaClassListReferenceProvider() {
setOption(ADVANCED_RESOLVE, Boolean.TRUE);
}
@NotNull
public PsiReference[] getReferencesByString(String str, PsiElement position, int offsetInPosition){
public PsiReference[] getReferencesByString(String str, @NotNull final PsiElement position, int offsetInPosition){
if (position instanceof XmlTag && ((XmlTag)position).getValue().getTextElements().length == 0) {
return PsiReference.EMPTY_ARRAY;
}
@@ -56,12 +53,10 @@ public class JavaClassListReferenceProvider extends JavaClassReferenceProvider {
return PsiReference.EMPTY_ARRAY;
}
if (position != null) {
int offset = position.getTextRange().getStartOffset() + offsetInPosition;
for(PsiElement child = position.getFirstChild(); child != null; child = child.getNextSibling()){
if (child instanceof OuterLanguageElement && child.getTextRange().contains(offset)) {
return PsiReference.EMPTY_ARRAY;
}
int offset = position.getTextRange().getStartOffset() + offsetInPosition;
for(PsiElement child = position.getFirstChild(); child != null; child = child.getNextSibling()){
if (child instanceof OuterLanguageElement && child.getTextRange().contains(offset)) {
return PsiReference.EMPTY_ARRAY;
}
}
@@ -70,7 +65,7 @@ public class JavaClassListReferenceProvider extends JavaClassReferenceProvider {
@Override
protected Set<String> compute() {
final Set<String> knownTopLevelPackages = new HashSet<String>();
final List<PsiElement> defaultPackages = getDefaultPackages();
final List<PsiElement> defaultPackages = getDefaultPackages(position.getProject());
for (final PsiElement pack : defaultPackages) {
if (pack instanceof PsiPackage) {
knownTopLevelPackages.add(((PsiPackage)pack).getName());
@@ -16,6 +16,7 @@
package com.intellij.psi.impl.source.resolve.reference.impl.providers;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.psi.scope.ElementClassHint;
@@ -56,17 +57,12 @@ public class JavaClassReferenceProvider extends GenericReferenceProvider impleme
public static final CustomizationKey<Boolean> JVM_FORMAT = new CustomizationKey<Boolean>("JVM_FORMAT");
public static final CustomizationKey<Boolean> ALLOW_DOLLAR_NAMES = new CustomizationKey<Boolean>("ALLOW_DOLLAR_NAMES");
public static final CustomizationKey<String> DEFAULT_PACKAGE = new CustomizationKey<String>("DEFAULT_PACKAGE");
@Nullable private Map<CustomizationKey, Object> myOptions;
private boolean myAllowEmpty;
@Nullable private final GlobalSearchScope myScope;
private final CachedValue<List<PsiElement>> myDefaltPackages;
public JavaClassReferenceProvider(GlobalSearchScope scope, final Project project) {
myScope = scope;
myDefaltPackages = CachedValuesManager.getManager(project).createCachedValue(new CachedValueProvider<List<PsiElement>>() {
public Result<List<PsiElement>> compute() {
private ParameterizedCachedValueProvider<List<PsiElement>, Project> myProvider = new ParameterizedCachedValueProvider<List<PsiElement>, Project>() {
public CachedValueProvider.Result<List<PsiElement>> compute(Project project) {
final List<PsiElement> psiPackages = new ArrayList<PsiElement>();
final String defPackageName = DEFAULT_PACKAGE.getValue(myOptions);
if (StringUtil.isNotEmpty(defPackageName)) {
@@ -79,14 +75,11 @@ public class JavaClassReferenceProvider extends GenericReferenceProvider impleme
if (rootPackage != null) {
psiPackages.addAll(getSubPackages(rootPackage));
}
return Result.createSingleDependency(psiPackages, PsiModificationTracker.MODIFICATION_COUNT);
return CachedValueProvider.Result.createSingleDependency(psiPackages, PsiModificationTracker.MODIFICATION_COUNT);
}
}, false);
}
};
public JavaClassReferenceProvider(final Project project) {
this(null, project);
}
private static final Key<ParameterizedCachedValue<List<PsiElement>, Project>> KEY = Key.create("default packages");
public <T> void setOption(CustomizationKey<T> option, T value) {
if (myOptions == null) {
@@ -102,7 +95,7 @@ public class JavaClassReferenceProvider extends GenericReferenceProvider impleme
@Nullable
public GlobalSearchScope getScope() {
return myScope;
return null;
}
@NotNull
@@ -117,7 +110,7 @@ public class JavaClassReferenceProvider extends GenericReferenceProvider impleme
}
@NotNull
public PsiReference[] getReferencesByString(String str, PsiElement position, int offsetInPosition) {
public PsiReference[] getReferencesByString(String str, @NotNull PsiElement position, int offsetInPosition) {
if (myAllowEmpty && StringUtil.isEmpty(str)) {
return PsiReference.EMPTY_ARRAY;
}
@@ -129,15 +122,15 @@ public class JavaClassReferenceProvider extends GenericReferenceProvider impleme
final ElementClassHint hint = processor.getHint(ElementClassHint.KEY);
if (position == null) return;
if (hint == null || hint.shouldProcess(ElementClassHint.DeclarationKind.PACKAGE) || hint.shouldProcess(ElementClassHint.DeclarationKind.CLASS)) {
final List<PsiElement> cachedPackages = getDefaultPackages();
final List<PsiElement> cachedPackages = getDefaultPackages(position.getProject());
for (final PsiElement psiPackage : cachedPackages) {
if (!processor.execute(psiPackage, ResolveState.initial())) return;
}
}
}
protected List<PsiElement> getDefaultPackages() {
return myDefaltPackages.getValue();
protected List<PsiElement> getDefaultPackages(Project project) {
return CachedValuesManager.getManager(project).getParameterizedCachedValue(project, KEY, myProvider, false, project);
}
private static Collection<PsiPackage> getSubPackages(final PsiPackage defaultPackage) {
@@ -17,8 +17,6 @@ package com.intellij.util.xml;
import com.intellij.codeInsight.completion.scope.JavaCompletionProcessor;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.UserDataCache;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReference;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
@@ -35,16 +33,10 @@ import org.jetbrains.annotations.NotNull;
*/
public class CanonicalPsiTypeConverterImpl extends CanonicalPsiTypeConverter implements CustomReferenceConverter<PsiType> {
private static final UserDataCache<JavaClassReferenceProvider, Project, Object> REFERENCE_PROVIDER = new UserDataCache<JavaClassReferenceProvider, Project, Object>("CanonicalPsiTypeConverterImpl") {
@Override
protected JavaClassReferenceProvider compute(Project project, Object p) {
return new JavaClassReferenceProvider(project);
}
};
@NonNls private static final String[] PRIMITIVES = new String[]{"boolean", "byte",
"char", "double", "float", "int", "long", "short"};
@NonNls private static final String ARRAY_PREFIX = "[L";
private static final JavaClassReferenceProvider CLASS_REFERENCE_PROVIDER = new JavaClassReferenceProvider();
public PsiType fromString(final String s, final ConvertContext context) {
if (s == null) return null;
@@ -76,7 +68,7 @@ public class CanonicalPsiTypeConverterImpl extends CanonicalPsiTypeConverter imp
trimmed = trimmed.substring(ARRAY_PREFIX.length());
}
}
return new JavaClassReferenceSet(trimmed, element, offset, false, REFERENCE_PROVIDER.get(genericDomValue.getManager().getProject(), null)) {
return new JavaClassReferenceSet(trimmed, element, offset, false, CLASS_REFERENCE_PROVIDER) {
protected JavaClassReference createReference(final int referenceIndex, final String subreferenceText, final TextRange textRange,
final boolean staticImport) {
return new JavaClassReference(this, textRange, referenceIndex, subreferenceText, staticImport) {
@@ -18,8 +18,6 @@ package com.intellij.util.xml;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
import com.intellij.util.containers.BidirectionalMap;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.UserDataCache;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -32,23 +30,15 @@ import java.util.List;
public class JvmPsiTypeConverterImpl extends JvmPsiTypeConverter implements CustomReferenceConverter<PsiType> {
private static final BidirectionalMap<PsiType, Character> ourPrimitiveTypes = new BidirectionalMap<PsiType, Character>();
private static final UserDataCache<JavaClassReferenceProvider, Project, Object> JVM_REFERENCE_PROVIDER = new UserDataCache<JavaClassReferenceProvider, Project, Object>("JvmPsiTypeConverterImplJVM") {
@Override
protected JavaClassReferenceProvider compute(Project project, Object p) {
JavaClassReferenceProvider provider = new JavaClassReferenceProvider(project);
provider.setOption(JavaClassReferenceProvider.JVM_FORMAT, Boolean.TRUE);
provider.setSoft(true);
return provider;
}
};
private static final UserDataCache<JavaClassReferenceProvider, Project, Object> REFERENCE_PROVIDER = new UserDataCache<JavaClassReferenceProvider, Project, Object>("JvmPsiTypeConverterImplPlain") {
@Override
protected JavaClassReferenceProvider compute(Project project, Object p) {
JavaClassReferenceProvider provider = new JavaClassReferenceProvider(project);
provider.setSoft(true);
return provider;
}
};
private static final JavaClassReferenceProvider JVM_REFERENCE_PROVIDER = new JavaClassReferenceProvider();
private static final JavaClassReferenceProvider REFERENCE_PROVIDER = new JavaClassReferenceProvider();
static {
JVM_REFERENCE_PROVIDER.setOption(JavaClassReferenceProvider.JVM_FORMAT, Boolean.TRUE);
JVM_REFERENCE_PROVIDER.setSoft(true);
REFERENCE_PROVIDER.setSoft(true);
}
static {
ourPrimitiveTypes.put(PsiType.BYTE, 'B');
@@ -150,11 +140,11 @@ public class JvmPsiTypeConverterImpl extends JvmPsiTypeConverter implements Cust
final int dimensions = getArrayDimensions(s);
if (dimensions > 0) {
if (s.charAt(dimensions) == 'L' && s.endsWith(";")) {
return JVM_REFERENCE_PROVIDER.get(value.getManager().getProject(), null).getReferencesByString(s.substring(dimensions + 1), element,
element.getText().indexOf(s) + dimensions + 1);
return JVM_REFERENCE_PROVIDER.getReferencesByString(s.substring(dimensions + 1), element,
element.getText().indexOf(s) + dimensions + 1);
}
if (psiType != null) return PsiReference.EMPTY_ARRAY;
}
return REFERENCE_PROVIDER.get(value.getManager().getProject(), null).getReferencesByElement(element);
return REFERENCE_PROVIDER.getReferencesByElement(element);
}
}
@@ -60,10 +60,17 @@ public class PsiClassConverter extends Converter<PsiClass> implements CustomRefe
return provider.getReferencesByElement(element);
}
protected JavaClassReferenceProvider createClassReferenceProvider(GenericDomValue<PsiClass> genericDomValue, ConvertContext context,
protected JavaClassReferenceProvider createClassReferenceProvider(final GenericDomValue<PsiClass> genericDomValue, ConvertContext context,
ExtendClass extendClass) {
final JavaClassReferenceProvider provider =
new JavaClassReferenceProvider(getScope(genericDomValue), context.getPsiManager().getProject());
new JavaClassReferenceProvider() {
@Override
public GlobalSearchScope getScope() {
return PsiClassConverter.this.getScope(genericDomValue);
}
};
if (extendClass != null) {
if (StringUtil.isNotEmpty(extendClass.value())) {
provider.setOption(JavaClassReferenceProvider.EXTEND_CLASS_NAMES, new String[]{extendClass.value()});
@@ -15,15 +15,13 @@
*/
package com.intellij.util.xml.converters;
import com.intellij.util.xml.converters.values.ClassArrayConverter;
import com.intellij.util.xml.GenericDomValue;
import com.intellij.util.xml.ConvertContext;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiElement;
import com.intellij.psi.ElementManipulators;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.UserDataCache;
import com.intellij.util.xml.ConvertContext;
import com.intellij.util.xml.GenericDomValue;
import com.intellij.util.xml.converters.values.ClassArrayConverter;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -33,15 +31,12 @@ import java.util.List;
* User: Sergey.Vasiliev
*/
public class ClassArrayConverterImpl extends ClassArrayConverter {
private static final UserDataCache<JavaClassReferenceProvider, Project, Object> REFERENCE_PROVIDER = new UserDataCache<JavaClassReferenceProvider, Project, Object>("ClassArrayConverterImpl") {
@Override
protected JavaClassReferenceProvider compute(Project project, Object p) {
JavaClassReferenceProvider provider = new JavaClassReferenceProvider(project);
provider.setSoft(true);
provider.setAllowEmpty(true);
return provider;
}
};
private static final JavaClassReferenceProvider REFERENCE_PROVIDER = new JavaClassReferenceProvider();
static {
REFERENCE_PROVIDER.setSoft(true);
REFERENCE_PROVIDER.setAllowEmpty(true);
}
@NotNull
public PsiReference[] createReferences(final GenericDomValue genericDomValue, final PsiElement element, final ConvertContext context) {
@@ -73,7 +68,7 @@ public class ClassArrayConverterImpl extends ClassArrayConverter {
}
private static void createReference(final PsiElement element, final String s, final int offset, List<PsiReference> list) {
final PsiReference[] references = REFERENCE_PROVIDER.get(element.getProject(), null).getReferencesByString(s, element, offset);
final PsiReference[] references = REFERENCE_PROVIDER.getReferencesByString(s, element, offset);
//noinspection ManualArrayToCollectionCopy
for (PsiReference ref: references) {
list.add(ref);
@@ -15,32 +15,27 @@
*/
package com.intellij.util.xml.converters;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiElement;
import com.intellij.util.xml.converters.values.ClassValueConverter;
import com.intellij.util.xml.GenericDomValue;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
import com.intellij.util.xml.ConvertContext;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.UserDataCache;
import com.intellij.util.xml.GenericDomValue;
import com.intellij.util.xml.converters.values.ClassValueConverter;
import org.jetbrains.annotations.NotNull;
/**
* User: Sergey.Vasiliev
*/
public class ClassValueConverterImpl extends ClassValueConverter {
private static final UserDataCache<JavaClassReferenceProvider, Project, Object> REFERENCE_PROVIDER = new UserDataCache<JavaClassReferenceProvider, Project, Object>("ClassValueConverterImpl") {
@Override
protected JavaClassReferenceProvider compute(Project project, Object p) {
JavaClassReferenceProvider provider = new JavaClassReferenceProvider(project);
provider.setSoft(true);
provider.setAllowEmpty(true);
return provider;
}
};
private static final JavaClassReferenceProvider REFERENCE_PROVIDER = new JavaClassReferenceProvider();
static {
REFERENCE_PROVIDER.setSoft(true);
REFERENCE_PROVIDER.setAllowEmpty(true);
}
@NotNull
public PsiReference[] createReferences(final GenericDomValue genericDomValue, final PsiElement element, final ConvertContext context) {
return REFERENCE_PROVIDER.get(element.getManager().getProject(), null).getReferencesByElement(element);
return REFERENCE_PROVIDER.getReferencesByElement(element);
}
}
@@ -72,8 +72,8 @@ public class WordCompletionTest extends CompletionTestCase {
}};
}
};
ReferenceProvidersRegistry.getInstance(getProject()).registerReferenceProvider(PsiLiteralExpression.class, softProvider);
ReferenceProvidersRegistry.getInstance(getProject()).registerReferenceProvider(PsiLiteralExpression.class, hardProvider);
ReferenceProvidersRegistry.getInstance().registerReferenceProvider(PsiLiteralExpression.class, softProvider);
ReferenceProvidersRegistry.getInstance().registerReferenceProvider(PsiLiteralExpression.class, hardProvider);
configureByFile(BASE_PATH + "3.java");
checkResultByFile(BASE_PATH + "3_after.java");
@@ -23,10 +23,17 @@ import com.intellij.openapi.project.Project;
*/
public abstract class CommonReferenceProviderTypes {
/**
* @deprecated
* @see #getInstance()
*/
public static CommonReferenceProviderTypes getInstance(final Project project) {
return ServiceManager.getService(project, CommonReferenceProviderTypes.class);
return getInstance();
}
public static CommonReferenceProviderTypes getInstance() {
return ServiceManager.getService(CommonReferenceProviderTypes.class);
}
public static final ReferenceProviderType PROPERTIES_FILE_KEY_PROVIDER = new ReferenceProviderType("Properties File Key Provider");
public static final ReferenceProviderType URI_PROVIDER = new ReferenceProviderType("Uri references provider");
@@ -178,7 +178,7 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase {
if (isPerformanceTest()) {
IntentionManager.getInstance().getAvailableIntentionActions(); // hack to avoid slowdowns in PyExtensionFactory
PathManagerEx.getTestDataPath(); // to cache stuff
ReferenceProvidersRegistry.getInstance(getProject()); // preload tons of classes
ReferenceProvidersRegistry.getInstance(); // preload tons of classes
InjectedLanguageManager.getInstance(getProject()); // zillion of Dom Sem classes
LanguageAnnotators.INSTANCE.allForLanguage(StdLanguages.JAVA); // pile of annotator classes loads
LanguageAnnotators.INSTANCE.allForLanguage(StdLanguages.XML);
@@ -15,7 +15,6 @@
*/
package com.intellij.psi;
import com.intellij.openapi.project.Project;
import com.intellij.patterns.ElementPattern;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.patterns.StandardPatterns;
@@ -60,10 +59,4 @@ public abstract class PsiReferenceRegistrar {
public abstract <T extends PsiElement> void registerReferenceProvider(@NotNull ElementPattern<T> pattern, @NotNull PomReferenceProvider<T> provider, double priority);
/**
* Return the project to register providers for.
* @return project or null, if POM references are registered
*/
@Deprecated
public abstract Project getProject();
}
@@ -254,10 +254,6 @@ public class PomReferenceServiceImpl extends PomReferenceService {
double priority) {
}
public Project getProject() {
return null;
}
@Override
public <T extends PsiElement> void registerReferenceProvider(@NotNull ElementPattern<T> pattern,
@NotNull PomReferenceProvider<T> provider,
@@ -21,8 +21,6 @@ import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.progress.ProgressManager;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NotNullLazyKey;
import com.intellij.openapi.util.Trinity;
import com.intellij.patterns.*;
import com.intellij.pom.references.PomReferenceProvider;
@@ -82,17 +80,12 @@ public class ReferenceProvidersRegistry extends PsiReferenceRegistrar {
return o2.getThird().compareTo(o1.getThird());
}
};
private final Project myProject;
private static final NotNullLazyKey<ReferenceProvidersRegistry, Project> INSTANCE_CACHE =
ServiceManager.createLazyKey(ReferenceProvidersRegistry.class);
public static ReferenceProvidersRegistry getInstance(Project project) {
return INSTANCE_CACHE.getValue(project);
public static ReferenceProvidersRegistry getInstance() {
return ServiceManager.getService(ReferenceProvidersRegistry.class);
}
public ReferenceProvidersRegistry(Project project) {
myProject = project;
public ReferenceProvidersRegistry() {
for (final PsiReferenceContributor contributor : ourExtensions) {
contributor.registerReferenceProviders(this);
}
@@ -154,10 +147,6 @@ public class ReferenceProvidersRegistry extends PsiReferenceRegistrar {
}
}
public Project getProject() {
return myProject;
}
/**
* @deprecated {@link com.intellij.psi.PsiReferenceContributor}
*/
@@ -229,7 +218,7 @@ public class ReferenceProvidersRegistry extends PsiReferenceRegistrar {
assert context.isValid() : "Invalid context: " + context;
final List<Trinity<PsiReferenceProvider, ProcessingContext, Double>> providers =
getInstance(context.getProject()).getPairsByElement(context, hints);
getInstance().getPairsByElement(context, hints);
if (providers.isEmpty()) {
return PsiReference.EMPTY_ARRAY;
}
@@ -221,7 +221,7 @@
<projectService serviceInterface="com.intellij.diagnostic.logging.LogConsolePreferences"
serviceImplementation="com.intellij.diagnostic.logging.LogConsolePreferences"/>
<projectService serviceInterface="com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry"
<applicationService serviceInterface="com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry"
serviceImplementation="com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry"/>
<projectService serviceInterface="com.intellij.find.FindManager"
@@ -18,17 +18,25 @@ package com.intellij.lang.properties;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.lang.properties.psi.impl.PropertyValueImpl;
import com.intellij.patterns.PsiJavaPatterns;
import static com.intellij.patterns.PsiJavaPatterns.literalExpression;
import static com.intellij.patterns.PsiJavaPatterns.psiNameValuePair;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.resolve.reference.impl.providers.JavaClassReferenceProvider;
import com.intellij.util.ProcessingContext;
import org.jetbrains.annotations.NotNull;
import static com.intellij.patterns.PsiJavaPatterns.literalExpression;
import static com.intellij.patterns.PsiJavaPatterns.psiNameValuePair;
/**
* @author peter
*/
public class PropertiesReferenceContributor extends PsiReferenceContributor{
private static final JavaClassReferenceProvider CLASS_REFERENCE_PROVIDER = new JavaClassReferenceProvider() {
public boolean isSoft() {
return true;
}
};
public void registerReferenceProviders(final PsiReferenceRegistrar registrar) {
registrar.registerReferenceProvider(literalExpression(), new PropertiesReferenceProvider(true));
registrar.registerReferenceProvider(literalExpression().withParent(
@@ -42,11 +50,7 @@ public class PropertiesReferenceContributor extends PsiReferenceContributor{
String text = element.getText();
String[] words = text.split("\\s");
if (words.length != 1) return PsiReference.EMPTY_ARRAY;
return new JavaClassReferenceProvider(element.getProject()){
public boolean isSoft() {
return true;
}
}.getReferencesByString(words[0], element, 0);
return CLASS_REFERENCE_PROVIDER.getReferencesByString(words[0], element, 0);
}
});
}
@@ -3,25 +3,23 @@ package com.intellij.psi.impl.source.resolve.reference.impl.providers;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInspection.i18n.JavaI18nUtil;
import com.intellij.patterns.PlatformPatterns;
import static com.intellij.patterns.XmlPatterns.xmlAttributeValue;
import static com.intellij.patterns.XmlPatterns.xmlTag;
import com.intellij.psi.*;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.filters.position.FilterPattern;
import com.intellij.openapi.project.Project;
import java.util.HashMap;
import java.util.Map;
import static com.intellij.patterns.XmlPatterns.xmlAttributeValue;
import static com.intellij.patterns.XmlPatterns.xmlTag;
/**
* @author peter
*/
public class JavaReferenceContributor extends PsiReferenceContributor{
public void registerReferenceProviders(final PsiReferenceRegistrar registrar) {
final Project project = registrar.getProject();
if (project == null) return;
final JavaClassListReferenceProvider classListProvider = new JavaClassListReferenceProvider(project);
final JavaClassListReferenceProvider classListProvider = new JavaClassListReferenceProvider();
registrar.registerReferenceProvider(xmlAttributeValue(), classListProvider, PsiReferenceRegistrar.LOWER_PRIORITY);
registrar.registerReferenceProvider(xmlTag(), classListProvider, PsiReferenceRegistrar.LOWER_PRIORITY);
@@ -144,7 +144,7 @@ public class FormReferenceProvider extends PsiReferenceProvider {
return;
}
final String className = valueElement.getValue().replace('$','.');
final PsiReference[] referencesByString = new JavaClassReferenceProvider(project).getReferencesByString(className, file, valueElement.getTextRange().getStartOffset() + 1);
final PsiReference[] referencesByString = new JavaClassReferenceProvider().getReferencesByString(className, file, valueElement.getTextRange().getStartOffset() + 1);
if(referencesByString.length < 1){
// There are no references there
return;
@@ -205,7 +205,7 @@ public class FormReferenceProvider extends PsiReferenceProvider {
// component class
{
if (clsAttribute != null) {
final JavaClassReferenceProvider provider = new JavaClassReferenceProvider(tag.getProject());
final JavaClassReferenceProvider provider = new JavaClassReferenceProvider();
final PsiReference[] referencesByString = provider.getReferencesByString(classNameStr, file, clsAttribute.getValueElement().getTextRange().getStartOffset() + 1);
if(referencesByString.length < 1){
// There are no references there
@@ -46,7 +46,7 @@ public class XsltReferenceContributor extends PsiReferenceContributor {
PlatformPatterns.psiElement(XmlAttributeValue.class).withParent(xmlAttribute().withLocalName(string().oneOf(
"name", "href", "mode", "elements", "exclude-result-prefixes", "extension-element-prefixes", "stylesheet-prefix"
)).withParent(xmlTag().withNamespace(XsltSupport.XSLT_NS))),
new XsltReferenceProvider(registrar.getProject()));
new XsltReferenceProvider());
// TODO: 1. SchemaReferencesProvider doesn't know about "as" attribute / 2. what to do with non-schema types (xs:yearMonthDuretion, xs:dayTimeDuration)?
// registrar.registerReferenceProvider(
@@ -1,7 +1,6 @@
package org.intellij.lang.xpath.xslt.impl.references;
import com.intellij.javaee.ExternalResourceManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.TextRange;
@@ -35,14 +34,12 @@ import java.util.regex.Pattern;
public class XsltReferenceProvider extends PsiReferenceProvider {
private static final Key<CachedValue<PsiReference[]>> CACHED_XSLT_REFS = Key.create("CACHED_XSLT_REFS");
private final CachedValuesManager myCacheManager;
private final XsltElementFactory myXsltElementFactory = XsltElementFactory.getInstance();
private static final Pattern ELEMENT_PATTERN = Pattern.compile("(?:(\\w+):)?(?:\\w+|\\*)");
private static final Pattern PREFIX_PATTERN = Pattern.compile("(?:^|\\s)(\\w+)");
public XsltReferenceProvider(Project project) {
myCacheManager = CachedValuesManager.getManager(project);
public XsltReferenceProvider() {
}
@NotNull
@@ -53,7 +50,7 @@ public class XsltReferenceProvider extends PsiReferenceProvider {
CachedValue<PsiReference[]> cachedValue = attribute.getUserData(CACHED_XSLT_REFS);
if (cachedValue == null) {
cachedValue = myCacheManager.createCachedValue(new ReferenceProvider(attribute), false);
cachedValue = CachedValuesManager.getManager(element.getProject()).createCachedValue(new ReferenceProvider(attribute), false);
attribute.putUserData(CACHED_XSLT_REFS, cachedValue);
}
+1 -1
View File
@@ -429,7 +429,7 @@
<projectService serviceInterface="com.intellij.openapi.vcs.impl.VcsPathPresenter"
serviceImplementation="com.intellij.openapi.vcs.impl.ModuleVcsPathPresenter"/>
<projectService serviceInterface="com.intellij.psi.CommonReferenceProviderTypes"
<applicationService serviceInterface="com.intellij.psi.CommonReferenceProviderTypes"
serviceImplementation="com.intellij.psi.impl.CommonReferenceProviderTypesImpl"/>
<projectService serviceInterface="com.intellij.psi.impl.file.PsiDirectoryFactory"
serviceImplementation="com.intellij.psi.impl.file.PsiJavaDirectoryFactory"/>