From 7b4e24a454dd141011fee343c1a78ffaf0c3317a Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 6 Sep 2017 21:18:50 +0300 Subject: [PATCH] Android Extensions: Allow LayoutContainers in inner/local classes and objects --- ...oidExtensionsExpressionCodegenExtension.kt | 2 +- .../android/androidEntityInnerClass/0.kt | 40 +++++++++++++++++++ .../android/androidEntityInnerClass/1.kt | 30 ++++++++++++++ .../AndroidManifest.xml | 33 +++++++++++++++ .../androidEntityInnerClass/layout/layout.xml | 10 +++++ .../test/AndroidBoxTestGenerated.java | 12 ++++++ 6 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/0.kt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/1.kt create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/AndroidManifest.xml create mode 100644 plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/layout/layout.xml diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt index 6b01174a210..8505a4844d8 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt @@ -154,7 +154,7 @@ abstract class AbstractAndroidExtensionsExpressionCodegenExtension : ExpressionC val targetClass = codegen.myClass as? KtClass ?: return val container = codegen.descriptor - if (container.kind != ClassKind.CLASS || container.isInner || DescriptorUtils.isLocal(container)) return + if (container.kind != ClassKind.CLASS && container.kind != ClassKind.OBJECT) return val containerOptions = ContainerOptionsProxy.create(container) if (containerOptions.getCacheOrDefault(targetClass) == NO_CACHE) return diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/0.kt b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/0.kt new file mode 100644 index 00000000000..d8e27fe7013 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/0.kt @@ -0,0 +1,40 @@ +package test + +import android.app.Activity +import android.view.View +import android.widget.* +import kotlinx.android.synthetic.main.layout.* +import kotlinx.android.extensions.* + +class R { + class id { + companion object { + const val login = 5 + } + } +} + +class MyActivity(): Activity() { + val loginItem = Button(this) + + val entity = MyEntity(object : FrameLayout(this) { + override fun findViewById(id: Int) : View? = when(id) { + R.id.login -> loginItem + else -> null + } + }) + + val entity2: LayoutContainer = entity + + public fun box(): String { + val o = if (entity.login.toString() == "Button") "O" else "" + val k = if (entity2.login.toString() == "Button") "K" else "" + return o + k // "OK" + } + + inner class MyEntity(override val containerView: View) : LayoutContainer +} + +fun box(): String { + return MyActivity().box() +} diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/1.kt b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/1.kt new file mode 100644 index 00000000000..0788ecc38c3 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/1.kt @@ -0,0 +1,30 @@ +package test + +import android.app.Activity +import android.view.View +import android.widget.* +import kotlinx.android.synthetic.main.layout.* +import kotlinx.android.extensions.* + +class R { + class id { + companion object { + const val login = 5 + } + } +} + +class MyActivity(): Activity() { + val loginItem = Button(this) + val entity = MyEntity(loginItem) + + init { + entity.login + } + + inner class MyEntity(override val containerView: View) : LayoutContainer +} + +fun box(): String { + return "OK" +} diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/AndroidManifest.xml b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/AndroidManifest.xml new file mode 100644 index 00000000000..00856b86107 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/layout/layout.xml b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/layout/layout.xml new file mode 100644 index 00000000000..3e1b7254a52 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/androidEntityInnerClass/layout/layout.xml @@ -0,0 +1,10 @@ + + +