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:
+1
-1
@@ -108,7 +108,7 @@ public class BuiltInsSerializer(private val dependOnOldBuiltIns: Boolean) {
|
||||
}
|
||||
|
||||
private fun serializePackage(module: ModuleDescriptor, fqName: FqName, destDir: File) {
|
||||
val packageView = module.getPackage(fqName) ?: error("No package resolved in $module")
|
||||
val packageView = module.getPackage(fqName)
|
||||
|
||||
// TODO: perform some kind of validation? At the moment not possible because DescriptorValidator is in compiler-tests
|
||||
// DescriptorValidator.validate(packageView)
|
||||
|
||||
+1
-3
@@ -167,15 +167,13 @@ public class CliLightClassGenerationSupport extends LightClassGenerationSupport
|
||||
|
||||
@Override
|
||||
public boolean packageExists(@NotNull FqName fqName, @NotNull GlobalSearchScope scope) {
|
||||
return getModule().getPackage(fqName) != null;
|
||||
return !getModule().getPackage(fqName).isEmpty();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<FqName> getSubPackages(@NotNull FqName fqn, @NotNull GlobalSearchScope scope) {
|
||||
PackageViewDescriptor packageView = getModule().getPackage(fqn);
|
||||
if (packageView == null) return Collections.emptyList();
|
||||
|
||||
Collection<DeclarationDescriptor> members = packageView.getMemberScope().getDescriptors(DescriptorKindFilter.PACKAGES, JetScope.ALL_NAME_FILTER);
|
||||
return ContainerUtil.mapNotNull(members, new Function<DeclarationDescriptor, FqName>() {
|
||||
@Override
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -262,8 +262,8 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest {
|
||||
|
||||
for (TestModule module : KotlinPackage.sort(modules.keySet())) {
|
||||
ModuleDescriptorImpl moduleDescriptor = modules.get(module);
|
||||
DeclarationDescriptor aPackage = moduleDescriptor.getPackage(FqName.ROOT);
|
||||
assertNotNull(aPackage);
|
||||
PackageViewDescriptor aPackage = moduleDescriptor.getPackage(FqName.ROOT);
|
||||
assertFalse(aPackage.isEmpty());
|
||||
|
||||
if (isMultiModuleTest) {
|
||||
rootPackageText.append(String.format("// -- Module: %s --\n", moduleDescriptor.getName()));
|
||||
|
||||
+1
-1
@@ -76,7 +76,7 @@ public abstract class AbstractCompileJavaAgainstKotlinTest extends TestCaseWithT
|
||||
|
||||
AnalysisResult exhaust = JvmResolveUtil.analyzeFilesWithJavaIntegration(environment.getProject(), Collections.<JetFile>emptySet());
|
||||
PackageViewDescriptor packageView = exhaust.getModuleDescriptor().getPackage(LoadDescriptorUtil.TEST_PACKAGE_FQNAME);
|
||||
assertNotNull(packageView);
|
||||
assertFalse(packageView.isEmpty());
|
||||
|
||||
validateAndCompareDescriptorWithFile(packageView, CONFIGURATION, expectedFile);
|
||||
}
|
||||
|
||||
@@ -105,7 +105,6 @@ public abstract class AbstractLoadJavaTest extends TestCaseWithTmpdir {
|
||||
configurationKind);
|
||||
|
||||
PackageViewDescriptor packageFromSource = result.getModuleDescriptor().getPackage(TEST_PACKAGE_FQNAME);
|
||||
assert packageFromSource != null : "Package " + TEST_PACKAGE_FQNAME + " not found";
|
||||
Assert.assertEquals("test", packageFromSource.getName().asString());
|
||||
|
||||
PackageViewDescriptor packageFromBinary = LoadDescriptorUtil.loadTestPackageAndBindingContextFromJavaRoot(
|
||||
@@ -157,8 +156,6 @@ public abstract class AbstractLoadJavaTest extends TestCaseWithTmpdir {
|
||||
);
|
||||
|
||||
PackageViewDescriptor packageView = moduleContext.getModule().getPackage(TEST_PACKAGE_FQNAME);
|
||||
assert packageView != null : "Test package not found";
|
||||
|
||||
checkJavaPackage(expectedFile, packageView, trace.getBindingContext(), DONT_INCLUDE_METHODS_OF_OBJECT);
|
||||
}
|
||||
|
||||
@@ -187,7 +184,7 @@ public abstract class AbstractLoadJavaTest extends TestCaseWithTmpdir {
|
||||
environment.getProject(), Collections.singleton(jetFile)
|
||||
);
|
||||
PackageViewDescriptor packageView = result.getModuleDescriptor().getPackage(TEST_PACKAGE_FQNAME);
|
||||
assertNotNull(packageView);
|
||||
assertFalse(packageView.isEmpty());
|
||||
|
||||
validateAndCompareDescriptorWithFile(packageView, DONT_INCLUDE_METHODS_OF_OBJECT.withValidationStrategy(
|
||||
new DeserializedScopeValidationVisitor()
|
||||
|
||||
+1
-1
@@ -93,7 +93,7 @@ public abstract class AbstractSdkAnnotationsValidityTest extends UsefulTestCase
|
||||
|
||||
topLevelClass.acceptVoid(visitor);
|
||||
|
||||
if (topLevelPackage != null) {
|
||||
if (!topLevelPackage.isEmpty()) {
|
||||
topLevelPackage.acceptVoid(visitor);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -90,7 +90,7 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir {
|
||||
);
|
||||
|
||||
PackageViewDescriptor packageView = result.getModuleDescriptor().getPackage(LoadDescriptorUtil.TEST_PACKAGE_FQNAME);
|
||||
assertNotNull("Failed to find package: " + LoadDescriptorUtil.TEST_PACKAGE_FQNAME, packageView);
|
||||
assertFalse("Failed to find package: " + LoadDescriptorUtil.TEST_PACKAGE_FQNAME, packageView.isEmpty());
|
||||
return packageView;
|
||||
}
|
||||
|
||||
|
||||
@@ -105,8 +105,6 @@ public final class LoadDescriptorUtil {
|
||||
ModuleDescriptor module = LazyResolveTestUtil.resolve(environment.getProject(), trace, Collections.<JetFile>emptyList());
|
||||
|
||||
PackageViewDescriptor packageView = module.getPackage(TEST_PACKAGE_FQNAME);
|
||||
assert packageView != null;
|
||||
|
||||
return Pair.create(packageView, trace.getBindingContext());
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -111,7 +111,7 @@ public class MultiModuleJavaAnalysisCustomTest : UsefulTestCase() {
|
||||
}
|
||||
|
||||
private fun checkClassInPackage(moduleDescriptor: ModuleDescriptor, packageName: String, className: String) {
|
||||
val kotlinPackage = moduleDescriptor.getPackage(FqName(packageName))!!
|
||||
val kotlinPackage = moduleDescriptor.getPackage(FqName(packageName))
|
||||
val kotlinClassName = Name.identifier(className)
|
||||
val kotlinClass = kotlinPackage.memberScope.getClassifier(kotlinClassName) as ClassDescriptor
|
||||
checkClass(kotlinClass)
|
||||
|
||||
+1
-1
@@ -144,7 +144,7 @@ public abstract class AbstractJvmRuntimeDescriptorLoaderTest : TestCaseWithTmpdi
|
||||
val header = ReflectKotlinClass.create(klass)?.getClassHeader()
|
||||
|
||||
if (header?.kind == KotlinClassHeader.Kind.PACKAGE_FACADE) {
|
||||
val packageView = module.getPackage(LoadDescriptorUtil.TEST_PACKAGE_FQNAME).sure { "Couldn't resolve package ${LoadDescriptorUtil.TEST_PACKAGE_FQNAME}" }
|
||||
val packageView = module.getPackage(LoadDescriptorUtil.TEST_PACKAGE_FQNAME)
|
||||
packageScopes.add(packageView.memberScope)
|
||||
}
|
||||
else if (header == null ||
|
||||
|
||||
+1
-1
@@ -51,7 +51,7 @@ public class BuiltInsSerializerTest : TestCaseWithTmpdir() {
|
||||
module.setDependencies(module, KotlinBuiltIns.getInstance().getBuiltInsModule())
|
||||
|
||||
RecursiveDescriptorComparator.validateAndCompareDescriptorWithFile(
|
||||
module.getPackage(TEST_PACKAGE_FQNAME)!!,
|
||||
module.getPackage(TEST_PACKAGE_FQNAME),
|
||||
RecursiveDescriptorComparator.DONT_INCLUDE_METHODS_OF_OBJECT,
|
||||
File(source.replace(".kt", ".txt"))
|
||||
)
|
||||
|
||||
+1
-1
@@ -57,7 +57,7 @@ public class KotlinJavascriptSerializerTest : TestCaseWithTmpdir() {
|
||||
val module = deserialize(metaFile)
|
||||
|
||||
RecursiveDescriptorComparator.validateAndCompareDescriptorWithFile(
|
||||
module.getPackage(TEST_PACKAGE_FQNAME)!!,
|
||||
module.getPackage(TEST_PACKAGE_FQNAME),
|
||||
RecursiveDescriptorComparator.DONT_INCLUDE_METHODS_OF_OBJECT,
|
||||
File(source.replace(".kt", ".txt"))
|
||||
)
|
||||
|
||||
@@ -46,7 +46,6 @@ public class RecursiveDescriptorProcessorTest extends KotlinTestWithEnvironment
|
||||
JetFile jetFile = JetTestUtils.createFile("declarations.kt", text, getEnvironment().getProject());
|
||||
AnalysisResult result = JetTestUtils.analyzeFile(jetFile);
|
||||
PackageViewDescriptor testPackage = result.getModuleDescriptor().getPackage(FqName.topLevel(Name.identifier("test")));
|
||||
assert testPackage != null;
|
||||
|
||||
List<String> descriptors = recursivelyCollectDescriptors(testPackage);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user