less jar file calculations by PsiElement during Cls resolve

This commit is contained in:
peter
2010-12-13 16:57:03 +03:00
parent d868182c14
commit 8ddcec8a44
2 changed files with 28 additions and 18 deletions
@@ -17,6 +17,7 @@ package com.intellij.psi.impl.compiled;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiManagerEx;
import com.intellij.psi.impl.PsiSubstitutorImpl;
@@ -31,6 +32,7 @@ import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Map;
@@ -148,6 +150,7 @@ public class ClsJavaCodeReferenceElementImpl extends ClsElementImpl implements P
return advancedResolve(false).getElement();
}
@Nullable
private PsiElement resolveElement() {
PsiElement element = getParent();
while(element != null && (!(element instanceof PsiClass) || element instanceof PsiTypeParameter)) {
@@ -171,12 +174,20 @@ public class ClsJavaCodeReferenceElementImpl extends ClsElementImpl implements P
return resolveClassPreferringMyJar();
}
@Nullable
private PsiClass resolveClassPreferringMyJar() {
PsiClass[] classes = JavaPsiFacade.getInstance(getProject()).findClasses(myQualifiedName, getResolveScope());
for (PsiClass aClass : classes) {
if (JavaDirectInheritorsSearcher.isFromTheSameJar(aClass, this)) return aClass;
if (classes.length == 0) return null;
if (classes.length > 1) {
VirtualFile jarFile = JavaDirectInheritorsSearcher.getJarFile(this);
if (jarFile != null) {
for (PsiClass aClass : classes) {
if (JavaDirectInheritorsSearcher.getJarFile(aClass) == jarFile) return aClass;
}
}
}
return classes.length == 0 ? null : classes[0];
return classes[0];
}
public void processVariants(PsiScopeProcessor processor) {
@@ -21,8 +21,10 @@ import com.intellij.psi.search.searches.AllClassesSearch;
import com.intellij.psi.search.searches.DirectClassInheritorsSearch;
import com.intellij.util.Processor;
import com.intellij.util.QueryExecutor;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.HashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collection;
@@ -142,33 +144,30 @@ public class JavaDirectInheritorsSearcher implements QueryExecutor<PsiClass, Dir
private static boolean processSameNamedClasses(Processor<PsiClass> consumer, PsiClass aClass, List<PsiClass> sameNamedClasses) {
// if there is a class from the same jar, prefer it
boolean sameJarClassFound = false;
for (PsiClass sameNamedClass : sameNamedClasses) {
boolean fromSameJar = isFromTheSameJar(sameNamedClass, aClass);
if (fromSameJar) {
sameJarClassFound = true;
if (!consumer.process(sameNamedClass)) return false;
VirtualFile jarFile = getJarFile(aClass);
if (jarFile != null) {
for (PsiClass sameNamedClass : sameNamedClasses) {
boolean fromSameJar = getJarFile(sameNamedClass) == jarFile;
if (fromSameJar) {
sameJarClassFound = true;
if (!consumer.process(sameNamedClass)) return false;
}
}
}
if (!sameJarClassFound) {
for (PsiClass sameNamedClass : sameNamedClasses) {
if (!consumer.process(sameNamedClass)) return false;
}
return ContainerUtil.process(sameNamedClasses, consumer);
}
return true;
}
private static VirtualFile getJarFile(PsiElement candidate) {
@Nullable
public static VirtualFile getJarFile(PsiElement candidate) {
VirtualFile file = candidate.getContainingFile().getVirtualFile();
if (file != null && file.getFileSystem() instanceof JarFileSystem) {
return JarFileSystem.getInstance().getVirtualFileForJar(file);
}
return file;
}
public static boolean isFromTheSameJar(PsiElement candidate, PsiElement other) {
VirtualFile c1 = getJarFile(candidate);
VirtualFile c2 = getJarFile(other);
return c1 != null && c1 == c2;
}
}