From da8369066be9c5e7a2148b69f74ad0fdd427d1e3 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Tue, 3 Mar 2015 17:41:48 +0300 Subject: [PATCH] Support Fragment in android-compiler-plugin --- .../src/AndroidExpressionCodegenExtension.kt | 77 ++++++++++++++----- .../resolve/android/AndroidUIXmlProcessor.kt | 12 ++- .../converter/simple/fqNameInAttr/layout.kt | 4 + .../converter/simple/fqNameInTag/layout.kt | 4 + .../converter/simple/multiFile/layout.kt | 13 ++++ .../converter/simple/multiFile/layout1.kt | 12 +++ .../converter/simple/singleFile/layout.kt | 13 ++++ .../testData/codegen/android/FakeFragment.kt | 8 ++ .../testData/codegen/android/FakeView.kt | 4 +- .../baseClassFragment/baseClassFragment.kt | 16 ++++ .../baseClassFragment/res/layout/layout.xml | 17 ++++ .../extensionFunctionsBaseClassFragment.kt | 22 ++++++ .../res/layout/layout.xml | 17 ++++ .../extensionFunctionsFragment.kt | 21 +++++ .../res/layout/layout.xml | 17 ++++ .../fqNameInAttrFragment.kt | 16 ++++ .../res/layout/layout.xml | 15 ++++ .../fqNameInTagFragment.kt | 16 ++++ .../fqNameInTagFragment/res/layout/layout.xml | 14 ++++ .../multiFileFragment/multiFileFragment.kt | 21 +++++ .../multiFileFragment/res/layout/layout.xml | 29 +++++++ .../multiFileFragment/res/layout/layout1.xml | 29 +++++++ .../simpleFragment/res/layout/layout.xml | 17 ++++ .../simpleFragment/simpleFragment.kt | 16 ++++ .../android/test/AndroidBoxTestGenerated.java | 12 +++ .../AndroidBytecodeShapeTestGenerated.java | 42 ++++++++++ .../fqNameInAttrFragment.kt | 10 +++ .../res/layout/layout.xml | 15 ++++ .../fqNameInTagFragment.kt | 10 +++ .../fqNameInTagFragment/res/layout/layout.xml | 14 ++++ .../multiFileFragment/multiFileFragment.kt | 11 +++ .../multiFileFragment/res/layout/layout.xml | 29 +++++++ .../multiFileFragment/res/layout/layout1.xml | 29 +++++++ .../propertiesSimpleFragment.kt | 10 +++ .../res/layout/layout.xml | 17 ++++ .../fqNameInAttrFragment.kt | 9 +++ .../res/layout/layout.xml | 15 ++++ .../fqNameInTagFragment.kt | 9 +++ .../fqNameInTagFragment/res/layout/layout.xml | 14 ++++ .../multiFileFragment/multiFileFragment.kt | 10 +++ .../multiFileFragment/res/layout/layout.xml | 29 +++++++ .../multiFileFragment/res/layout/layout1.xml | 29 +++++++ .../simpleFragment/res/layout/layout.xml | 17 ++++ .../simpleFragment/simpleFragment.kt | 13 ++++ .../fqNameInAttrFragment.kt | 9 +++ .../res/layout/layout.xml | 15 ++++ .../fqNameInTagFragment.kt | 9 +++ .../fqNameInTagFragment/res/layout/layout.xml | 14 ++++ .../multiFileFragment/multiFileFragment.kt | 10 +++ .../multiFileFragment/res/layout/layout.xml | 29 +++++++ .../multiFileFragment/res/layout/layout1.xml | 29 +++++++ .../goto/simpleFragment/res/layout/layout.xml | 17 ++++ .../goto/simpleFragment/simpleFragment.kt | 11 +++ .../fqNameInAttrFragment.kt | 9 +++ .../res/layout/layout.xml | 15 ++++ .../fqNameInTagFragment.kt | 9 +++ .../fqNameInTagFragment/res/layout/layout.xml | 14 ++++ .../multiFileFragment/multiFileFragment.kt | 10 +++ .../multiFileFragment/res/layout/layout.xml | 29 +++++++ .../multiFileFragment/res/layout/layout1.xml | 29 +++++++ .../simpleFragment/res/layout/layout.xml | 17 ++++ .../rename/simpleFragment/simpleFragment.kt | 11 +++ .../AndroidCompletionTestGenerated.java | 24 ++++++ .../AndroidFindUsagesTestGenerated.java | 24 ++++++ .../android/AndroidGotoTestGenerated.java | 24 ++++++ .../android/AndroidRenameTestGenerated.java | 24 ++++++ .../android/simple/res/layout/fragment.xml | 13 ++++ .../src/com/example/myapp/MyActivity.kt | 16 ++++ 68 files changed, 1160 insertions(+), 25 deletions(-) create mode 100644 plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/baseClassFragment.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/extensionFunctionsBaseClassFragment.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/extensionFunctionsFragment.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/fqNameInAttrFragment.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/fqNameInTagFragment.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/multiFileFragment.kt create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout1.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/res/layout/layout.xml create mode 100644 plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/simpleFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/fqNameInAttrFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/fqNameInTagFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/completion/multiFileFragment/multiFileFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout1.xml create mode 100644 plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/propertiesSimpleFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/fqNameInAttrFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/fqNameInTagFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/multiFileFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout1.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/simpleFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/fqNameInAttrFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/fqNameInTagFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/goto/multiFileFragment/multiFileFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout1.xml create mode 100644 plugins/android-idea-plugin/testData/android/goto/simpleFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/goto/simpleFragment/simpleFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/fqNameInAttrFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/fqNameInTagFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/rename/multiFileFragment/multiFileFragment.kt create mode 100644 plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout1.xml create mode 100644 plugins/android-idea-plugin/testData/android/rename/simpleFragment/res/layout/layout.xml create mode 100644 plugins/android-idea-plugin/testData/android/rename/simpleFragment/simpleFragment.kt create mode 100644 plugins/android-jps-plugin/testData/android/simple/res/layout/fragment.xml diff --git a/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt b/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt index 8af0b23370f..cc2994ca619 100644 --- a/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt +++ b/plugins/android-compiler-plugin/src/AndroidExpressionCodegenExtension.kt @@ -42,6 +42,12 @@ 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 +} + public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { default object { private val PROPERTY_NAME = "_\$_findViewCache" @@ -64,49 +70,70 @@ public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { val extensionReceiver = resolvedCall.getExtensionReceiver() val declarationDescriptor = extensionReceiver.getType().getConstructor().getDeclarationDescriptor() + if (declarationDescriptor == null) return null + val supportsCache = when { - extensionReceiver is ClassReceiver && declarationDescriptor != null -> true + extensionReceiver is ClassReceiver -> true else -> { - val source = declarationDescriptor?.getSource() + val source = declarationDescriptor.getSource() if (source is KotlinSourceElement) true else false } } if (supportsCache) { - val className = DescriptorUtils.getFqName(declarationDescriptor!!).toString() + val className = DescriptorUtils.getFqName(declarationDescriptor).toString() val bytecodeClassName = className.replace('.', '/') receiver.put(Type.getType("L$bytecodeClassName;"), c.v) c.v.getstatic(androidPackage.replace(".", "/") + "/R\$id", propertyDescriptor.getName().asString(), "I") c.v.invokevirtual(bytecodeClassName, METHOD_NAME, "(I)Landroid/view/View;", false) } else { - receiver.put(Type.getType("Landroid/app/Activity;"), 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) + when (getClassType(declarationDescriptor)) { + AndroidClassType.ACTIVITY -> { + receiver.put(Type.getType("Landroid/app/Activity;"), 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) + } + AndroidClassType.FRAGMENT -> { + receiver.put(Type.getType("Landroid/app/Fragment;"), c.v) + c.v.invokevirtual("android/app/Fragment", "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) + } + else -> return null + } + + } c.v.checkcast(retType) return StackValue.onStack(retType) } - private fun isClassSupported(descriptor: ClassifierDescriptor): Boolean { - fun classNameSupported(name: String): Boolean = when (name) { - "android.app.Activity" -> true - else -> false + private fun getClassType(descriptor: ClassifierDescriptor): AndroidClassType { + fun getClassTypeInternal(name: String): AndroidClassType? = when (name) { + "android.app.Activity" -> AndroidClassType.ACTIVITY + "android.app.Fragment" -> AndroidClassType.FRAGMENT + else -> null } if (descriptor is LazyJavaClassDescriptor) { - if (classNameSupported(descriptor.fqName.asString())) - return true + val androidClassType = getClassTypeInternal(descriptor.fqName.asString()) + if (androidClassType != null) return androidClassType } else if (descriptor is LazyClassDescriptor) { // For tests (FakeActivity) - if (classNameSupported(DescriptorUtils.getFqName(descriptor).toString())) - return true + val androidClassType = getClassTypeInternal(DescriptorUtils.getFqName(descriptor).toString()) + if (androidClassType != null) return androidClassType } - return descriptor.getTypeConstructor().getSupertypes().any { - val declarationDescriptor = it.getConstructor().getDeclarationDescriptor() - declarationDescriptor != null && isClassSupported(declarationDescriptor) + for (supertype in descriptor.getTypeConstructor().getSupertypes()) { + val declarationDescriptor = supertype.getConstructor().getDeclarationDescriptor() + if (declarationDescriptor != null) { + val androidClassType = getClassType(declarationDescriptor) + if (androidClassType != AndroidClassType.UNKNOWN) return androidClassType + } } + + return AndroidClassType.UNKNOWN } override fun generateClassSyntheticParts( @@ -118,7 +145,8 @@ public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { if (descriptor.getKind() != ClassKind.CLASS || descriptor.isInner() || DescriptorUtils.isLocal(descriptor)) return // Do not generate anything if class is not supported - if (!isClassSupported(descriptor)) return + val androidClassType = getClassType(descriptor) + if (androidClassType == AndroidClassType.UNKNOWN) return val classType = JetTypeMapper(bindingContext, ClassBuilderMode.FULL).mapClass(descriptor) val className = classType.getInternalName() @@ -167,8 +195,17 @@ public class AndroidExpressionCodegenExtension : ExpressionCodegenExtension { // Resolve View via findViewById if not in cache iv.load(0, classType) - loadId() - iv.invokevirtual(className, "findViewById", "(I)Landroid/view/View;", false) + when (androidClassType) { + AndroidClassType.ACTIVITY -> { + loadId() + iv.invokevirtual(className, "findViewById", "(I)Landroid/view/View;", false) + } + AndroidClassType.FRAGMENT -> { + iv.invokevirtual(className, "getView", "()Landroid/view/View;", false) + loadId() + iv.invokevirtual("android/view/View", "findViewById", "(I)Landroid/view/View;", false) + } + } iv.store(2, viewType) // Store resolved View in cache 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 83b366283c5..99001a0da2e 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 @@ -59,6 +59,7 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { private val androidImports = listOf( "android.app.Activity", + "android.app.Fragment", "android.view.View", "android.widget.*") @@ -101,7 +102,10 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { stringWriter.writePackage(layoutPackage) stringWriter.writeAndroidImports() - widgets.forEach { stringWriter.writeSyntheticActivityProperty(it) } + widgets.forEach { + stringWriter.writeSyntheticProperty("Activity", it, "findViewById(0)") + stringWriter.writeSyntheticProperty("Fragment", it, "getView().findViewById(0)") + } val contents = stringWriter.toStringBuffer().toString() contents @@ -122,9 +126,9 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { return AndroidConst.SYNTHETIC_PACKAGE + getName().substringBefore('.') } - private fun KotlinStringWriter.writeSyntheticActivityProperty(widget: AndroidWidget) { - val body = arrayListOf("return findViewById(0) as ${widget.className}") - writeImmutableExtensionProperty(receiver = "Activity", + private fun KotlinStringWriter.writeSyntheticProperty(receiver: String, widget: AndroidWidget, stubCall: String) { + val body = arrayListOf("return $stubCall as ${widget.className}") + writeImmutableExtensionProperty(receiver, name = widget.id, retType = widget.className, getterBody = body) diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt index 72e14627c9a..6f303b90ac9 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout.kt @@ -1,9 +1,13 @@ package kotlinx.android.synthetic.layout import android.app.Activity +import android.app.Fragment import android.view.View import android.widget.* val Activity.MyButton: org.my.cool.Button get() = findViewById(0) as org.my.cool.Button +val Fragment.MyButton: org.my.cool.Button + get() = getView().findViewById(0) as org.my.cool.Button + diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt index 72e14627c9a..6f303b90ac9 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout.kt @@ -1,9 +1,13 @@ package kotlinx.android.synthetic.layout import android.app.Activity +import android.app.Fragment import android.view.View import android.widget.* val Activity.MyButton: org.my.cool.Button get() = findViewById(0) as org.my.cool.Button +val Fragment.MyButton: org.my.cool.Button + get() = getView().findViewById(0) as org.my.cool.Button + diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt index dac5cc16ca2..354d78b29f0 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout.kt @@ -1,18 +1,31 @@ package kotlinx.android.synthetic.layout import android.app.Activity +import android.app.Fragment import android.view.View import android.widget.* val Activity.item_detail_container: FrameLayout get() = findViewById(0) as FrameLayout +val Fragment.item_detail_container: FrameLayout + get() = getView().findViewById(0) as FrameLayout + val Activity.textView1: TextView get() = findViewById(0) as TextView +val Fragment.textView1: TextView + get() = getView().findViewById(0) as TextView + val Activity.password: EditText get() = findViewById(0) as EditText +val Fragment.password: EditText + get() = getView().findViewById(0) as EditText + val Activity.login: Button get() = findViewById(0) as Button +val Fragment.login: Button + get() = getView().findViewById(0) as 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 1612fb29eb6..d44501a7002 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,18 +1,30 @@ 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/singleFile/layout.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout.kt index dac5cc16ca2..354d78b29f0 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout.kt @@ -1,18 +1,31 @@ package kotlinx.android.synthetic.layout import android.app.Activity +import android.app.Fragment import android.view.View import android.widget.* val Activity.item_detail_container: FrameLayout get() = findViewById(0) as FrameLayout +val Fragment.item_detail_container: FrameLayout + get() = getView().findViewById(0) as FrameLayout + val Activity.textView1: TextView get() = findViewById(0) as TextView +val Fragment.textView1: TextView + get() = getView().findViewById(0) as TextView + val Activity.password: EditText get() = findViewById(0) as EditText +val Fragment.password: EditText + get() = getView().findViewById(0) as EditText + val Activity.login: Button get() = findViewById(0) as Button +val Fragment.login: Button + get() = getView().findViewById(0) as Button + diff --git a/plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt b/plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt new file mode 100644 index 00000000000..cad654ab000 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/android/FakeFragment.kt @@ -0,0 +1,8 @@ +package android.app + +import android.view.View +import android.content.Context + +abstract class Fragment { + abstract fun getView(): View +} diff --git a/plugins/android-compiler-plugin/testData/codegen/android/FakeView.kt b/plugins/android-compiler-plugin/testData/codegen/android/FakeView.kt index 8a4dc0f9577..c59bf08820f 100644 --- a/plugins/android-compiler-plugin/testData/codegen/android/FakeView.kt +++ b/plugins/android-compiler-plugin/testData/codegen/android/FakeView.kt @@ -2,4 +2,6 @@ package android.view import android.content.Context -open class View(ctx: Context) +open class View(ctx: Context) { + open fun findViewById(id: Int): View? = null +} diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/baseClassFragment.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/baseClassFragment.kt new file mode 100644 index 00000000000..fac5e0cdcc1 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/baseClassFragment.kt @@ -0,0 +1,16 @@ +package com.myapp + +import android.app.Fragment +import kotlinx.android.synthetic.layout.* + +fun Fragment.a() { + val x = login + val y = this.login +} + +// 2 GETSTATIC +// 4 INVOKEVIRTUAL +// 2 CHECKCAST +// 0 _\$_findCachedViewById +// 2 findViewById +// 2 getView \ No newline at end of file diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/res/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/res/layout/layout.xml new file mode 100644 index 00000000000..4d73173b521 --- /dev/null +++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/res/layout/layout.xml @@ -0,0 +1,17 @@ + + + + +