JavaDescriptorResolver: negative package cache

Time spent in JavaDescriptorResolver.resolveNamespace reduced from 10% to 5%
in CompileCompilerDependenciesTest
This commit is contained in:
Stepan Koltsov
2012-04-21 18:03:53 +04:00
parent be9004aa62
commit 7c8937bd2d
@@ -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;
} }