Android Extensions: Support platform modules (KT-26169)

This commit is contained in:
Yan Zhulanow
2018-09-05 19:07:09 +03:00
parent ca4b99b1a0
commit 280a3e3d26
5 changed files with 26 additions and 13 deletions
@@ -415,7 +415,7 @@ interface SourceForBinaryModuleInfo : IdeaModuleInfo {
} }
data class PlatformModuleInfo( data class PlatformModuleInfo(
internal val platformModule: ModuleSourceInfo, val platformModule: ModuleSourceInfo,
private val commonModules: List<ModuleSourceInfo> // NOTE: usually contains a single element for current implementation private val commonModules: List<ModuleSourceInfo> // NOTE: usually contains a single element for current implementation
) : IdeaModuleInfo, CombinedModuleInfo, TrackableModuleInfo { ) : IdeaModuleInfo, CombinedModuleInfo, TrackableModuleInfo {
override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?> override val capabilities: Map<ModuleDescriptor.Capability<*>, Any?>
@@ -25,7 +25,6 @@ import com.intellij.psi.impl.source.tree.LeafPsiElement
import com.intellij.psi.xml.XmlAttribute import com.intellij.psi.xml.XmlAttribute
import org.jetbrains.kotlin.android.synthetic.res.AndroidLayoutXmlFileManager import org.jetbrains.kotlin.android.synthetic.res.AndroidLayoutXmlFileManager
import org.jetbrains.kotlin.descriptors.PropertyDescriptor 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.project.getModuleInfo
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.KtSimpleNameExpression
@@ -51,8 +50,7 @@ class AndroidGotoDeclarationHandler : GotoDeclarationHandler {
} }
private fun getLayoutManager(sourceElement: PsiElement): AndroidLayoutXmlFileManager? { private fun getLayoutManager(sourceElement: PsiElement): AndroidLayoutXmlFileManager? {
val moduleInfo = sourceElement.getModuleInfo() val moduleInfo = sourceElement.getModuleInfo().findAndroidModuleInfo() ?: return null
if (moduleInfo !is ModuleSourceInfo) return null
return ModuleServiceManager.getService(moduleInfo.module, AndroidLayoutXmlFileManager::class.java) return ModuleServiceManager.getService(moduleInfo.module, AndroidLayoutXmlFileManager::class.java)
} }
@@ -20,7 +20,6 @@ import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import kotlinx.android.extensions.CacheImplementation import kotlinx.android.extensions.CacheImplementation
import org.jetbrains.kotlin.analyzer.ModuleInfo 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.model.isAndroidModule
import org.jetbrains.kotlin.android.synthetic.AndroidCommandLineProcessor.Companion.ANDROID_COMPILER_PLUGIN_ID import org.jetbrains.kotlin.android.synthetic.AndroidCommandLineProcessor.Companion.ANDROID_COMPILER_PLUGIN_ID
import org.jetbrains.kotlin.android.synthetic.AndroidCommandLineProcessor.Companion.EXPERIMENTAL_OPTION 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.AndroidCommandLineProcessor.Companion.DEFAULT_CACHE_IMPL_OPTION
import org.jetbrains.kotlin.android.synthetic.AndroidComponentRegistrar.Companion.parseCacheImplementationType import org.jetbrains.kotlin.android.synthetic.AndroidComponentRegistrar.Companion.parseCacheImplementationType
import org.jetbrains.kotlin.compiler.plugin.CliOption import org.jetbrains.kotlin.compiler.plugin.CliOption
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.facet.KotlinFacet import org.jetbrains.kotlin.idea.facet.KotlinFacet
private val ANNOTATION_OPTION_PREFIX = "plugin:$ANDROID_COMPILER_PLUGIN_ID:" private val ANNOTATION_OPTION_PREFIX = "plugin:$ANDROID_COMPILER_PLUGIN_ID:"
@@ -55,13 +53,13 @@ internal val Module.androidExtensionsIsEnabled: Boolean
internal val ModuleInfo.androidExtensionsIsEnabled: Boolean internal val ModuleInfo.androidExtensionsIsEnabled: Boolean
get() { get() {
val module = (this as? ModuleSourceInfo)?.module ?: return false val module = this.findAndroidModuleInfo()?.module ?: return false
return module.androidExtensionsIsEnabled return module.androidExtensionsIsEnabled
} }
internal val ModuleInfo.androidExtensionsIsExperimental: Boolean internal val ModuleInfo.androidExtensionsIsExperimental: Boolean
get() { get() {
val module = (this as? ModuleSourceInfo)?.module ?: return false val module = this.findAndroidModuleInfo()?.module ?: return false
return module.androidExtensionsIsExperimental return module.androidExtensionsIsExperimental
} }
@@ -73,6 +71,6 @@ internal val Module.androidExtensionsIsExperimental: Boolean
val ModuleInfo.androidExtensionsGlobalCacheImpl: CacheImplementation val ModuleInfo.androidExtensionsGlobalCacheImpl: CacheImplementation
get() { 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)) return parseCacheImplementationType(module.getOptionValueInFacet(DEFAULT_CACHE_IMPL_OPTION))
} }
@@ -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
}
}
@@ -21,12 +21,11 @@ import com.intellij.openapi.module.ModuleServiceManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.android.model.AndroidModuleInfoProvider 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.androidExtensionsIsEnabled
import org.jetbrains.kotlin.android.synthetic.idea.androidExtensionsIsExperimental 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.AndroidLayoutXmlFileManager
import org.jetbrains.kotlin.android.synthetic.res.AndroidPackageFragmentProviderExtension import org.jetbrains.kotlin.android.synthetic.res.AndroidPackageFragmentProviderExtension
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
class IDEAndroidPackageFragmentProviderExtension(val project: Project) : AndroidPackageFragmentProviderExtension() { class IDEAndroidPackageFragmentProviderExtension(val project: Project) : AndroidPackageFragmentProviderExtension() {
override fun isExperimental(moduleInfo: ModuleInfo?): Boolean { override fun isExperimental(moduleInfo: ModuleInfo?): Boolean {
@@ -34,8 +33,7 @@ class IDEAndroidPackageFragmentProviderExtension(val project: Project) : Android
} }
override fun getLayoutXmlFileManager(project: Project, moduleInfo: ModuleInfo?): AndroidLayoutXmlFileManager? { override fun getLayoutXmlFileManager(project: Project, moduleInfo: ModuleInfo?): AndroidLayoutXmlFileManager? {
val moduleSourceInfo = moduleInfo as? ModuleSourceInfo ?: return null val module = moduleInfo?.findAndroidModuleInfo()?.module ?: return null
val module = moduleSourceInfo.module
if (!isAndroidExtensionsEnabled(module)) return null if (!isAndroidExtensionsEnabled(module)) return null
return ModuleServiceManager.getService(module, AndroidLayoutXmlFileManager::class.java) return ModuleServiceManager.getService(module, AndroidLayoutXmlFileManager::class.java)
} }