From 3645dfc5afaebeb401b2a11733ef8f77d5d621f4 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 14 Apr 2015 19:07:35 +0300 Subject: [PATCH] Support several res/ directories --- .../src/AndroidComponentRegistrar.kt | 13 ++++---- .../resolve/android/AndroidResourceManager.kt | 11 ++++--- .../android/CliAndroidResourceManager.kt | 2 +- .../android/CliAndroidUIXmlProcessor.kt | 4 +-- .../lang/resolve/android/androidResources.kt | 2 +- .../simple/severalResDirs/AndroidManifest.xml | 33 +++++++++++++++++++ .../simple/severalResDirs/res/layout/test.xml | 15 +++++++++ .../severalResDirs/res2/layout/test.xml | 15 +++++++++ .../simple/severalResDirs/test_LAYOUT.kt | 32 ++++++++++++++++++ .../simple/severalResDirs/test_VIEW.kt | 23 +++++++++++++ .../android/test/AbstractAndroidBoxTest.kt | 4 +-- .../test/AbstractAndroidBytecodeShapeTest.kt | 4 +-- .../AbstractAndroidXml2KConversionTest.kt | 3 +- .../resolve/android/test/CompilerTestUtils.kt | 15 ++++++--- .../AndroidPsiTreeChangePreprocessor.kt | 2 +- .../android/IDEAndroidResourceManager.kt | 4 +-- .../android/AbstractAndroidCompletionTest.kt | 8 ++--- .../android/AbstractAndroidFindUsagesTest.kt | 2 +- .../kotlin/android/AbstractAndroidGotoTest.kt | 2 +- .../android/AbstractAndroidRenameTest.kt | 2 +- .../AbstractParserResultEqualityTest.kt | 9 +++-- .../kotlin/android/KotlinAndroidTestCase.java | 28 ++++++++-------- 22 files changed, 183 insertions(+), 50 deletions(-) create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/AndroidManifest.xml create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/res/layout/test.xml create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/res2/layout/test.xml create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/test_LAYOUT.kt create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/test_VIEW.kt diff --git a/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt b/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt index f193efe4f4e..dd80d5eebe9 100644 --- a/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt +++ b/plugins/android-compiler-plugin/src/AndroidComponentRegistrar.kt @@ -34,11 +34,8 @@ import org.jetbrains.kotlin.lang.resolve.android.* import org.jetbrains.kotlin.psi.JetFile public object AndroidConfigurationKeys { - - public val ANDROID_RES_PATH: CompilerConfigurationKey = CompilerConfigurationKey.create("android resources search path") - + public val ANDROID_RES_PATH: CompilerConfigurationKey> = CompilerConfigurationKey.create>("android resources search path") public val ANDROID_MANIFEST: CompilerConfigurationKey = CompilerConfigurationKey.create("android manifest file") - public val SUPPORT_V4: CompilerConfigurationKey = CompilerConfigurationKey.create("'true' if compiled with support-v4 library") } @@ -46,7 +43,7 @@ public class AndroidCommandLineProcessor : CommandLineProcessor { companion object { public val ANDROID_COMPILER_PLUGIN_ID: String = "org.jetbrains.kotlin.android" - public val RESOURCE_PATH_OPTION: CliOption = CliOption("androidRes", "", "Android resources path") + public val RESOURCE_PATH_OPTION: CliOption = CliOption("androidRes", "", "Android resources path", allowMultipleOccurrences = true) public val MANIFEST_FILE_OPTION: CliOption = CliOption("androidManifest", "", "Android manifest file") public val SUPPORT_V4_OPTION: CliOption = CliOption("supportV4", "", "Support android-v4 library", required = false) } @@ -57,7 +54,11 @@ public class AndroidCommandLineProcessor : CommandLineProcessor { override fun processOption(option: CliOption, value: String, configuration: CompilerConfiguration) { when (option) { - RESOURCE_PATH_OPTION -> configuration.put(AndroidConfigurationKeys.ANDROID_RES_PATH, value) + RESOURCE_PATH_OPTION -> { + val paths = configuration.getList(AndroidConfigurationKeys.ANDROID_RES_PATH).toArrayList() + paths.add(value) + configuration.put(AndroidConfigurationKeys.ANDROID_RES_PATH, paths) + } MANIFEST_FILE_OPTION -> configuration.put(AndroidConfigurationKeys.ANDROID_MANIFEST, value) SUPPORT_V4_OPTION -> configuration.put(AndroidConfigurationKeys.SUPPORT_V4, value) else -> throw CliOptionProcessingException("Unknown option: ${option.name}") 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 103bb7a85c0..b51a50d4eef 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,8 +55,8 @@ public abstract class AndroidResourceManager(val project: Project) { return allChildren } - val resDirectory = fileManager.findFileByUrl("file://" + info.mainResDirectory) - val allChildren = resDirectory?.getAllChildren() ?: listOf() + val resDirectories = info.mainResDirectories.map { fileManager.findFileByUrl("file://$it") } + val allChildren = resDirectories.flatMap { it?.getAllChildren() ?: listOf() } return allChildren .filter { it.getParent().getName().startsWith("layout") && it.getName().toLowerCase().endsWith(".xml") } @@ -66,10 +66,11 @@ public abstract class AndroidResourceManager(val project: Project) { .mapValues { it.getValue().sortBy { it.getParent().getName().length() } } } - fun getMainResDirectory(): VirtualFile? { + fun getModuleResDirectories(): List { val info = androidModuleInfo - if (info == null) return null - return VirtualFileManager.getInstance().findFileByUrl("file://" + info.mainResDirectory) + if (info == null) return listOf() + val fileManager = VirtualFileManager.getInstance() + return info.mainResDirectories.map { fileManager.findFileByUrl("file://" + it) } } companion object { 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 66dbbfcef2e..6e2cef812f3 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,7 +28,7 @@ import kotlin.properties.Delegates public class CliAndroidResourceManager( project: Project, private val manifestPath: String, - private val mainResDirectory: String + private val mainResDirectory: List ) : AndroidResourceManager(project) { override val androidModuleInfo by Delegates.lazy { 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 c705d53244e..ba3b5953f7e 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 mainResDirectory: String + private val mainResDirectories: List ) : AndroidUIXmlProcessor(project) { override val resourceManager: CliAndroidResourceManager by Delegates.lazy { - CliAndroidResourceManager(project, manifestPath, mainResDirectory) + CliAndroidResourceManager(project, manifestPath, mainResDirectories) } 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 dfe0c8eb8d9..b4dcae9f025 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 mainResDirectory: String?) +public data class AndroidModuleInfo(val applicationPackage: String, val mainResDirectories: List) public abstract class AndroidResource(val id: String) { public abstract val className: String diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/AndroidManifest.xml b/plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/AndroidManifest.xml new file mode 100644 index 00000000000..580c474f5de --- /dev/null +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/res/layout/test.xml b/plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/res/layout/test.xml new file mode 100644 index 00000000000..f2376f5ddc7 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/severalResDirs/res/layout/test.xml @@ -0,0 +1,15 @@ + + +