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 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/extensionFunctionsBaseClassFragment.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/extensionFunctionsBaseClassFragment.kt
new file mode 100644
index 00000000000..0d293339196
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/extensionFunctionsBaseClassFragment.kt
@@ -0,0 +1,22 @@
+package com.myapp
+
+import android.app.Fragment
+import android.os.Bundle
+import java.io.File
+import kotlinx.android.synthetic.layout.*
+
+public class MyFragment : Fragment() {
+
+}
+
+fun Fragment.b() {
+ val x = login
+ val y = this.login
+}
+
+// 2 GETSTATIC
+// 8 INVOKEVIRTUAL
+// 3 CHECKCAST
+// 1 _\$_findCachedViewById
+// 3 findViewById
+// 3 getView
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/res/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..4d73173b521
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/res/layout/layout.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/extensionFunctionsFragment.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/extensionFunctionsFragment.kt
new file mode 100644
index 00000000000..d31dda81e06
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/extensionFunctionsFragment.kt
@@ -0,0 +1,21 @@
+package com.myapp
+
+import android.app.Activity
+import android.os.Bundle
+import java.io.File
+import kotlinx.android.synthetic.layout.*
+
+public class MyActivity : Activity() {
+
+}
+
+fun MyActivity.b() {
+ val x = login
+ val y = this.login
+}
+
+// 2 GETSTATIC
+// 5 INVOKEVIRTUAL
+// 3 CHECKCAST
+// 3 _\$_findCachedViewById
+// 1 findViewById
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/res/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..4d73173b521
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/res/layout/layout.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/fqNameInAttrFragment.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/fqNameInAttrFragment.kt
new file mode 100644
index 00000000000..934e6251a80
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/fqNameInAttrFragment.kt
@@ -0,0 +1,16 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+ val button2 = MyButton
+}
+
+// 2 GETSTATIC
+// 6 INVOKEVIRTUAL
+// 3 CHECKCAST
+// 3 _\$_findCachedViewById
+// 1 findViewById
+// 1 getView
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/res/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..a0be11bdbef
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/res/layout/layout.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/fqNameInTagFragment.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/fqNameInTagFragment.kt
new file mode 100644
index 00000000000..934e6251a80
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/fqNameInTagFragment.kt
@@ -0,0 +1,16 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+ val button2 = MyButton
+}
+
+// 2 GETSTATIC
+// 6 INVOKEVIRTUAL
+// 3 CHECKCAST
+// 3 _\$_findCachedViewById
+// 1 findViewById
+// 1 getView
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/res/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..0fb4a055ed2
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/res/layout/layout.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/multiFileFragment.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/multiFileFragment.kt
new file mode 100644
index 00000000000..8de17aaa9cb
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/multiFileFragment.kt
@@ -0,0 +1,21 @@
+package com.myapp
+
+import android.app.Activity
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+import kotlinx.android.synthetic.layout1.*
+
+class MyActivity: Activity() {
+ val button = this.login
+}
+
+class MyFragment: Fragment() {
+ val button1 = this.loginButton
+}
+
+// 2 GETSTATIC
+// 9 INVOKEVIRTUAL
+// 4 CHECKCAST
+// 4 _\$_findCachedViewById
+// 2 findViewById
+// 1 getView
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..f4736f6937b
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout1.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout1.xml
new file mode 100644
index 00000000000..7c48f2b615c
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/res/layout/layout1.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/res/layout/layout.xml b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..4d73173b521
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/res/layout/layout.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/simpleFragment.kt b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/simpleFragment.kt
new file mode 100644
index 00000000000..02a17349a3d
--- /dev/null
+++ b/plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/simpleFragment.kt
@@ -0,0 +1,16 @@
+package com.myapp
+
+import android.app.Fragment
+import java.io.File
+import kotlinx.android.synthetic.layout.*
+
+public class MyFragment : Fragment() {
+ {login}
+}
+
+// 1 GETSTATIC
+// 5 INVOKEVIRTUAL
+// 2 CHECKCAST
+// 2 _\$_findCachedViewById
+// 1 findViewById
+// 1 getView
\ No newline at end of file
diff --git a/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBoxTestGenerated.java b/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBoxTestGenerated.java
index cda43df8865..efc9965c9a3 100644
--- a/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBoxTestGenerated.java
+++ b/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBoxTestGenerated.java
@@ -54,6 +54,12 @@ public class AndroidBoxTestGenerated extends AbstractAndroidBoxTest {
doCompileAgainstAndroidSdkTest(fileName);
}
+ @TestMetadata("fragment")
+ public void testFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/android/fragment/");
+ doCompileAgainstAndroidSdkTest(fileName);
+ }
+
@TestMetadata("manyWidgets")
public void testManyWidgets() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/android/manyWidgets/");
@@ -93,6 +99,12 @@ public class AndroidBoxTestGenerated extends AbstractAndroidBoxTest {
doFakeInvocationTest(fileName);
}
+ @TestMetadata("fragment")
+ public void testFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/android/fragment/");
+ doFakeInvocationTest(fileName);
+ }
+
@TestMetadata("manyWidgets")
public void testManyWidgets() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/android/manyWidgets/");
diff --git a/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBytecodeShapeTestGenerated.java b/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBytecodeShapeTestGenerated.java
index 5e93105b99b..f5127d700ad 100644
--- a/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBytecodeShapeTestGenerated.java
+++ b/plugins/android-compiler-plugin/tests/org/jetbrains/kotlin/lang/resolve/android/test/AndroidBytecodeShapeTestGenerated.java
@@ -42,6 +42,12 @@ public class AndroidBytecodeShapeTestGenerated extends AbstractAndroidBytecodeSh
doTest(fileName);
}
+ @TestMetadata("baseClassFragment")
+ public void testBaseClassFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/baseClassFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("extensionFunctions")
public void testExtensionFunctions() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctions/");
@@ -54,27 +60,63 @@ public class AndroidBytecodeShapeTestGenerated extends AbstractAndroidBytecodeSh
doTest(fileName);
}
+ @TestMetadata("extensionFunctionsBaseClassFragment")
+ public void testExtensionFunctionsBaseClassFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsBaseClassFragment/");
+ doTest(fileName);
+ }
+
+ @TestMetadata("extensionFunctionsFragment")
+ public void testExtensionFunctionsFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/extensionFunctionsFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("fqNameInAttr")
public void testFqNameInAttr() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttr/");
doTest(fileName);
}
+ @TestMetadata("fqNameInAttrFragment")
+ public void testFqNameInAttrFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInAttrFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("fqNameInTag")
public void testFqNameInTag() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTag/");
doTest(fileName);
}
+ @TestMetadata("fqNameInTagFragment")
+ public void testFqNameInTagFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/fqNameInTagFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("multiFile")
public void testMultiFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFile/");
doTest(fileName);
}
+ @TestMetadata("multiFileFragment")
+ public void testMultiFileFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/multiFileFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("simple")
public void testSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simple/");
doTest(fileName);
}
+
+ @TestMetadata("simpleFragment")
+ public void testSimpleFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-compiler-plugin/testData/codegen/bytecodeShape/simpleFragment/");
+ doTest(fileName);
+ }
}
diff --git a/plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/fqNameInAttrFragment.kt b/plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/fqNameInAttrFragment.kt
new file mode 100644
index 00000000000..f87c18cb51d
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/fqNameInAttrFragment.kt
@@ -0,0 +1,10 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyBu
+}
+
+// EXIST: MyButton
diff --git a/plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..a0ef9f3a1ed
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/res/layout/layout.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/fqNameInTagFragment.kt b/plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/fqNameInTagFragment.kt
new file mode 100644
index 00000000000..f87c18cb51d
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/fqNameInTagFragment.kt
@@ -0,0 +1,10 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyBu
+}
+
+// EXIST: MyButton
diff --git a/plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..2ec85364e74
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/res/layout/layout.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/multiFileFragment.kt b/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/multiFileFragment.kt
new file mode 100644
index 00000000000..ad78238b7fc
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/multiFileFragment.kt
@@ -0,0 +1,11 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+import kotlinx.android.synthetic.layout1.*
+
+class MyFragment: Fragment() {
+ val button = log
+}
+
+// EXIST: login, loginButton
diff --git a/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..f4736f6937b
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout1.xml b/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout1.xml
new file mode 100644
index 00000000000..7c48f2b615c
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/multiFileFragment/res/layout/layout1.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/propertiesSimpleFragment.kt b/plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/propertiesSimpleFragment.kt
new file mode 100644
index 00000000000..098d66ffc95
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/propertiesSimpleFragment.kt
@@ -0,0 +1,10 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.login
+}
+
+// EXIST: login
diff --git a/plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..4d73173b521
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/res/layout/layout.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/fqNameInAttrFragment.kt b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/fqNameInAttrFragment.kt
new file mode 100644
index 00000000000..b95a39e0565
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/fqNameInAttrFragment.kt
@@ -0,0 +1,9 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..a0ef9f3a1ed
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/res/layout/layout.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/fqNameInTagFragment.kt b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/fqNameInTagFragment.kt
new file mode 100644
index 00000000000..b95a39e0565
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/fqNameInTagFragment.kt
@@ -0,0 +1,9 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..2ec85364e74
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/res/layout/layout.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/multiFileFragment.kt b/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/multiFileFragment.kt
new file mode 100644
index 00000000000..65215c9c72d
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/multiFileFragment.kt
@@ -0,0 +1,10 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.login
+ val button1 = this.loginButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..f4736f6937b
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout1.xml b/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout1.xml
new file mode 100644
index 00000000000..7c48f2b615c
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/res/layout/layout1.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..4d73173b521
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/res/layout/layout.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/simpleFragment.kt b/plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/simpleFragment.kt
new file mode 100644
index 00000000000..cde92077fc1
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/simpleFragment.kt
@@ -0,0 +1,13 @@
+package com.myapp
+
+import android.app.Fragment
+import java.io.File
+import kotlinx.android.synthetic.layout.*
+
+public class MyFragemnt : Fragment() {
+ override fun onResume() {}
+ val button = login
+
+ fun f() = login.toString()
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/fqNameInAttrFragment.kt b/plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/fqNameInAttrFragment.kt
new file mode 100644
index 00000000000..b95a39e0565
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/fqNameInAttrFragment.kt
@@ -0,0 +1,9 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..a0ef9f3a1ed
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/res/layout/layout.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/fqNameInTagFragment.kt b/plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/fqNameInTagFragment.kt
new file mode 100644
index 00000000000..b95a39e0565
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/fqNameInTagFragment.kt
@@ -0,0 +1,9 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..2ec85364e74
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/res/layout/layout.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/multiFileFragment.kt b/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/multiFileFragment.kt
new file mode 100644
index 00000000000..65215c9c72d
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/multiFileFragment.kt
@@ -0,0 +1,10 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.login
+ val button1 = this.loginButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..f4736f6937b
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout1.xml b/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout1.xml
new file mode 100644
index 00000000000..7c48f2b615c
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/multiFileFragment/res/layout/layout1.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/goto/simpleFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/goto/simpleFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..4d73173b521
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/simpleFragment/res/layout/layout.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/goto/simpleFragment/simpleFragment.kt b/plugins/android-idea-plugin/testData/android/goto/simpleFragment/simpleFragment.kt
new file mode 100644
index 00000000000..6a52565b000
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/goto/simpleFragment/simpleFragment.kt
@@ -0,0 +1,11 @@
+package com.myapp
+
+import android.app.Fragment
+import java.io.File
+import kotlinx.android.synthetic.layout.*
+
+public class MyFragment : Fragment() {
+ override fun onResume() {}
+ val button = login
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/fqNameInAttrFragment.kt b/plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/fqNameInAttrFragment.kt
new file mode 100644
index 00000000000..b95a39e0565
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/fqNameInAttrFragment.kt
@@ -0,0 +1,9 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..a0ef9f3a1ed
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/res/layout/layout.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/fqNameInTagFragment.kt b/plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/fqNameInTagFragment.kt
new file mode 100644
index 00000000000..b95a39e0565
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/fqNameInTagFragment.kt
@@ -0,0 +1,9 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.MyButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..2ec85364e74
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/res/layout/layout.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/multiFileFragment.kt b/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/multiFileFragment.kt
new file mode 100644
index 00000000000..65215c9c72d
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/multiFileFragment.kt
@@ -0,0 +1,10 @@
+package com.myapp
+
+import android.app.Fragment
+import kotlinx.android.synthetic.layout.*
+
+class MyFragment: Fragment() {
+ val button = this.login
+ val button1 = this.loginButton
+}
+
diff --git a/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..f4736f6937b
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout1.xml b/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout1.xml
new file mode 100644
index 00000000000..7c48f2b615c
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/multiFileFragment/res/layout/layout1.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/rename/simpleFragment/res/layout/layout.xml b/plugins/android-idea-plugin/testData/android/rename/simpleFragment/res/layout/layout.xml
new file mode 100644
index 00000000000..4d73173b521
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/simpleFragment/res/layout/layout.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugins/android-idea-plugin/testData/android/rename/simpleFragment/simpleFragment.kt b/plugins/android-idea-plugin/testData/android/rename/simpleFragment/simpleFragment.kt
new file mode 100644
index 00000000000..6a52565b000
--- /dev/null
+++ b/plugins/android-idea-plugin/testData/android/rename/simpleFragment/simpleFragment.kt
@@ -0,0 +1,11 @@
+package com.myapp
+
+import android.app.Fragment
+import java.io.File
+import kotlinx.android.synthetic.layout.*
+
+public class MyFragment : Fragment() {
+ override fun onResume() {}
+ val button = login
+}
+
diff --git a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidCompletionTestGenerated.java b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidCompletionTestGenerated.java
index cb0d4946e3a..c449a8370a0 100644
--- a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidCompletionTestGenerated.java
+++ b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidCompletionTestGenerated.java
@@ -42,21 +42,45 @@ public class AndroidCompletionTestGenerated extends AbstractAndroidCompletionTes
doTest(fileName);
}
+ @TestMetadata("fqNameInAttrFragment")
+ public void testFqNameInAttrFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/completion/fqNameInAttrFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("fqNameInTag")
public void testFqNameInTag() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/completion/fqNameInTag/");
doTest(fileName);
}
+ @TestMetadata("fqNameInTagFragment")
+ public void testFqNameInTagFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/completion/fqNameInTagFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("multiFile")
public void testMultiFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/completion/multiFile/");
doTest(fileName);
}
+ @TestMetadata("multiFileFragment")
+ public void testMultiFileFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/completion/multiFileFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("propertiesSimple")
public void testPropertiesSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/completion/propertiesSimple/");
doTest(fileName);
}
+
+ @TestMetadata("propertiesSimpleFragment")
+ public void testPropertiesSimpleFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/completion/propertiesSimpleFragment/");
+ doTest(fileName);
+ }
}
diff --git a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidFindUsagesTestGenerated.java b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidFindUsagesTestGenerated.java
index 75bbd726d2e..834b00fd620 100644
--- a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidFindUsagesTestGenerated.java
+++ b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidFindUsagesTestGenerated.java
@@ -42,18 +42,36 @@ public class AndroidFindUsagesTestGenerated extends AbstractAndroidFindUsagesTes
doTest(fileName);
}
+ @TestMetadata("fqNameInAttrFragment")
+ public void testFqNameInAttrFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/fqNameInAttrFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("fqNameInTag")
public void testFqNameInTag() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/fqNameInTag/");
doTest(fileName);
}
+ @TestMetadata("fqNameInTagFragment")
+ public void testFqNameInTagFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/fqNameInTagFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("multiFile")
public void testMultiFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/multiFile/");
doTest(fileName);
}
+ @TestMetadata("multiFileFragment")
+ public void testMultiFileFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/multiFileFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("simple")
public void testSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/simple/");
@@ -65,4 +83,10 @@ public class AndroidFindUsagesTestGenerated extends AbstractAndroidFindUsagesTes
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/wrongIdFormat/");
doTest(fileName);
}
+
+ @TestMetadata("simpleFragment")
+ public void testSimpleFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/findUsages/simpleFragment/");
+ doTest(fileName);
+ }
}
diff --git a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidGotoTestGenerated.java b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidGotoTestGenerated.java
index 6ae1b70166a..5fe3a2418fa 100644
--- a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidGotoTestGenerated.java
+++ b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidGotoTestGenerated.java
@@ -42,21 +42,45 @@ public class AndroidGotoTestGenerated extends AbstractAndroidGotoTest {
doTest(fileName);
}
+ @TestMetadata("fqNameInAttrFragment")
+ public void testFqNameInAttrFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/goto/fqNameInAttrFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("fqNameInTag")
public void testFqNameInTag() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/goto/fqNameInTag/");
doTest(fileName);
}
+ @TestMetadata("fqNameInTagFragment")
+ public void testFqNameInTagFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/goto/fqNameInTagFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("multiFile")
public void testMultiFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/goto/multiFile/");
doTest(fileName);
}
+ @TestMetadata("multiFileFragment")
+ public void testMultiFileFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/goto/multiFileFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("simple")
public void testSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/goto/simple/");
doTest(fileName);
}
+
+ @TestMetadata("simpleFragment")
+ public void testSimpleFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/goto/simpleFragment/");
+ doTest(fileName);
+ }
}
diff --git a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidRenameTestGenerated.java b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidRenameTestGenerated.java
index 24db35a918e..48ff601ab73 100644
--- a/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidRenameTestGenerated.java
+++ b/plugins/android-idea-plugin/tests/org/jetbrains/kotlin/android/AndroidRenameTestGenerated.java
@@ -42,21 +42,45 @@ public class AndroidRenameTestGenerated extends AbstractAndroidRenameTest {
doTest(fileName);
}
+ @TestMetadata("fqNameInAttrFragment")
+ public void testFqNameInAttrFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/rename/fqNameInAttrFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("fqNameInTag")
public void testFqNameInTag() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/rename/fqNameInTag/");
doTest(fileName);
}
+ @TestMetadata("fqNameInTagFragment")
+ public void testFqNameInTagFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/rename/fqNameInTagFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("multiFile")
public void testMultiFile() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/rename/multiFile/");
doTest(fileName);
}
+ @TestMetadata("multiFileFragment")
+ public void testMultiFileFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/rename/multiFileFragment/");
+ doTest(fileName);
+ }
+
@TestMetadata("simple")
public void testSimple() throws Exception {
String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/rename/simple/");
doTest(fileName);
}
+
+ @TestMetadata("simpleFragment")
+ public void testSimpleFragment() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("plugins/android-idea-plugin/testData/android/rename/simpleFragment/");
+ doTest(fileName);
+ }
}
diff --git a/plugins/android-jps-plugin/testData/android/simple/res/layout/fragment.xml b/plugins/android-jps-plugin/testData/android/simple/res/layout/fragment.xml
new file mode 100644
index 00000000000..2ba91637f74
--- /dev/null
+++ b/plugins/android-jps-plugin/testData/android/simple/res/layout/fragment.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
diff --git a/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt b/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt
index 15812470b90..26cf256c092 100644
--- a/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt
+++ b/plugins/android-jps-plugin/testData/android/simple/src/com/example/myapp/MyActivity.kt
@@ -1,9 +1,14 @@
package com.example.myapp
import android.app.Activity
+import android.app.Fragment
import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import android.view.View
import kotlinx.android.synthetic.main.*
+import kotlinx.android.synthetic.fragment.*
public class MyActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -12,3 +17,14 @@ public class MyActivity : Activity() {
textField.setText("test")
}
}
+
+public class MyFragment : Fragment() {
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+ return inflater.inflate(R.layout.fragment, container, false)
+ }
+
+ override fun onResume() {
+ super.onResume()
+ textField2.setText("test fragment")
+ }
+}
\ No newline at end of file