From 77be78b62795ae7ddeede350c600fa3bdfe5abd9 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 14 Apr 2015 20:11:27 +0300 Subject: [PATCH] Support Android flavors --- .../jetbrains/kotlin/android/AndroidSubplugin.kt | 16 +++++++++------- .../resolve/android/AndroidResourceManager.kt | 9 +-------- .../resolve/android/CliAndroidResourceManager.kt | 4 ++-- .../resolve/android/CliAndroidUIXmlProcessor.kt | 4 ++-- .../lang/resolve/android/androidResources.kt | 2 +- .../android/AndroidPsiTreeChangePreprocessor.kt | 9 +++++++++ 6 files changed, 24 insertions(+), 20 deletions(-) diff --git a/libraries/tools/kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android/AndroidSubplugin.kt b/libraries/tools/kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android/AndroidSubplugin.kt index 2bd021789e3..2cb9ed853e8 100644 --- a/libraries/tools/kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android/AndroidSubplugin.kt +++ b/libraries/tools/kotlin-android-extensions/src/main/kotlin/org/jetbrains/kotlin/android/AndroidSubplugin.kt @@ -33,20 +33,22 @@ public class AndroidSubplugin : KotlinGradleSubplugin { val sourceSets = androidExtension.getSourceSets() val mainSourceSet = sourceSets.getByName("main") - val resourceDir = mainSourceSet.getRes().getSrcDirs().firstOrNull() + val resourceDirs = mainSourceSet.getRes().getSrcDirs() val manifestFile = mainSourceSet.getManifest().getSrcFile() val compileDependencies = project.getConfigurations().getByName("compile").getFiles() val supportV4 = compileDependencies?.filter { it.name.startsWith("support-v4-") }?.isNotEmpty() ?: false val supportV4Property = if (supportV4) "true" else "false" - if (resourceDir != null) { - resourceDir.listFiles { it.isDirectory() && it.name.startsWith("layout") }?.forEach { task.source(it) } + if (resourceDirs.isNotEmpty()) { + val resourceDirOptions = resourceDirs.map { resourceDir -> + resourceDir.listFiles { it.isDirectory() && it.name.startsWith("layout") }?.forEach { task.source(it) } + SubpluginOption("androidRes", resourceDir.getAbsolutePath()) + } return listOf( - SubpluginOption("androidRes", resourceDir.getAbsolutePath()), - SubpluginOption("androidManifest", manifestFile.getAbsolutePath()), - SubpluginOption("supportV4", supportV4Property) - ) + SubpluginOption("androidManifest", manifestFile.getAbsolutePath()), + SubpluginOption("supportV4", supportV4Property) + ) + resourceDirOptions } return null diff --git a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidResourceManager.kt b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidResourceManager.kt index b51a50d4eef..cbc858f3953 100644 --- a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidResourceManager.kt +++ b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidResourceManager.kt @@ -55,7 +55,7 @@ public abstract class AndroidResourceManager(val project: Project) { return allChildren } - val resDirectories = info.mainResDirectories.map { fileManager.findFileByUrl("file://$it") } + val resDirectories = info.resDirectories.map { fileManager.findFileByUrl("file://$it") } val allChildren = resDirectories.flatMap { it?.getAllChildren() ?: listOf() } return allChildren @@ -66,13 +66,6 @@ public abstract class AndroidResourceManager(val project: Project) { .mapValues { it.getValue().sortBy { it.getParent().getName().length() } } } - fun getModuleResDirectories(): List { - val info = androidModuleInfo - if (info == null) return listOf() - val fileManager = VirtualFileManager.getInstance() - return info.mainResDirectories.map { fileManager.findFileByUrl("file://" + it) } - } - companion object { public fun getInstance(module: Module): AndroidResourceManager { val service = ModuleServiceManager.getService(module, javaClass()) diff --git a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidResourceManager.kt b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidResourceManager.kt index 6e2cef812f3..c79174e129b 100644 --- a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidResourceManager.kt +++ b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidResourceManager.kt @@ -28,11 +28,11 @@ import kotlin.properties.Delegates public class CliAndroidResourceManager( project: Project, private val manifestPath: String, - private val mainResDirectory: List + private val resDirectories: List ) : AndroidResourceManager(project) { override val androidModuleInfo by Delegates.lazy { - AndroidModuleInfo(getApplicationPackage(manifestPath), mainResDirectory) + AndroidModuleInfo(getApplicationPackage(manifestPath), resDirectories) } val saxParser: SAXParser = initSAX() diff --git a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidUIXmlProcessor.kt b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidUIXmlProcessor.kt index ba3b5953f7e..ad85c63e305 100644 --- a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidUIXmlProcessor.kt +++ b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/CliAndroidUIXmlProcessor.kt @@ -30,11 +30,11 @@ import com.intellij.psi.util.CachedValueProvider.Result public class CliAndroidUIXmlProcessor( project: Project, private val manifestPath: String, - private val mainResDirectories: List + private val resDirectories: List ) : AndroidUIXmlProcessor(project) { override val resourceManager: CliAndroidResourceManager by Delegates.lazy { - CliAndroidResourceManager(project, manifestPath, mainResDirectories) + CliAndroidResourceManager(project, manifestPath, resDirectories) } override val cachedSources: CachedValue> by Delegates.lazy { diff --git a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/androidResources.kt b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/androidResources.kt index b4dcae9f025..34934346a5e 100644 --- a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/androidResources.kt +++ b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/androidResources.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.lang.resolve.android -public data class AndroidModuleInfo(val applicationPackage: String, val mainResDirectories: List) +public data class AndroidModuleInfo(val applicationPackage: String, val resDirectories: List) public abstract class AndroidResource(val id: String) { public abstract val className: String diff --git a/plugins/android-idea-plugin/src/org/jetbrains/kotlin/plugin/android/AndroidPsiTreeChangePreprocessor.kt b/plugins/android-idea-plugin/src/org/jetbrains/kotlin/plugin/android/AndroidPsiTreeChangePreprocessor.kt index 53176e204df..95732f9e5d2 100644 --- a/plugins/android-idea-plugin/src/org/jetbrains/kotlin/plugin/android/AndroidPsiTreeChangePreprocessor.kt +++ b/plugins/android-idea-plugin/src/org/jetbrains/kotlin/plugin/android/AndroidPsiTreeChangePreprocessor.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.plugin.android import com.intellij.ide.highlighter.XmlFileType import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.util.SimpleModificationTracker +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.openapi.vfs.VirtualFileManager import com.intellij.psi.PsiFile import com.intellij.psi.impl.PsiTreeChangeEventImpl import com.intellij.psi.impl.PsiTreeChangePreprocessor @@ -58,6 +60,13 @@ public class AndroidPsiTreeChangePreprocessor : PsiTreeChangePreprocessor, Simpl } } + private fun AndroidResourceManager.getModuleResDirectories(): List { + val info = androidModuleInfo + if (info == null) return listOf() + val fileManager = VirtualFileManager.getInstance() + return info.resDirectories.map { fileManager.findFileByUrl("file://" + it) } + } + private fun PsiFile.isLayoutXmlFile(): Boolean { if (getFileType() != XmlFileType.INSTANCE) return false return getParent()?.getName()?.startsWith("layout") ?: false