Improve package caching in KotlinJavaPsiFacade

^KT-33394 Fixed
This commit is contained in:
Vladimir Dolzhenko
2020-09-10 07:38:46 +00:00
parent 05d3e48564
commit 5036673187
22 changed files with 348 additions and 121 deletions
@@ -241,10 +241,10 @@ private class DelegatingPackageFragmentProvider<M : ModuleInfo>(
) : PackageFragmentProvider {
private val syntheticFilePackages = moduleContent.syntheticFiles.map { it.packageFqName }.toSet()
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> {
if (certainlyDoesNotExist(fqName)) return emptyList()
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {
if (certainlyDoesNotExist(fqName)) return
return resolverForProject.resolverForModuleDescriptor(module).packageFragmentProvider.getPackageFragments(fqName)
resolverForProject.resolverForModuleDescriptor(module).packageFragmentProvider.collectPackageFragments(fqName, packageFragments)
}
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> {
@@ -129,23 +129,28 @@ class LazyModuleDependencies<M : ModuleInfo>(
firstDependency: M? = null,
private val resolverForProject: AbstractResolverForProject<M>
) : ModuleDependencies {
private val dependencies = storageManager.createLazyValue {
val moduleDescriptors = mutableSetOf<ModuleDescriptorImpl>()
firstDependency?.let {
moduleDescriptors.add(resolverForProject.descriptorForModule(it))
}
val moduleDescriptor = resolverForProject.descriptorForModule(module)
sequence {
if (firstDependency != null) {
yield(resolverForProject.descriptorForModule(firstDependency))
}
if (module.dependencyOnBuiltIns() == ModuleInfo.DependencyOnBuiltIns.AFTER_SDK) {
yield(moduleDescriptor.builtIns.builtInsModule)
}
for (dependency in module.dependencies()) {
@Suppress("UNCHECKED_CAST")
yield(resolverForProject.descriptorForModule(dependency as M))
}
if (module.dependencyOnBuiltIns() == ModuleInfo.DependencyOnBuiltIns.LAST) {
yield(moduleDescriptor.builtIns.builtInsModule)
}
}.toList()
val dependencyOnBuiltIns = module.dependencyOnBuiltIns()
if (dependencyOnBuiltIns == ModuleInfo.DependencyOnBuiltIns.AFTER_SDK) {
moduleDescriptors.add(moduleDescriptor.builtIns.builtInsModule)
}
for (dependency in module.dependencies()) {
if (dependency == firstDependency) continue
@Suppress("UNCHECKED_CAST")
moduleDescriptors.add(resolverForProject.descriptorForModule(dependency as M))
}
if (dependencyOnBuiltIns == ModuleInfo.DependencyOnBuiltIns.LAST) {
moduleDescriptors.add(moduleDescriptor.builtIns.builtInsModule)
}
moduleDescriptors.toList()
}
override val allDependencies: List<ModuleDescriptorImpl> get() = dependencies()
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.resolve
import com.intellij.codeInsight.completion.CompletionUtilCore
import com.intellij.psi.impl.source.DummyHolder
import com.intellij.util.SmartList
import org.jetbrains.kotlin.config.AnalysisFlags
@@ -573,6 +574,9 @@ class QualifiedExpressionResolver(val languageVersionSettings: LanguageVersionSe
context: ExpressionTypingContext
): Qualifier? {
val name = expression.getReferencedNameAsName()
if (!expression.isPhysical && !name.isSpecial && name.asString().endsWith(CompletionUtilCore.DUMMY_IDENTIFIER_TRIMMED)) {
return null
}
val location = KotlinLookupLocation(expression)
val qualifierDescriptor = when (receiver) {
@@ -180,6 +180,16 @@ public class ResolveSession implements KotlinCodeAnalyzer, LazyClassContext {
this.declarationProviderFactory = declarationProviderFactory;
this.packageFragmentProvider = new PackageFragmentProvider() {
@Override
public void collectPackageFragments(
@NotNull FqName fqName, @NotNull Collection<PackageFragmentDescriptor> packageFragments
) {
LazyPackageDescriptor fragment = getPackageFragment(fqName);
if (fragment != null) {
packageFragments.add(fragment);
}
}
@NotNull
@Override
public List<PackageFragmentDescriptor> getPackageFragments(@NotNull FqName fqName) {