From 7c8937bd2dd9fa5037333ea05375df614e7db002 Mon Sep 17 00:00:00 2001 From: Stepan Koltsov Date: Sat, 21 Apr 2012 18:03:53 +0400 Subject: [PATCH] JavaDescriptorResolver: negative package cache Time spent in JavaDescriptorResolver.resolveNamespace reduced from 10% to 5% in CompileCompilerDependenciesTest --- .../resolve/java/JavaDescriptorResolver.java | 42 +++++++++++++++++-- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 9f8015a8b06..248fca7c8a7 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -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 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 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; }