From 600228187423e140cbd8baad03d0c3cae1c7b46d Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 27 Jul 2017 22:10:24 +0300 Subject: [PATCH] Android Extensions: Downgrade to old Android variant processing logic when 'experimental' flag is disabled (KT-19270) --- .../synthetic/idea/ExperimentalUtils.kt | 9 ++++-- .../res/IDEAndroidLayoutXmlFileManager.kt | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/ExperimentalUtils.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/ExperimentalUtils.kt index a43bc9cd91e..df0f8e25146 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/ExperimentalUtils.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/ExperimentalUtils.kt @@ -55,8 +55,13 @@ internal val Module.androidExtensionsIsEnabled: Boolean internal val ModuleInfo.androidExtensionsIsExperimental: Boolean get() { val module = (this as? ModuleSourceInfo)?.module ?: return false - if (isTestMode(module)) return true - return module.getOptionValueInFacet(EXPERIMENTAL_OPTION) == "true" + return module.androidExtensionsIsExperimental + } + +internal val Module.androidExtensionsIsExperimental: Boolean + get() { + if (isTestMode(this)) return true + return getOptionValueInFacet(EXPERIMENTAL_OPTION) == "true" } val ModuleInfo.androidExtensionsGlobalCacheImpl: CacheImplementation diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt index eeec93776e1..4728781e01d 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/res/IDEAndroidLayoutXmlFileManager.kt @@ -28,6 +28,7 @@ import org.jetbrains.android.facet.AndroidFacet import org.jetbrains.kotlin.android.synthetic.AndroidConst.SYNTHETIC_PACKAGE_PATH_LENGTH import org.jetbrains.kotlin.android.synthetic.idea.AndroidPsiTreeChangePreprocessor import org.jetbrains.kotlin.android.synthetic.idea.AndroidXmlVisitor +import org.jetbrains.kotlin.android.synthetic.idea.androidExtensionsIsExperimental import org.jetbrains.kotlin.android.synthetic.res.* import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor @@ -110,6 +111,33 @@ class IDEAndroidLayoutXmlFileManager(val module: Module) : AndroidLayoutXmlFileM private fun SourceProvider.toVariant() = AndroidVariant(name, resDirectories.map { it.canonicalPath }) private fun getAndroidModuleInfo(androidFacet: AndroidFacet): AndroidModule? { + if (androidFacet.module.androidExtensionsIsExperimental) { + return getAndroidModuleInfoExperimental(androidFacet) + } + + val applicationPackage = androidFacet.manifest?.`package`?.toString() + + if (applicationPackage != null) { + val mainVariant = androidFacet.mainSourceProvider.toVariant() + + val method = try { androidFacet::class.java.getMethod("getFlavorSourceProviders") } catch (e: NoSuchMethodException) { null } + val variants: List? = if (method != null) { + val sourceProviders = method.invoke(androidFacet) as List? + sourceProviders?.map { it.toVariant() } ?: listOf() + } + else { + val model = AndroidGradleModel.get(androidFacet.module) + model?.flavorSourceProviders?.map { it.toVariant() } ?: listOf(androidFacet.mainSourceProvider.toVariant()) + } + + if (variants != null) { + return AndroidModule(applicationPackage, listOf(mainVariant) + variants) + } + } + return null + } + + private fun getAndroidModuleInfoExperimental(androidFacet: AndroidFacet): AndroidModule? { val applicationPackage = androidFacet.manifest?.`package`?.toString() ?: return null val allResDirectories = androidFacet.getAppResources(true)?.resourceDirs.orEmpty().mapNotNull { it.canonicalPath }