mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
less jar file calculations by PsiElement during Cls resolve
This commit is contained in:
+14
-3
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user