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;
|
final PsiClass psiClass;
|
||||||
@Nullable
|
@Nullable
|
||||||
final PsiPackage psiPackage;
|
final PsiPackage psiPackage;
|
||||||
@NotNull
|
|
||||||
final FqName fqName;
|
final FqName fqName;
|
||||||
final boolean staticMembers;
|
final boolean staticMembers;
|
||||||
final boolean kotlin;
|
final boolean kotlin;
|
||||||
@NotNull
|
|
||||||
final ClassOrNamespaceDescriptor classOrNamespaceDescriptor;
|
final ClassOrNamespaceDescriptor classOrNamespaceDescriptor;
|
||||||
|
|
||||||
protected ResolverScopeData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) {
|
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;
|
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
|
@NotNull
|
||||||
public PsiElement getPsiPackageOrPsiClass() {
|
public PsiElement getPsiPackageOrPsiClass() {
|
||||||
if (psiPackage != null) {
|
if (psiPackage != null) {
|
||||||
@@ -262,6 +276,13 @@ public class JavaDescriptorResolver {
|
|||||||
this.classDescriptor = classDescriptor;
|
this.classDescriptor = classDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ResolverBinaryClassData(boolean negative) {
|
||||||
|
super(negative);
|
||||||
|
this.classDescriptor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static final ResolverBinaryClassData NEGATIVE = new ResolverBinaryClassData(true);
|
||||||
|
|
||||||
List<TypeParameterDescriptorInitialization> typeParameters;
|
List<TypeParameterDescriptorInitialization> typeParameters;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -286,6 +307,13 @@ public class JavaDescriptorResolver {
|
|||||||
this.namespaceDescriptor = namespaceDescriptor;
|
this.namespaceDescriptor = namespaceDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ResolverNamespaceData(boolean negative) {
|
||||||
|
super(negative);
|
||||||
|
this.namespaceDescriptor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static final ResolverNamespaceData NEGATIVE = new ResolverNamespaceData(true);
|
||||||
|
|
||||||
private JavaPackageScope memberScope;
|
private JavaPackageScope memberScope;
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -374,11 +402,15 @@ public class JavaDescriptorResolver {
|
|||||||
if (classData == null) {
|
if (classData == null) {
|
||||||
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
|
PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
|
||||||
if (psiClass == null) {
|
if (psiClass == null) {
|
||||||
|
ResolverBinaryClassData oldValue = classDescriptorCache.put(qualifiedName, ResolverBinaryClassData.NEGATIVE);
|
||||||
|
if (oldValue != null) {
|
||||||
|
throw new IllegalStateException("rewrite at " + qualifiedName);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
classData = createJavaClassDescriptor(psiClass, tasks);
|
classData = createJavaClassDescriptor(psiClass, tasks);
|
||||||
}
|
}
|
||||||
return classData.getClassDescriptor();
|
return classData.classDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) {
|
private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) {
|
||||||
@@ -974,6 +1006,10 @@ public class JavaDescriptorResolver {
|
|||||||
break lookingForPsi;
|
break lookingForPsi;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, ResolverNamespaceData.NEGATIVE);
|
||||||
|
if (oldValue != null) {
|
||||||
|
throw new IllegalStateException("rewrite at " + fqName);
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user