From 5636227857545fb11ae2790fca55934b0f88a468 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Fri, 16 Nov 2018 20:39:20 +0900 Subject: [PATCH] Android Extensions: Use lazy package fragment descriptors only in IDE --- .../PredefinedPackageFragmentDescriptor.kt | 3 +-- ...AndroidPackageFragmentProviderExtension.kt | 21 ++++++++++++------- ...AndroidPackageFragmentProviderExtension.kt | 5 +++++ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/PredefinedPackageFragmentDescriptor.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/PredefinedPackageFragmentDescriptor.kt index ea27cf9607a..9807d312ae8 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/PredefinedPackageFragmentDescriptor.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/descriptors/PredefinedPackageFragmentDescriptor.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.android.synthetic.descriptors -import com.intellij.openapi.util.ClearableLazyValue import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor @@ -38,7 +37,7 @@ class PredefinedPackageFragmentDescriptor( private val functions: (PredefinedPackageFragmentDescriptor) -> Collection = { emptyList() } ) : PackageFragmentDescriptorImpl(module, fqName) { class LazyAndroidExtensionsPackageFragmentDescriptor( - val descriptor: ClearableLazyValue, + val descriptor: () -> PackageFragmentDescriptor, val isDeprecated: Boolean ) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt index 2fac1ca6c75..098684956bf 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/res/AndroidPackageFragmentProviderExtension.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.android.synthetic.res import com.intellij.openapi.project.Project -import com.intellij.openapi.util.ClearableLazyValue import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.android.synthetic.AndroidConst import org.jetbrains.kotlin.android.synthetic.descriptors.AndroidSyntheticPackageData @@ -41,6 +40,12 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider protected abstract fun isExperimental(moduleInfo: ModuleInfo?): Boolean + protected open fun createLazyValue(value: () -> T): () -> T { + // The default (CLI) implementation is not lazy + val evaluatedValue = value() + return { evaluatedValue } + } + override fun getPackageFragmentProvider( project: Project, module: ModuleDescriptor, @@ -57,7 +62,7 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider val lazyContext = LazySyntheticElementResolveContext(module, storageManager) - val packages = mutableMapOf>() + val packages = mutableMapOf PackageFragmentDescriptor>() val packagesToLookupInCompletion = mutableListOf() // Packages with synthetic properties @@ -66,7 +71,7 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider fun createPackageFragment(fqNameString: String, forView: Boolean, isDeprecated: Boolean = false) { val fqName = FqName(fqNameString) - val lazyPackageDescriptor = ClearableLazyValue.create { + val lazyPackageDescriptor = createLazyValue { val packageData = AndroidSyntheticPackageData(moduleData, forView, isDeprecated) { layoutXmlFileManager.extractResources(AndroidLayoutGroupData(layoutName, layouts), module) } @@ -90,14 +95,14 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider // Empty middle packages AndroidConst.SYNTHETIC_SUBPACKAGES.forEachUntilLast { fqNameString -> val fqName = FqName(fqNameString) - packages[fqName] = ClearableLazyValue.create { + packages[fqName] = createLazyValue { PredefinedPackageFragmentDescriptor(fqName, module, storageManager) } } for (variantData in moduleData.variants) { val fqName = FqName(AndroidConst.SYNTHETIC_PACKAGE + '.' + variantData.variant.name) - packages[fqName] = ClearableLazyValue.create { + packages[fqName] = createLazyValue { PredefinedPackageFragmentDescriptor(fqName, module, storageManager) } } @@ -105,7 +110,7 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider // Package with clearFindViewByIdCache() AndroidConst.SYNTHETIC_SUBPACKAGES.last().let { fqNameString -> val fqName = FqName(fqNameString) - val lazyPackageDescriptor = ClearableLazyValue.create { + val lazyPackageDescriptor = createLazyValue { PredefinedPackageFragmentDescriptor(fqName, module, storageManager, packagesToLookupInCompletion) { descriptor -> val widgetReceivers = lazyContext().getWidgetReceivers(forView = false, isExperimental = isExperimental) + lazyContext().getWidgetReceivers(forView = true, isExperimental = isExperimental) @@ -125,9 +130,9 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider } class AndroidSyntheticPackageFragmentProvider( - val packages: Map> + val packages: Map PackageFragmentDescriptor> ) : PackageFragmentProvider { - override fun getPackageFragments(fqName: FqName) = listOfNotNull(packages[fqName]?.value) + override fun getPackageFragments(fqName: FqName) = listOfNotNull(packages[fqName]?.invoke()) override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean): List { return packages.asSequence() diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidPackageFragmentProviderExtension.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidPackageFragmentProviderExtension.kt index 6d67fe61bf5..cd558ebdc91 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidPackageFragmentProviderExtension.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidPackageFragmentProviderExtension.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.android.synthetic.idea.res import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleServiceManager import com.intellij.openapi.project.Project +import com.intellij.openapi.util.ClearableLazyValue import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.android.model.AndroidModuleInfoProvider import org.jetbrains.kotlin.android.synthetic.idea.androidExtensionsIsEnabled @@ -48,4 +49,8 @@ class IDEAndroidPackageFragmentProviderExtension(val project: Project) : Android val infoProvider = AndroidModuleInfoProvider.getInstance(module) ?: return false return infoProvider.isAndroidModule() && !infoProvider.isGradleModule() } + + override fun createLazyValue(value: () -> T): () -> T { + return { ClearableLazyValue.create { value() }.value } + } } \ No newline at end of file