From 280a3e3d26d3b1403bad9bd0767fc78d9d878ea1 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 5 Sep 2018 19:07:09 +0300 Subject: [PATCH] Android Extensions: Support platform modules (KT-26169) --- .../idea/caches/project/IdeaModuleInfos.kt | 2 +- .../idea/AndroidGotoDeclarationHandler.kt | 4 +--- .../synthetic/idea/ExperimentalUtils.kt | 8 +++----- .../android/synthetic/idea/PlatformUtil.kt | 19 +++++++++++++++++++ ...AndroidPackageFragmentProviderExtension.kt | 6 ++---- 5 files changed, 26 insertions(+), 13 deletions(-) create mode 100644 plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/PlatformUtil.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt index 3efae6433e6..3bac1e3a817 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt @@ -415,7 +415,7 @@ interface SourceForBinaryModuleInfo : IdeaModuleInfo { } data class PlatformModuleInfo( - internal val platformModule: ModuleSourceInfo, + val platformModule: ModuleSourceInfo, private val commonModules: List // NOTE: usually contains a single element for current implementation ) : IdeaModuleInfo, CombinedModuleInfo, TrackableModuleInfo { override val capabilities: Map, Any?> diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidGotoDeclarationHandler.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidGotoDeclarationHandler.kt index 4a484d6ba43..4f9a6420101 100644 --- a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidGotoDeclarationHandler.kt +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/AndroidGotoDeclarationHandler.kt @@ -25,7 +25,6 @@ import com.intellij.psi.impl.source.tree.LeafPsiElement import com.intellij.psi.xml.XmlAttribute import org.jetbrains.kotlin.android.synthetic.res.AndroidLayoutXmlFileManager import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.project.getModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -51,8 +50,7 @@ class AndroidGotoDeclarationHandler : GotoDeclarationHandler { } private fun getLayoutManager(sourceElement: PsiElement): AndroidLayoutXmlFileManager? { - val moduleInfo = sourceElement.getModuleInfo() - if (moduleInfo !is ModuleSourceInfo) return null + val moduleInfo = sourceElement.getModuleInfo().findAndroidModuleInfo() ?: return null return ModuleServiceManager.getService(moduleInfo.module, AndroidLayoutXmlFileManager::class.java) } 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 e7b35d595f1..464cd45ce84 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 @@ -20,7 +20,6 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.module.Module import kotlinx.android.extensions.CacheImplementation import org.jetbrains.kotlin.analyzer.ModuleInfo -import org.jetbrains.kotlin.android.model.AndroidModuleInfoProvider import org.jetbrains.kotlin.android.model.isAndroidModule import org.jetbrains.kotlin.android.synthetic.AndroidCommandLineProcessor.Companion.ANDROID_COMPILER_PLUGIN_ID import org.jetbrains.kotlin.android.synthetic.AndroidCommandLineProcessor.Companion.EXPERIMENTAL_OPTION @@ -28,7 +27,6 @@ import org.jetbrains.kotlin.android.synthetic.AndroidCommandLineProcessor.Compan import org.jetbrains.kotlin.android.synthetic.AndroidCommandLineProcessor.Companion.DEFAULT_CACHE_IMPL_OPTION import org.jetbrains.kotlin.android.synthetic.AndroidComponentRegistrar.Companion.parseCacheImplementationType import org.jetbrains.kotlin.compiler.plugin.CliOption -import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.facet.KotlinFacet private val ANNOTATION_OPTION_PREFIX = "plugin:$ANDROID_COMPILER_PLUGIN_ID:" @@ -55,13 +53,13 @@ internal val Module.androidExtensionsIsEnabled: Boolean internal val ModuleInfo.androidExtensionsIsEnabled: Boolean get() { - val module = (this as? ModuleSourceInfo)?.module ?: return false + val module = this.findAndroidModuleInfo()?.module ?: return false return module.androidExtensionsIsEnabled } internal val ModuleInfo.androidExtensionsIsExperimental: Boolean get() { - val module = (this as? ModuleSourceInfo)?.module ?: return false + val module = this.findAndroidModuleInfo()?.module ?: return false return module.androidExtensionsIsExperimental } @@ -73,6 +71,6 @@ internal val Module.androidExtensionsIsExperimental: Boolean val ModuleInfo.androidExtensionsGlobalCacheImpl: CacheImplementation get() { - val module = (this as? ModuleSourceInfo)?.module ?: return CacheImplementation.NO_CACHE + val module = this.findAndroidModuleInfo()?.module ?: return CacheImplementation.NO_CACHE return parseCacheImplementationType(module.getOptionValueInFacet(DEFAULT_CACHE_IMPL_OPTION)) } \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/PlatformUtil.kt b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/PlatformUtil.kt new file mode 100644 index 00000000000..f854d45392d --- /dev/null +++ b/plugins/android-extensions/android-extensions-idea/src/org/jetbrains/kotlin/android/synthetic/idea/PlatformUtil.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.android.synthetic.idea + +import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo +import org.jetbrains.kotlin.idea.caches.project.PlatformModuleInfo +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatform + +internal fun ModuleInfo.findAndroidModuleInfo(): ModuleSourceInfo? { + return when (this) { + is ModuleSourceInfo -> this.takeIf { it.platform is JvmPlatform } + is PlatformModuleInfo -> this.platformModule.takeIf { it.platform is JvmPlatform } + else -> null + } +} \ No newline at end of file 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 d228f4aaa39..6d67fe61bf5 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 @@ -21,12 +21,11 @@ import com.intellij.openapi.module.ModuleServiceManager import com.intellij.openapi.project.Project import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.android.model.AndroidModuleInfoProvider -import org.jetbrains.kotlin.android.model.isAndroidModule import org.jetbrains.kotlin.android.synthetic.idea.androidExtensionsIsEnabled import org.jetbrains.kotlin.android.synthetic.idea.androidExtensionsIsExperimental +import org.jetbrains.kotlin.android.synthetic.idea.findAndroidModuleInfo import org.jetbrains.kotlin.android.synthetic.res.AndroidLayoutXmlFileManager import org.jetbrains.kotlin.android.synthetic.res.AndroidPackageFragmentProviderExtension -import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo class IDEAndroidPackageFragmentProviderExtension(val project: Project) : AndroidPackageFragmentProviderExtension() { override fun isExperimental(moduleInfo: ModuleInfo?): Boolean { @@ -34,8 +33,7 @@ class IDEAndroidPackageFragmentProviderExtension(val project: Project) : Android } override fun getLayoutXmlFileManager(project: Project, moduleInfo: ModuleInfo?): AndroidLayoutXmlFileManager? { - val moduleSourceInfo = moduleInfo as? ModuleSourceInfo ?: return null - val module = moduleSourceInfo.module + val module = moduleInfo?.findAndroidModuleInfo()?.module ?: return null if (!isAndroidExtensionsEnabled(module)) return null return ModuleServiceManager.getService(module, AndroidLayoutXmlFileManager::class.java) }