From 4cc5e9248a926a6a300f395c27567ab994112a5a Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 4 Mar 2015 21:19:28 +0300 Subject: [PATCH] Support View in android-compiler-plugin --- .../src/AndroidExpressionCodegenExtension.kt | 35 ++++++------- .../resolve/android/AndroidUIXmlProcessor.kt | 51 ++++++++++++------- .../android/CliAndroidUIXmlProcessor.kt | 4 +- .../converter/simple/fqNameInAttr/layout1.kt | 10 ++++ .../converter/simple/fqNameInTag/layout1.kt | 10 ++++ .../converter/simple/multiFile/layout1.kt | 21 ++------ .../converter/simple/multiFile/layout2.kt | 31 +++++++++++ .../converter/simple/multiFile/layout3.kt | 19 +++++++ .../converter/simple/singleFile/layout1.kt | 19 +++++++ .../testData/codegen/android/FakeActivity.kt | 4 +- .../testData/codegen/android/FakeFragment.kt | 5 +- .../testData/codegen/android/fragment/0.kt | 45 ++++++++++++++++ .../testData/codegen/android/fragment/1.kt | 32 ++++++++++++ .../android/fragment/AndroidManifest.xml | 33 ++++++++++++ .../codegen/android/fragment/CustomWidgets.kt | 8 +++ .../android/fragment/layout/layout.xml | 15 ++++++ .../testData/codegen/android/view/0.kt | 44 ++++++++++++++++ .../testData/codegen/android/view/1.kt | 34 +++++++++++++ .../codegen/android/view/AndroidManifest.xml | 33 ++++++++++++ .../codegen/android/view/layout/layout.xml | 23 +++++++++ .../extensionFunctionsView.kt | 15 ++++++ .../res/layout/layout.xml | 17 +++++++ .../simpleView/res/layout/layout.xml | 17 +++++++ .../bytecodeShape/simpleView/simpleView.kt | 15 ++++++ .../android/test/AndroidBoxTestGenerated.java | 12 +++++ .../AndroidBytecodeShapeTestGenerated.java | 12 +++++ .../propertiesSimpleView.kt | 10 ++++ .../res/layout/layout.xml | 17 +++++++ .../simpleView/res/layout/layout.xml | 17 +++++++ .../findUsages/simpleView/simpleView.kt | 8 +++ .../goto/simpleView/res/layout/layout.xml | 17 +++++++ .../android/goto/simpleView/simpleView.kt | 9 ++++ .../rename/simpleView/res/layout/layout.xml | 17 +++++++ .../android/rename/simpleView/simpleView.kt | 9 ++++ .../AndroidCompletionTestGenerated.java | 6 +++ .../AndroidFindUsagesTestGenerated.java | 6 +++ .../android/AndroidGotoTestGenerated.java | 6 +++ .../android/AndroidRenameTestGenerated.java | 6 +++ .../android/simple/res/layout/fragment.xml | 1 + .../android/simple/res/layout/main.xml | 1 + .../src/com/example/myapp/MyActivity.kt | 3 +- 41 files changed, 637 insertions(+), 60 deletions(-) create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt create mode 100644 plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/fragment/0.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/fragment/1.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/fragment/AndroidManifest.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/fragment/CustomWidgets.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/fragment/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/view/0.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/view/1.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/view/AndroidManifest.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/view/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsView/extensionFunctionsView.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsView/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleView/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleView/simpleView.kt create mode 100644 plugins/android-idea-plugin/testData/android/completion/propertiesSimpleView/propertiesSimpleView.kt create mode 100644 plugins/android-idea-plugin/testData/android/completion/propertiesSimpleView/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/simpleView/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/simpleView/simpleView.kt create mode 100644 plugins/android-idea-plugin/testData/android/goto/simpleView/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/goto/simpleView/simpleView.kt create mode 100644 plugins/android-idea-plugin/testData/android/rename/simpleView/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/rename/simpleView/simpleView.kt diff --git a/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt b/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt index cc2994ca619..0bcdaa90ef0 100644 --- a/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt +++ b/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt @@ -42,10 +42,11 @@ import org.jetbrains.org.objectweb.asm.Opcodes.ACC_PUBLIC import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter -private enum class AndroidClassType { - ACTIVITY - FRAGMENT - UNKNOWN +private enum class AndroidClassType(val internalClassName: String, val supportsCache: Boolean = false) { + ACTIVITY : AndroidClassType("android/app/Activity", true) + FRAGMENT : AndroidClassType("android/app/Fragment", true) + VIEW : AndroidClassType("android/view/View") + UNKNOWN : AndroidClassType("") } public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { @@ -72,15 +73,10 @@ public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { if (declarationDescriptor == null) return null - val supportsCache = when { - extensionReceiver is ClassReceiver -> true - else -> { - val source = declarationDescriptor.getSource() - if (source is KotlinSourceElement) true else false - } - } + val supportsCache = declarationDescriptor.getSource() is KotlinSourceElement - if (supportsCache) { + val androidClassType = getClassType(declarationDescriptor) + if (supportsCache && androidClassType.supportsCache) { val className = DescriptorUtils.getFqName(declarationDescriptor).toString() val bytecodeClassName = className.replace('.', '/') @@ -88,15 +84,15 @@ public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { c.v.getstatic(androidPackage.replace(".", "/") + "/R\$id", propertyDescriptor.getName().asString(), "I") c.v.invokevirtual(bytecodeClassName, METHOD_NAME, "(I)Landroid/view/View;", false) } else { - when (getClassType(declarationDescriptor)) { - AndroidClassType.ACTIVITY -> { - receiver.put(Type.getType("Landroid/app/Activity;"), c.v) + when (androidClassType) { + AndroidClassType.ACTIVITY, AndroidClassType.VIEW -> { + receiver.put(Type.getType("L${androidClassType.internalClassName};"), c.v) c.v.getstatic(androidPackage.replace(".", "/") + "/R\$id", propertyDescriptor.getName().asString(), "I") - c.v.invokevirtual("android/app/Activity", "findViewById", "(I)Landroid/view/View;", false) + c.v.invokevirtual(androidClassType.internalClassName, "findViewById", "(I)Landroid/view/View;", false) } AndroidClassType.FRAGMENT -> { - receiver.put(Type.getType("Landroid/app/Fragment;"), c.v) - c.v.invokevirtual("android/app/Fragment", "getView", "()Landroid/view/View;", false) + receiver.put(Type.getType("L${androidClassType.internalClassName};"), c.v) + c.v.invokevirtual(androidClassType.internalClassName, "getView", "()Landroid/view/View;", false) c.v.getstatic(androidPackage.replace(".", "/") + "/R\$id", propertyDescriptor.getName().asString(), "I") c.v.invokevirtual("android/view/View", "findViewById", "(I)Landroid/view/View;", false) } @@ -114,6 +110,7 @@ public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { fun getClassTypeInternal(name: String): AndroidClassType? = when (name) { "android.app.Activity" -> AndroidClassType.ACTIVITY "android.app.Fragment" -> AndroidClassType.FRAGMENT + "android.view.View" -> AndroidClassType.VIEW else -> null } @@ -196,7 +193,7 @@ public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { // Resolve View via findViewById if not in cache iv.load(0, classType) when (androidClassType) { - AndroidClassType.ACTIVITY -> { + AndroidClassType.ACTIVITY, AndroidClassType.VIEW -> { loadId() iv.invokevirtual(className, "findViewById", "(I)Landroid/view/View;", false) } diff --git a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidUIXmlProcessor.kt b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidUIXmlProcessor.kt index 99001a0da2e..e23dccf5eee 100644 --- a/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidUIXmlProcessor.kt +++ b/plugins/android-compiler-plugin/src/org/jetbrains/kotlin/lang/resolve/android/AndroidUIXmlProcessor.kt @@ -57,11 +57,7 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { public class NoAndroidManifestFound : Exception("No android manifest file found in project root") - private val androidImports = listOf( - "android.app.Activity", - "android.app.Fragment", - "android.view.View", - "android.widget.*") + protected val LOG: Logger = Logger.getInstance(javaClass) public abstract val resourceManager: AndroidResourceManager @@ -91,31 +87,42 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { } } - protected val LOG: Logger = Logger.getInstance(javaClass) - public fun parse(): List { - return resourceManager.getLayoutXmlFiles().map { file -> + return resourceManager.getLayoutXmlFiles().flatMap { file -> val widgets = parseSingleFile(file) if (widgets.isNotEmpty()) { val layoutPackage = file.genSyntheticPackageName() - val stringWriter = KotlinStringWriter() - stringWriter.writePackage(layoutPackage) - stringWriter.writeAndroidImports() - widgets.forEach { - stringWriter.writeSyntheticProperty("Activity", it, "findViewById(0)") - stringWriter.writeSyntheticProperty("Fragment", it, "getView().findViewById(0)") + val mainLayoutFile = renderLayoutFile(layoutPackage, widgets) { + writeSyntheticProperty("Activity", it, "findViewById(0)") + writeSyntheticProperty("Fragment", it, "getView().findViewById(0)") } - val contents = stringWriter.toStringBuffer().toString() - contents - } else null + val viewLayoutFile = renderLayoutFile("$layoutPackage.view", widgets) { + writeSyntheticProperty("View", it, "findViewById(0)") + } + + listOf(mainLayoutFile, viewLayoutFile) + } else listOf() }.filterNotNull() } public fun parseToPsi(): List? = cachedJetFiles.getValue() - protected abstract fun parseSingleFile(file: PsiFile): Collection + protected abstract fun parseSingleFile(file: PsiFile): List + + private fun renderLayoutFile( + packageName: String, + widgets: List, + widgetWriter: KotlinStringWriter.(AndroidWidget) -> Unit + ): String { + val stringWriter = KotlinStringWriter() + stringWriter.writePackage(packageName) + stringWriter.writeAndroidImports() + widgets.forEach { stringWriter.widgetWriter(it) } + + return stringWriter.toStringBuffer().toString() + } private fun KotlinStringWriter.writeAndroidImports() { androidImports.forEach { writeImport(it) } @@ -138,4 +145,12 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { return CachedValuesManager.getManager(project).createCachedValue(result, false) } + default object { + private val androidImports = listOf( + "android.app.Activity", + "android.app.Fragment", + "android.view.View", + "android.widget.*") + } + } \ No newline at end of file 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 578c445cc19..784e4182a14 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 @@ -38,8 +38,8 @@ public class CliAndroidUIXmlProcessor( project.getExtensions(PsiTreeChangePreprocessor.EP_NAME).first { it is AndroidPsiTreeChangePreprocessor } } - override fun parseSingleFile(file: PsiFile): Collection { - val widgets: MutableCollection = ArrayList() + override fun parseSingleFile(file: PsiFile): List { + val widgets = arrayListOf() val handler = AndroidXmlHandler { id, clazz -> widgets.add(AndroidWidget(id, clazz)) } try { diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt new file mode 100644 index 00000000000..c47d6a88d51 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt @@ -0,0 +1,10 @@ +package kotlinx.android.synthetic.layout.view + +import android.app.Activity +import android.app.Fragment +import android.view.View +import android.widget.* + +val View.MyButton: org.my.cool.Button + get() = findViewById(0) as org.my.cool.Button + diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt new file mode 100644 index 00000000000..c47d6a88d51 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt @@ -0,0 +1,10 @@ +package kotlinx.android.synthetic.layout.view + +import android.app.Activity +import android.app.Fragment +import android.view.View +import android.widget.* + +val View.MyButton: org.my.cool.Button + get() = findViewById(0) as org.my.cool.Button + diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout1.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout1.kt index d44501a7002..4b61ee6a807 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout1.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout1.kt @@ -1,30 +1,19 @@ -package kotlinx.android.synthetic.layout1 +package kotlinx.android.synthetic.layout.view import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* -val Activity.frameLayout: FrameLayout +val View.item_detail_container: FrameLayout get() = findViewById(0) as FrameLayout -val Fragment.frameLayout: FrameLayout - get() = getView().findViewById(0) as FrameLayout - -val Activity.passwordField: TextView +val View.textView1: TextView get() = findViewById(0) as TextView -val Fragment.passwordField: TextView - get() = getView().findViewById(0) as TextView - -val Activity.passwordCaption: EditText +val View.password: EditText get() = findViewById(0) as EditText -val Fragment.passwordCaption: EditText - get() = getView().findViewById(0) as EditText - -val Activity.loginButton: Button +val View.login: Button get() = findViewById(0) as Button -val Fragment.loginButton: Button - get() = getView().findViewById(0) as Button diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt new file mode 100644 index 00000000000..a32a827099f --- /dev/null +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt @@ -0,0 +1,31 @@ +package kotlinx.android.synthetic.layout1 + +import android.app.Activity +import android.app.Fragment +import android.view.View +import android.widget.* + +val Activity.frameLayout: FrameLayout + get() = findViewById(0) as FrameLayout + +val Fragment.frameLayout: FrameLayout + get() = getView().findViewById(0) as FrameLayout + +val Activity.passwordField: TextView + get() = findViewById(0) as TextView + +val Fragment.passwordField: TextView + get() = getView().findViewById(0) as TextView + +val Activity.passwordCaption: EditText + get() = findViewById(0) as EditText + +val Fragment.passwordCaption: EditText + get() = getView().findViewById(0) as EditText + +val Activity.loginButton: Button + get() = findViewById(0) as Button + +val Fragment.loginButton: Button + get() = getView().findViewById(0) as Button + diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt new file mode 100644 index 00000000000..071c81699c4 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt @@ -0,0 +1,19 @@ +package kotlinx.android.synthetic.layout1.view + +import android.app.Activity +import android.app.Fragment +import android.view.View +import android.widget.* + +val View.frameLayout: FrameLayout + get() = findViewById(0) as FrameLayout + +val View.passwordField: TextView + get() = findViewById(0) as TextView + +val View.passwordCaption: EditText + get() = findViewById(0) as EditText + +val View.loginButton: Button + get() = findViewById(0) as Button + diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt new file mode 100644 index 00000000000..4b61ee6a807 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt @@ -0,0 +1,19 @@ +package kotlinx.android.synthetic.layout.view + +import android.app.Activity +import android.app.Fragment +import android.view.View +import android.widget.* + +val View.item_detail_container: FrameLayout + get() = findViewById(0) as FrameLayout + +val View.textView1: TextView + get() = findViewById(0) as TextView + +val View.password: EditText + get() = findViewById(0) as EditText + +val View.login: Button + get() = findViewById(0) as Button + diff --git a/plugins/android-compiler-plugin/testData/codegen/android/FakeActivity.kt b/plugins/android-compiler-plugin/testData/codegen/android/FakeActivity.kt index 0c1c5236a95..217cb406805 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/FakeActivity.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/FakeActivity.kt @@ -3,6 +3,6 @@ package android.app import android.view.View import android.content.Context -abstract class Activity: Context { - abstract fun findViewById(id: Int): View? +open class Activity: Context { + open fun findViewById(id: Int): View? = null } diff --git a/plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt b/plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt index cad654ab000..a0f13c60673 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt @@ -1,8 +1,9 @@ package android.app import android.view.View -import android.content.Context +import android.app.Activity abstract class Fragment { - abstract fun getView(): View + open fun getActivity(): Activity = throw Exception("Function getActivity() is not overridden") + open fun getView(): View = throw Exception("Function getView() is not overridden") } diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fragment/0.kt b/plugins/android-compiler-plugin/testData/codegen/android/fragment/0.kt new file mode 100644 index 00000000000..cc443493eba --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/fragment/0.kt @@ -0,0 +1,45 @@ +package com.myapp + +import android.app.Activity +import android.app.Fragment +import android.content.Context +import android.view.View +import android.widget.* +import org.my.cool.MyButton +import kotlinx.android.synthetic.layout.* + +class R { + class id { + class object { + val login = 5 + } + } +} + +class BaseView(ctx: Context) : View(ctx) { + val buttonWidget = MyButton(ctx) + + override fun findViewById(id: Int): View? { + return when (id) { + R.id.login -> buttonWidget + else -> null + } + } +} + +class MyFragment(): Fragment() { + val baseActivity = Activity() + val baseView = BaseView(baseActivity) + + override fun getActivity(): Activity = baseActivity + + override fun getView(): View = baseView + + public fun box(): String { + return if (login.toString() == "MyButton") "OK" else "" + } +} + +fun box(): String { + return MyFragment().box() +} diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fragment/1.kt b/plugins/android-compiler-plugin/testData/codegen/android/fragment/1.kt new file mode 100644 index 00000000000..67bddb3723e --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/fragment/1.kt @@ -0,0 +1,32 @@ +package com.myapp + +import android.app.Activity +import android.app.Fragment +import android.content.Context +import android.view.View +import android.widget.* +import org.my.cool.MyButton +import kotlinx.android.synthetic.layout.* + +class R { + class id { + class object { + val login = 5 + } + } +} + +class BaseView(ctx: Context) : View(ctx) { + val buttonWidget = MyButton(ctx) +} + +class MyFragment(): Fragment() { + val baseActivity = Activity() + val baseView = BaseView(baseActivity) + + override fun getView(): View = baseView +} + +fun box(): String { + return "OK" +} diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fragment/AndroidManifest.xml b/plugins/android-compiler-plugin/testData/codegen/android/fragment/AndroidManifest.xml new file mode 100644 index 00000000000..580c474f5de --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/fragment/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fragment/CustomWidgets.kt b/plugins/android-compiler-plugin/testData/codegen/android/fragment/CustomWidgets.kt new file mode 100644 index 00000000000..ddd174f0bc7 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/fragment/CustomWidgets.kt @@ -0,0 +1,8 @@ +package org.my.cool + +import android.widget.Button +import android.content.Context + +class MyButton(ctx: Context): Button(ctx) { + override fun toString(): String {return "MyButton"} +} diff --git a/plugins/android-compiler-plugin/testData/codegen/android/fragment/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/android/fragment/layout/layout.xml new file mode 100644 index 00000000000..101bb490115 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/fragment/layout/layout.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/plugins/android-compiler-plugin/testData/codegen/android/view/0.kt b/plugins/android-compiler-plugin/testData/codegen/android/view/0.kt new file mode 100644 index 00000000000..39b66e7ab89 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/view/0.kt @@ -0,0 +1,44 @@ +package com.myapp + +import android.app.Activity +import android.view.View +import android.widget.* +import kotlinx.android.synthetic.layout.* +import kotlinx.android.synthetic.layout.view.* + +class R { + class id { + class object { + val container = 0 + val login = 1 + } + } +} + +class MyActivity(): Activity() { + val containerWidget = object : FrameLayout(this) { + val loginWidget = Button(this@MyActivity) + + override fun findViewById(id: Int): View? { + return when (id) { + R.id.login -> loginWidget + else -> null + } + } + } + + override fun findViewById(id: Int): View? { + return when (id) { + R.id.container -> containerWidget + else -> null + } + } + + public fun box(): String{ + return if (container.login.toString() == "Button") "OK" else "" + } +} + +fun box(): String { + return MyActivity().box() +} diff --git a/plugins/android-compiler-plugin/testData/codegen/android/view/1.kt b/plugins/android-compiler-plugin/testData/codegen/android/view/1.kt new file mode 100644 index 00000000000..934a378b0f8 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/view/1.kt @@ -0,0 +1,34 @@ +package com.myapp + +import android.app.Activity +import android.view.View +import android.widget.* +import kotlinx.android.synthetic.layout.* +import kotlinx.android.synthetic.layout.view.* + +class R { + class id { + class object { + val container = 0 + val login = 1 + } + } +} + +class MyActivity(): Activity() { + val containerWidget = object : FrameLayout(this) { + val loginWidget = Button(this@MyActivity) + } + + override fun findViewById(id: Int): View? { + return when (id) { + R.id.container -> containerWidget + else -> null + } + } + +} + +fun box(): String { + return "OK" +} diff --git a/plugins/android-compiler-plugin/testData/codegen/android/view/AndroidManifest.xml b/plugins/android-compiler-plugin/testData/codegen/android/view/AndroidManifest.xml new file mode 100644 index 00000000000..580c474f5de --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/view/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/android-compiler-plugin/testData/codegen/android/view/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/android/view/layout/layout.xml new file mode 100644 index 00000000000..9eb14c925ea --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/view/layout/layout.xml @@ -0,0 +1,23 @@ + + + + + +