From 0089fa63ba16f3996ce1254acaf0b1dd4d48195d Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Thu, 10 Jul 2008 13:06:24 +0400 Subject: [PATCH] add references registered to supers of the class requested --- .../reference/ReferenceProvidersRegistry.java | 45 ++++++++++++++++------ 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistry.java b/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistry.java index 188d7165b9..820bda8b2b 100644 --- a/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistry.java +++ b/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistry.java @@ -1,5 +1,6 @@ package com.intellij.psi.impl.source.resolve.reference; +import com.intellij.codeInsight.completion.LegacyCompletionContributor; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.project.Project; @@ -11,7 +12,8 @@ import com.intellij.psi.filters.position.FilterPattern; import com.intellij.util.*; import com.intellij.util.containers.ConcurrentWeakHashMap; import com.intellij.util.containers.ContainerUtil; -import com.intellij.codeInsight.completion.LegacyCompletionContributor; +import com.intellij.util.containers.MultiMap; +import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -28,6 +30,7 @@ import java.util.concurrent.ConcurrentMap; public class ReferenceProvidersRegistry implements PsiReferenceRegistrar { private final ConcurrentMap myBindingsMap = new ConcurrentWeakHashMap(); private final ConcurrentMap myNamedBindingsMap = new ConcurrentWeakHashMap(); + private MultiMap myKnownSupers; private boolean myInitialized; private static final Comparator> PRIORITY_COMPARATOR = new Comparator>() { @@ -59,6 +62,7 @@ public class ReferenceProvidersRegistry implements PsiReferenceRegistrar { registerReferenceProvider(pattern, provider, DEFAULT_PRIORITY); } public void registerReferenceProvider(@NotNull ElementPattern pattern, @NotNull PsiReferenceProvider provider, double priority) { + myKnownSupers = null; final Class scope = pattern.getCondition().getInitialCondition().getAcceptedClass(); final PsiNamePatternCondition nameCondition = ContainerUtil.findInstance(pattern.getCondition().getConditions(), PsiNamePatternCondition.class); if (nameCondition != null) { @@ -159,18 +163,37 @@ public class ReferenceProvidersRegistry implements PsiReferenceRegistrar { } } - final SimpleProviderBinding simpleBinding = myBindingsMap.get(clazz); - final NamedObjectProviderBinding namedBinding = myNamedBindingsMap.get(clazz); - if (simpleBinding == null && namedBinding == null) return Collections.emptyList(); - - List> ret = new SmartList>(); - if (simpleBinding != null) { - simpleBinding.addAcceptableReferenceProviders(element, ret); + MultiMap knownSupers = myKnownSupers; + if (knownSupers == null) { + knownSupers = new MultiMap(); + Set allClasses = new THashSet(); + allClasses.addAll(myBindingsMap.keySet()); + allClasses.addAll(myNamedBindingsMap.keySet()); + for (final Class ancestor : allClasses) { + for (final Class descendant : allClasses) { + if (ancestor.isAssignableFrom(descendant)) { + knownSupers.putValue(descendant, ancestor); + } + } + } + myKnownSupers = knownSupers; } - if (namedBinding != null) { - namedBinding.addAcceptableReferenceProviders(element, ret); + + List> ret = null; + for (final Class aClass : knownSupers.get(clazz)) { + final SimpleProviderBinding simpleBinding = myBindingsMap.get(aClass); + final NamedObjectProviderBinding namedBinding = myNamedBindingsMap.get(aClass); + if (simpleBinding == null && namedBinding == null) continue; + + if (ret == null) ret = new SmartList>(); + if (simpleBinding != null) { + simpleBinding.addAcceptableReferenceProviders(element, ret); + } + if (namedBinding != null) { + namedBinding.addAcceptableReferenceProviders(element, ret); + } } - return ret; + return ret == null ? Collections.>emptyList() : ret; } public static PsiReference[] getReferencesFromProviders(PsiElement context, @NotNull Class clazz){ -- 2.11.4.GIT