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:
Denis Zharkov
2018-01-17 14:31:48 +03:00
parent 0f74bb4a7a
commit 1716720604
5 changed files with 32 additions and 27 deletions
@@ -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))