From 8ddcec8a44f2444a8c8ff2929474c2f0c26b5ab7 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 13 Dec 2010 16:57:03 +0300 Subject: [PATCH] less jar file calculations by PsiElement during Cls resolve --- .../ClsJavaCodeReferenceElementImpl.java | 17 +++++++++-- .../search/JavaDirectInheritorsSearcher.java | 29 +++++++++---------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java b/java/java-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java index eb37c848fbcb..4282ffb82440 100644 --- a/java/java-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/compiled/ClsJavaCodeReferenceElementImpl.java @@ -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) { diff --git a/java/java-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java b/java/java-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java index 102aa2504aab..2fb80261ec5d 100644 --- a/java/java-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java +++ b/java/java-impl/src/com/intellij/psi/impl/search/JavaDirectInheritorsSearcher.java @@ -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 consumer, PsiClass aClass, List 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; - } - }