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
@@ -16,11 +16,13 @@
package org.jetbrains.kotlin.load.java.lazy
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaPackageFragment
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.CacheWithNotNullValues
import org.jetbrains.kotlin.utils.addIfNotNull
class LazyJavaPackageFragmentProvider(
components: JavaResolverComponents
@@ -41,6 +43,9 @@ class LazyJavaPackageFragmentProvider(
override fun getPackageFragments(fqName: FqName) = listOfNotNull(getPackageFragment(fqName))
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) =
packageFragments.addIfNotNull(getPackageFragment(fqName))
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) =
getPackageFragment(fqName)?.getSubPackageFqNames().orEmpty()
}
@@ -20,13 +20,19 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
interface PackageFragmentProvider {
fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor>
fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>)
fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> {
val packageFragments = mutableListOf<PackageFragmentDescriptor>()
collectPackageFragments(fqName, packageFragments)
return packageFragments
}
fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName>
object Empty : PackageFragmentProvider {
override fun getPackageFragments(fqName: FqName) = emptyList<PackageFragmentDescriptor>()
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {}
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) = emptySet<FqName>()
}
@@ -20,14 +20,15 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
class PackageFragmentProviderImpl(
private val packageFragments: Collection<PackageFragmentDescriptor>
private val packageFragments: Collection<PackageFragmentDescriptor>
) : PackageFragmentProvider {
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> =
packageFragments.filter { it.fqName == fqName }
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {
this.packageFragments.filterTo(packageFragments) { it.fqName == fqName }
}
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> =
packageFragments.asSequence()
.map { it.fqName }
.filter { !it.isRoot && it.parent() == fqName }
.toList()
packageFragments.asSequence()
.map { it.fqName }
.filter { !it.isRoot && it.parent() == fqName }
.toList()
}
@@ -23,14 +23,19 @@ import java.util.*
import org.jetbrains.kotlin.name.Name
class CompositePackageFragmentProvider(// can be modified from outside
private val providers: List<PackageFragmentProvider>) : PackageFragmentProvider {
private val providers: List<PackageFragmentProvider>
) : PackageFragmentProvider {
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> {
val result = ArrayList<PackageFragmentDescriptor>()
for (provider in providers) {
result.addAll(provider.getPackageFragments(fqName))
init {
assert(providers.size == providers.toSet().size) {
"providers.size is ${providers.size} while only ${providers.toSet().size} unique providers"
}
}
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {
for (provider in providers) {
provider.collectPackageFragments(fqName, packageFragments)
}
return result.toList()
}
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> {
@@ -28,9 +28,9 @@ import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.storage.getValue
class LazyPackageViewDescriptorImpl(
override val module: ModuleDescriptorImpl,
override val fqName: FqName,
storageManager: StorageManager
override val module: ModuleDescriptorImpl,
override val fqName: FqName,
storageManager: StorageManager
) : DeclarationDescriptorImpl(Annotations.EMPTY, fqName.shortNameOrSpecial()), PackageViewDescriptor {
override val fragments: List<PackageFragmentDescriptor> by storageManager.createLazyValue {
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentProvider
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.StorageManager
import org.jetbrains.kotlin.utils.addIfNotNull
abstract class AbstractDeserializedPackageFragmentProvider(
protected val storageManager: StorageManager,
@@ -38,7 +39,9 @@ abstract class AbstractDeserializedPackageFragmentProvider(
protected abstract fun findPackage(fqName: FqName): DeserializedPackageFragment?
override fun getPackageFragments(fqName: FqName): List<PackageFragmentDescriptor> = listOfNotNull(fragments(fqName))
override fun collectPackageFragments(fqName: FqName, packageFragments: MutableCollection<PackageFragmentDescriptor>) {
packageFragments.addIfNotNull(fragments(fqName))
}
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): Collection<FqName> = emptySet()
}