Make ModuleDescriptor#getPackage() return not null lazy object with lazy scope

Refactor: no need to create package view in order to obtain its subpackages
LazyPackageViewDescriptorImpl to replace PackageViewDescriptorImpl
This allows to avoid computations when package views are requested but their contents not necessarily queried
For example: DescriptorResolver.resolvePackageHeader()
This commit is contained in:
Pavel V. Talanov
2015-05-07 19:43:17 +03:00
parent 1cf38e4799
commit 37bcd455b5
40 changed files with 103 additions and 105 deletions
@@ -1227,11 +1227,10 @@ public class DescriptorResolver {
FqName fqName = packageDirective.getFqName(nameExpression);
PackageViewDescriptor packageView = module.getPackage(fqName);
assert packageView != null : "package not found: " + fqName;
trace.record(REFERENCE_TARGET, nameExpression, packageView);
PackageViewDescriptor parentPackageView = packageView.getContainingDeclaration();
assert parentPackageView != null : "package has no parent: " + packageView;
assert parentPackageView != null : "Should not be null since " + fqName + " should not be root";
trace.record(RESOLUTION_SCOPE, nameExpression, parentPackageView.getMemberScope());
}
}
@@ -86,10 +86,10 @@ public class ImportDirectiveProcessor(
val packageView = moduleDescriptor.getPackage(fqName)
if (jetExpression == null) {
assert(fqName.isRoot())
return packageView.sure { "Root package does not exist in module $moduleDescriptor" }
return packageView
}
return when {
packageView != null -> {
!packageView.isEmpty() -> {
recordPackageViews(jetExpression, packageView, trace)
packageView
}
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.resolve.lazy
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.PackageViewDescriptor
import org.jetbrains.kotlin.descriptors.impl.SubpackagesScope
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.JetCodeFragment
@@ -67,8 +66,8 @@ class LazyFileScope private constructor(
else
file.getImportDirectives()
val packageView = getPackageViewDescriptor(file, resolveSession)
val moduleDescriptor = resolveSession.getModuleDescriptor()
val packageView = moduleDescriptor.getPackage(file.getPackageFqName())
val packageFragment = resolveSession.getPackageFragment(file.getPackageFqName())
.sure { "Could not find fragment ${file.getPackageFqName()} for file ${file.getName()}" }
@@ -96,11 +95,5 @@ class LazyFileScope private constructor(
return LazyFileScope(scopeChain, aliasImportResolver, allUnderImportResolver, packageFragment, debugName)
}
private fun getPackageViewDescriptor(file: JetFile, resolveSession: ResolveSession): PackageViewDescriptor {
val fqName = file.getPackageFqName()
return resolveSession.getModuleDescriptor().getPackage(fqName)
?: throw IllegalStateException("Package not found: $fqName maybe the file is not in scope of this resolve session: ${file.getName()}")
}
}
}
@@ -59,7 +59,7 @@ public class ResolveSessionUtils {
FqName packageFqName = fqName.parent();
while (true) {
PackageViewDescriptor packageDescriptor = module.getPackage(packageFqName);
if (packageDescriptor != null) {
if (!packageDescriptor.isEmpty()) {
FqName relativeClassFqName = NamePackage.tail(fqName, packageFqName);
ClassDescriptor classDescriptor = findByQualifiedName(packageDescriptor.getMemberScope(), relativeClassFqName);
if (classDescriptor != null && filter.apply(classDescriptor)) {
@@ -168,7 +168,7 @@ public final class JetScopeUtils {
if (packageFragment == null) return null;
PackageViewDescriptor packageView = packageFragment.getContainingDeclaration().getPackage(((JetFile) parent).getPackageFqName());
return packageView != null ? packageView.getMemberScope() : null;
return packageView.getMemberScope();
}
JetExpression expression = PsiTreeUtil.getParentOfType(element, JetExpression.class, false);