Optimize declaration providers for case of non-existing packages
Avoid creating memoized function nodes when the value is obviously null Otherwise, it may lead to about 25M retained by empty concurrent hashmap nodes
This commit is contained in:
+10
-11
@@ -20,7 +20,7 @@ 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.MemoizedFunctionToNullable
|
||||
import org.jetbrains.kotlin.storage.CacheWithNotNullValues
|
||||
|
||||
class LazyJavaPackageFragmentProvider(
|
||||
components: JavaResolverComponents
|
||||
@@ -28,17 +28,16 @@ class LazyJavaPackageFragmentProvider(
|
||||
|
||||
private val c = LazyJavaResolverContext(components, TypeParameterResolver.EMPTY, lazyOf(null))
|
||||
|
||||
private val packageFragments: MemoizedFunctionToNullable<FqName, LazyJavaPackageFragment> =
|
||||
c.storageManager.createMemoizedFunctionWithNullableValues {
|
||||
fqName ->
|
||||
val jPackage = c.components.finder.findPackage(fqName)
|
||||
if (jPackage != null) {
|
||||
LazyJavaPackageFragment(c, jPackage)
|
||||
}
|
||||
else null
|
||||
}
|
||||
private val packageFragments: CacheWithNotNullValues<FqName, LazyJavaPackageFragment> =
|
||||
c.storageManager.createCacheWithNotNullValues()
|
||||
|
||||
private fun getPackageFragment(fqName: FqName) = packageFragments(fqName)
|
||||
private fun getPackageFragment(fqName: FqName): LazyJavaPackageFragment? {
|
||||
val jPackage = c.components.finder.findPackage(fqName) ?: return null
|
||||
|
||||
return packageFragments.computeIfAbsent(fqName) {
|
||||
LazyJavaPackageFragment(c, jPackage)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPackageFragments(fqName: FqName) = listOfNotNull(getPackageFragment(fqName))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user