JavaDescriptorResolver: negative package cache
Time spent in JavaDescriptorResolver.resolveNamespace reduced from 10% to 5% in CompileCompilerDependenciesTest
This commit is contained in:
+39
-3
@@ -209,11 +209,9 @@ public class JavaDescriptorResolver {
|
||||
final PsiClass psiClass;
|
||||
@Nullable
|
||||
final PsiPackage psiPackage;
|
||||
@NotNull
|
||||
final FqName fqName;
|
||||
final boolean staticMembers;
|
||||
final boolean kotlin;
|
||||
@NotNull
|
||||
final ClassOrNamespaceDescriptor classOrNamespaceDescriptor;
|
||||
|
||||
protected ResolverScopeData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) {
|
||||
@@ -237,6 +235,22 @@ public class JavaDescriptorResolver {
|
||||
classOrNamespaceDescriptor = descriptor;
|
||||
}
|
||||
|
||||
protected ResolverScopeData(boolean negative) {
|
||||
if (!negative) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
this.psiClass = null;
|
||||
this.psiPackage = null;
|
||||
this.fqName = null;
|
||||
this.staticMembers = false;
|
||||
this.kotlin = false;
|
||||
this.classOrNamespaceDescriptor = null;
|
||||
}
|
||||
|
||||
public boolean isPositive() {
|
||||
return this.classOrNamespaceDescriptor != null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public PsiElement getPsiPackageOrPsiClass() {
|
||||
if (psiPackage != null) {
|
||||
@@ -262,6 +276,13 @@ public class JavaDescriptorResolver {
|
||||
this.classDescriptor = classDescriptor;
|
||||
}
|
||||
|
||||
private ResolverBinaryClassData(boolean negative) {
|
||||
super(negative);
|
||||
this.classDescriptor = null;
|
||||
}
|
||||
|
||||
static final ResolverBinaryClassData NEGATIVE = new ResolverBinaryClassData(true);
|
||||
|
||||
List<TypeParameterDescriptorInitialization> typeParameters;
|
||||
|
||||
@NotNull
|
||||
@@ -286,6 +307,13 @@ public class JavaDescriptorResolver {
|
||||
this.namespaceDescriptor = namespaceDescriptor;
|
||||
}
|
||||
|
||||
private ResolverNamespaceData(boolean negative) {
|
||||
super(negative);
|
||||
this.namespaceDescriptor = null;
|
||||
}
|
||||
|
||||
static final ResolverNamespaceData NEGATIVE = new ResolverNamespaceData(true);
|
||||
|
||||
private JavaPackageScope memberScope;
|
||||
|
||||
@NotNull
|
||||
@@ -374,11 +402,15 @@ public class JavaDescriptorResolver {
|
||||
if (classData == null) {
|
||||
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
|
||||
if (psiClass == null) {
|
||||
ResolverBinaryClassData oldValue = classDescriptorCache.put(qualifiedName, ResolverBinaryClassData.NEGATIVE);
|
||||
if (oldValue != null) {
|
||||
throw new IllegalStateException("rewrite at " + qualifiedName);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
classData = createJavaClassDescriptor(psiClass, tasks);
|
||||
}
|
||||
return classData.getClassDescriptor();
|
||||
return classData.classDescriptor;
|
||||
}
|
||||
|
||||
private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) {
|
||||
@@ -974,6 +1006,10 @@ public class JavaDescriptorResolver {
|
||||
break lookingForPsi;
|
||||
}
|
||||
|
||||
ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, ResolverNamespaceData.NEGATIVE);
|
||||
if (oldValue != null) {
|
||||
throw new IllegalStateException("rewrite at " + fqName);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user