Android Extensions: Support LayoutContainer in code generation

This commit is contained in:
Yan Zhulanow
2017-06-05 22:46:37 +03:00
parent a69f9729e0
commit 423a09e46a
32 changed files with 279 additions and 56 deletions
@@ -16,11 +16,10 @@
package org.jetbrains.kotlin.android.synthetic.codegen
import kotlinx.android.extensions.LayoutContainer
import org.jetbrains.kotlin.android.synthetic.AndroidConst
import org.jetbrains.kotlin.descriptors.ClassifierDescriptor
import org.jetbrains.kotlin.load.java.lazy.descriptors.LazyJavaClassDescriptor
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor
enum class AndroidContainerType(className: String, val doesSupportCache: Boolean = false, val isFragment: Boolean = false) {
ACTIVITY(AndroidConst.ACTIVITY_FQNAME, doesSupportCache = true),
@@ -29,11 +28,14 @@ enum class AndroidContainerType(className: String, val doesSupportCache: Boolean
SUPPORT_FRAGMENT_ACTIVITY(AndroidConst.SUPPORT_FRAGMENT_ACTIVITY_FQNAME, doesSupportCache = true),
SUPPORT_FRAGMENT(AndroidConst.SUPPORT_FRAGMENT_FQNAME, doesSupportCache = true, isFragment = true),
VIEW(AndroidConst.VIEW_FQNAME, doesSupportCache = true),
LAYOUT_CONTAINER(LayoutContainer::class.java.canonicalName, doesSupportCache = true),
UNKNOWN("");
val internalClassName: String = className.replace('.', '/')
companion object {
private val LAYOUT_CONTAINER_FQNAME = LayoutContainer::class.java.canonicalName
fun get(descriptor: ClassifierDescriptor): AndroidContainerType {
fun getClassTypeInternal(name: String): AndroidContainerType? = when (name) {
AndroidConst.ACTIVITY_FQNAME -> AndroidContainerType.ACTIVITY
@@ -42,17 +44,11 @@ enum class AndroidContainerType(className: String, val doesSupportCache: Boolean
AndroidConst.SUPPORT_FRAGMENT_ACTIVITY_FQNAME -> AndroidContainerType.SUPPORT_FRAGMENT_ACTIVITY
AndroidConst.SUPPORT_FRAGMENT_FQNAME -> AndroidContainerType.SUPPORT_FRAGMENT
AndroidConst.VIEW_FQNAME -> AndroidContainerType.VIEW
LAYOUT_CONTAINER_FQNAME -> AndroidContainerType.LAYOUT_CONTAINER
else -> null
}
if (descriptor is LazyJavaClassDescriptor) {
val androidClassType = getClassTypeInternal(DescriptorUtils.getFqName(descriptor).asString())
if (androidClassType != null) return androidClassType
}
else if (descriptor is LazyClassDescriptor) { // For tests (FakeActivity)
val androidClassType = getClassTypeInternal(DescriptorUtils.getFqName(descriptor).toString())
if (androidClassType != null) return androidClassType
}
getClassTypeInternal(DescriptorUtils.getFqName(descriptor).asString())?.let { return it }
for (supertype in descriptor.typeConstructor.supertypes) {
val declarationDescriptor = supertype.constructor.declarationDescriptor
@@ -93,8 +93,7 @@ class AndroidExpressionCodegenExtension : ExpressionCodegenExtension {
return StackValue.functionCall(Type.VOID_TYPE) {}
}
val androidClassType = AndroidContainerType.get(container)
if (androidClassType == AndroidContainerType.UNKNOWN) return null
if (containerOptions.classType == AndroidContainerType.UNKNOWN) return null
return StackValue.functionCall(Type.VOID_TYPE) {
val bytecodeClassName = c.typeMapper.mapType(container).internalName
@@ -248,8 +247,17 @@ class AndroidExpressionCodegenExtension : ExpressionCodegenExtension {
loadId()
iv.invokevirtual(containerOptions.classType.internalClassName, "findViewById", "(I)Landroid/view/View;", false)
}
AndroidContainerType.FRAGMENT, AndroidContainerType.SUPPORT_FRAGMENT -> {
iv.invokevirtual(containerOptions.classType.internalClassName, "getView", "()Landroid/view/View;", false)
AndroidContainerType.FRAGMENT, AndroidContainerType.SUPPORT_FRAGMENT, AndroidContainerType.LAYOUT_CONTAINER -> {
val methodName: String
val targetClassName: String
if (containerOptions.classType == AndroidContainerType.LAYOUT_CONTAINER) {
methodName = "getEntityView"
targetClassName = classType.internalName
} else {
methodName = "getView"
targetClassName = containerOptions.classType.internalClassName
}
iv.invokevirtual(targetClassName, methodName, "()Landroid/view/View;", false)
iv.dup()
val lgetViewNotNull = Label()
iv.ifnonnull(lgetViewNotNull)
@@ -38,6 +38,10 @@ class ResourcePropertyStackValue(
) : StackValue(typeMapper.mapType(resource.returnType!!)) {
private val androidClassType get() = containerOptions.classType
init {
assert(containerOptions.classType != AndroidContainerType.UNKNOWN)
}
override fun putSelector(type: Type, v: InstructionAdapter) {
val returnTypeString = typeMapper.mapType(resource.type.lowerIfFlexible()).className
if (AndroidConst.FRAGMENT_FQNAME == returnTypeString || AndroidConst.SUPPORT_FRAGMENT_FQNAME == returnTypeString) {
@@ -69,6 +73,12 @@ class ResourcePropertyStackValue(
getResourceId(v)
v.invokevirtual("android/view/View", "findViewById", "(I)Landroid/view/View;", false)
}
AndroidContainerType.LAYOUT_CONTAINER -> {
receiver.put(Type.getType("L${androidClassType.internalClassName};"), v)
v.invokevirtual(androidClassType.internalClassName, "getEntityView", "()Landroid/view/View;", false)
getResourceId(v)
v.invokevirtual("android/view/View", "findViewById", "(I)Landroid/view/View;", false)
}
else -> throw IllegalStateException("Invalid Android class type: $androidClassType") // Should never occur
}
}
@@ -22,6 +22,7 @@ import kotlinx.android.extensions.CacheImplementation.*
import kotlinx.android.extensions.ContainerOptions
import org.jetbrains.kotlin.android.synthetic.codegen.AndroidContainerType
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.constants.EnumValue
@@ -35,6 +36,10 @@ class ContainerOptionsProxy(val classType: AndroidContainerType, val cache: Cach
private val DEFAULT_CACHE_IMPL = HASH_MAP
fun get(container: ClassDescriptor): ContainerOptionsProxy {
if (container.kind != ClassKind.CLASS) {
return ContainerOptionsProxy(AndroidContainerType.UNKNOWN, NO_CACHE)
}
val classType = AndroidContainerType.get(container)
val anno = container.annotations.findAnnotation(CONTAINER_OPTIONS_FQNAME)
@@ -42,7 +47,9 @@ class ContainerOptionsProxy(val classType: AndroidContainerType, val cache: Cach
if (anno == null) {
// Java classes (and Kotlin classes from other modules) does not support cache by default
val supportsCache = container.source is KotlinSourceElement && classType.doesSupportCache
return ContainerOptionsProxy(classType, if (supportsCache) DEFAULT_CACHE_IMPL else NO_CACHE)
return ContainerOptionsProxy(
classType,
if (supportsCache) DEFAULT_CACHE_IMPL else NO_CACHE)
}
val cache = anno.getEnumValue(CACHE_NAME, HASH_MAP) { valueOf(it) }
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.android.synthetic.descriptors
import kotlinx.android.extensions.LayoutContainer
import org.jetbrains.kotlin.android.synthetic.AndroidConst
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
@@ -43,56 +44,61 @@ class LazySyntheticElementResolveContext(private val module: ModuleDescriptor, s
val dialogDescriptor = find(AndroidConst.DIALOG_FQNAME) ?: return SyntheticElementResolveContext.ERROR_CONTEXT
val supportActivityDescriptor = find(AndroidConst.SUPPORT_FRAGMENT_ACTIVITY_FQNAME)
val supportFragmentDescriptor = find(AndroidConst.SUPPORT_FRAGMENT_FQNAME)
val layoutContainerDescriptor = find(LayoutContainer::class.java.canonicalName)
return SyntheticElementResolveContext(
viewDescriptor.defaultType,
activityDescriptor.defaultType,
fragmentDescriptor?.defaultType,
dialogDescriptor.defaultType,
supportActivityDescriptor?.defaultType,
supportFragmentDescriptor?.defaultType)
view = viewDescriptor.defaultType,
activity = activityDescriptor.defaultType,
fragment = fragmentDescriptor?.defaultType,
dialog = dialogDescriptor.defaultType,
supportActivity = supportActivityDescriptor?.defaultType,
supportFragment = supportFragmentDescriptor?.defaultType,
layoutContainer = layoutContainerDescriptor?.defaultType)
}
}
internal class SyntheticElementResolveContext(
val viewType: SimpleType,
val activityType: SimpleType,
val fragmentType: SimpleType?,
val dialogType: SimpleType,
val supportActivityType: SimpleType?,
val supportFragmentType: SimpleType?) {
val view: SimpleType,
val activity: SimpleType,
val fragment: SimpleType?,
val dialog: SimpleType,
val supportActivity: SimpleType?,
val supportFragment: SimpleType?,
val layoutContainer: SimpleType?
) {
companion object {
private fun errorType() = ErrorUtils.createErrorType("")
val ERROR_CONTEXT = SyntheticElementResolveContext(errorType(), errorType(), null, errorType(), null, null)
val ERROR_CONTEXT = SyntheticElementResolveContext(errorType(), errorType(), null, errorType(), null, null, null)
}
private val widgetReceivers by lazy {
val receivers = ArrayList<WidgetReceiver>(4)
receivers += WidgetReceiver(activityType, mayHaveCache = true)
receivers += WidgetReceiver(dialogType, mayHaveCache = false)
fragmentType?.let { receivers += WidgetReceiver(it, mayHaveCache = true) }
supportFragmentType?.let { receivers += WidgetReceiver(it, mayHaveCache = true) }
receivers += WidgetReceiver(activity, mayHaveCache = true)
receivers += WidgetReceiver(dialog, mayHaveCache = false)
fragment?.let { receivers += WidgetReceiver(it, mayHaveCache = true) }
supportFragment?.let { receivers += WidgetReceiver(it, mayHaveCache = true) }
layoutContainer?.let { receivers += WidgetReceiver(it, mayHaveCache = true) }
receivers
}
val fragmentTypes: List<Pair<SimpleType, SimpleType>> by lazy {
if (fragmentType == null) {
if (fragment == null) {
emptyList<Pair<SimpleType, SimpleType>>()
}
else {
val types = ArrayList<Pair<SimpleType, SimpleType>>(4)
types += Pair(activityType, fragmentType)
types += Pair(fragmentType, fragmentType)
if (supportActivityType != null && supportFragmentType != null) {
types += Pair(supportFragmentType, supportFragmentType)
types += Pair(supportActivityType, supportFragmentType)
types += Pair(activity, fragment)
types += Pair(fragment, fragment)
if (supportActivity != null && supportFragment != null) {
types += Pair(supportFragment, supportFragment)
types += Pair(supportActivity, supportFragment)
}
types
}
}
fun getWidgetReceivers(forView: Boolean): List<WidgetReceiver> {
if (forView) return listOf(WidgetReceiver(viewType, mayHaveCache = false))
if (forView) return listOf(WidgetReceiver(view, mayHaveCache = true))
return widgetReceivers
}
@@ -79,7 +79,7 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider
// Package with clearFindViewByIdCache()
AndroidConst.SYNTHETIC_SUBPACKAGES.last().let { s ->
val packageDescriptor = PredefinedPackageFragmentDescriptor(s, module, storageManager, packagesToLookupInCompletion) { descriptor ->
lazyContext().getWidgetReceivers(false)
(lazyContext().getWidgetReceivers(false) + lazyContext().getWidgetReceivers(true))
.filter { it.mayHaveCache }
.map { genClearCacheFunction(descriptor, it.type) }
}
@@ -69,7 +69,7 @@ internal fun genPropertyForWidget(
KotlinTypeFactory.simpleNotNullType(
Annotations.EMPTY, classDescriptor, defaultType.constructor.parameters.map(::StarProjectionImpl))
}
} ?: context.viewType
} ?: context.view
return genProperty(resolvedWidget.widget, receiverType, type, packageFragmentDescriptor, sourceEl, resolvedWidget.errorType)
}
@@ -0,0 +1,36 @@
package test
import android.app.Activity
import android.view.View
import android.widget.*
import kotlinx.android.synthetic.main.layout.*
import kotlinx.android.extensions.*
class R {
class id {
companion object {
const val login = 5
}
}
}
class MyEntity(override val containerView: View) : LayoutContainer
class MyActivity(): Activity() {
val loginItem = Button(this)
val entity = MyEntity(object : FrameLayout(this) {
override fun findViewById(id: Int) : View? = when(id) {
R.id.login -> loginItem
else -> null
}
})
public fun box(): String {
return if (entity.login.toString() == "Button") "OK" else ""
}
}
fun box(): String {
return MyActivity().box()
}
@@ -0,0 +1,30 @@
package test
import android.app.Activity
import android.view.View
import android.widget.*
import kotlinx.android.synthetic.main.layout.*
import kotlinx.android.extensions.*
class R {
class id {
companion object {
const val login = 5
}
}
}
class MyEntity(override val containerView: View) : LayoutContainer
class MyActivity(): Activity() {
val loginItem = Button(this)
val entity = MyEntity(loginItem)
init {
entity.login
}
}
fun box(): String {
return "OK"
}
@@ -0,0 +1,33 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-sdk
android:minSdkVersion="18"
android:targetSdkVersion="18" />
<permission android:name="android"></permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.Sample" >
<activity
android:name="com.example.android.basiccontactables.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTop">
<meta-data
android:name="android.app.searchable"
android:resource="@xml/searchable" />
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
@@ -0,0 +1,10 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/login"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</FrameLayout>
@@ -9,13 +9,14 @@ import kotlinx.android.extensions.*
@ContainerOptions(cache = CacheImplementation.HASH_MAP)
class MyView(context: Context) : View(context)
@ContainerOptions(cache = CacheImplementation.NO_CACHE)
class MyActivity : Activity() {
init { MyView(this).login }
}
// 2 public _\$_findCachedViewById
// 1 INVOKEVIRTUAL android/app/Activity\.findViewById
// 2 public _\$_clearFindViewByIdCache
// 1 public _\$_findCachedViewById
// 0 INVOKEVIRTUAL android/app/Activity\.findViewById
// 1 public _\$_clearFindViewByIdCache
// 1 GETSTATIC test/R\$id\.login
// 1 INVOKEVIRTUAL android/view/View\.findViewById
// 0 INVOKEVIRTUAL test/MyActivity\._\$_findCachedViewById
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,15 +20,19 @@ kotlinx.android.synthetic.main.get
public val android.app.Activity.item_detail_container: android.widget.FrameLayout!
public val android.app.Dialog.item_detail_container: android.widget.FrameLayout!
public val android.app.Fragment.item_detail_container: android.widget.FrameLayout!
public val kotlinx.android.extensions.LayoutContainer.item_detail_container: android.widget.FrameLayout!
public val android.app.Activity.login: android.widget.Button!
public val android.app.Dialog.login: android.widget.Button!
public val android.app.Fragment.login: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.login: android.widget.Button!
public val android.app.Activity.password: android.widget.EditText!
public val android.app.Dialog.password: android.widget.EditText!
public val android.app.Fragment.password: android.widget.EditText!
public val kotlinx.android.extensions.LayoutContainer.password: android.widget.EditText!
public val android.app.Activity.textView1: android.widget.TextView!
public val android.app.Dialog.textView1: android.widget.TextView!
public val android.app.Fragment.textView1: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.textView1: android.widget.TextView!
kotlinx.android.synthetic.main.get.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,6 +20,7 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.MyKeyboardView: android.inputmethodservice.KeyboardView!
public val android.app.Dialog.MyKeyboardView: android.inputmethodservice.KeyboardView!
public val android.app.Fragment.MyKeyboardView: android.inputmethodservice.KeyboardView!
public val kotlinx.android.extensions.LayoutContainer.MyKeyboardView: android.inputmethodservice.KeyboardView!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,6 +20,7 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.MyKeyboardView: android.inputmethodservice.KeyboardView!
public val android.app.Dialog.MyKeyboardView: android.inputmethodservice.KeyboardView!
public val android.app.Fragment.MyKeyboardView: android.inputmethodservice.KeyboardView!
public val kotlinx.android.extensions.LayoutContainer.MyKeyboardView: android.inputmethodservice.KeyboardView!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,6 +20,7 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.button: android.view.View!
public val android.app.Dialog.button: android.view.View!
public val android.app.Fragment.button: android.view.View!
public val kotlinx.android.extensions.LayoutContainer.button: android.view.View!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,15 +20,19 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.item_detail_container: android.widget.FrameLayout!
public val android.app.Dialog.item_detail_container: android.widget.FrameLayout!
public val android.app.Fragment.item_detail_container: android.widget.FrameLayout!
public val kotlinx.android.extensions.LayoutContainer.item_detail_container: android.widget.FrameLayout!
public val android.app.Activity.login: android.widget.Button!
public val android.app.Dialog.login: android.widget.Button!
public val android.app.Fragment.login: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.login: android.widget.Button!
public val android.app.Activity.password: android.widget.EditText!
public val android.app.Dialog.password: android.widget.EditText!
public val android.app.Fragment.password: android.widget.EditText!
public val kotlinx.android.extensions.LayoutContainer.password: android.widget.EditText!
public val android.app.Activity.textView1: android.widget.TextView!
public val android.app.Dialog.textView1: android.widget.TextView!
public val android.app.Fragment.textView1: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.textView1: android.widget.TextView!
kotlinx.android.synthetic.main.test.view
@@ -42,15 +48,19 @@ kotlinx.android.synthetic.main.test1
public val android.app.Activity.frameLayout: android.widget.FrameLayout!
public val android.app.Dialog.frameLayout: android.widget.FrameLayout!
public val android.app.Fragment.frameLayout: android.widget.FrameLayout!
public val kotlinx.android.extensions.LayoutContainer.frameLayout: android.widget.FrameLayout!
public val android.app.Activity.loginButton: android.widget.Button!
public val android.app.Dialog.loginButton: android.widget.Button!
public val android.app.Fragment.loginButton: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.loginButton: android.widget.Button!
public val android.app.Activity.passwordCaption: android.widget.EditText!
public val android.app.Dialog.passwordCaption: android.widget.EditText!
public val android.app.Fragment.passwordCaption: android.widget.EditText!
public val kotlinx.android.extensions.LayoutContainer.passwordCaption: android.widget.EditText!
public val android.app.Activity.passwordField: android.widget.TextView!
public val android.app.Dialog.passwordField: android.widget.TextView!
public val android.app.Fragment.passwordField: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.passwordField: android.widget.TextView!
kotlinx.android.synthetic.main.test1.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,9 +20,11 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.textView1: android.view.View!
public val android.app.Dialog.textView1: android.view.View!
public val android.app.Fragment.textView1: android.view.View!
public val kotlinx.android.extensions.LayoutContainer.textView1: android.view.View!
public val android.app.Activity.textView2: android.widget.TextView!
public val android.app.Dialog.textView2: android.widget.TextView!
public val android.app.Fragment.textView2: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.textView2: android.widget.TextView!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,12 +20,15 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.button: android.view.View!
public val android.app.Dialog.button: android.view.View!
public val android.app.Fragment.button: android.view.View!
public val kotlinx.android.extensions.LayoutContainer.button: android.view.View!
public val android.app.Activity.button2: android.widget.Button!
public val android.app.Dialog.button2: android.widget.Button!
public val android.app.Fragment.button2: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.button2: android.widget.Button!
public val android.app.Activity.button3: android.widget.Button!
public val android.app.Dialog.button3: android.widget.Button!
public val android.app.Fragment.button3: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.button3: android.widget.Button!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,15 +20,19 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.item_detail_container: android.widget.FrameLayout!
public val android.app.Dialog.item_detail_container: android.widget.FrameLayout!
public val android.app.Fragment.item_detail_container: android.widget.FrameLayout!
public val kotlinx.android.extensions.LayoutContainer.item_detail_container: android.widget.FrameLayout!
public val android.app.Activity.login: android.widget.Button!
public val android.app.Dialog.login: android.widget.Button!
public val android.app.Fragment.login: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.login: android.widget.Button!
public val android.app.Activity.password: android.widget.EditText!
public val android.app.Dialog.password: android.widget.EditText!
public val android.app.Fragment.password: android.widget.EditText!
public val kotlinx.android.extensions.LayoutContainer.password: android.widget.EditText!
public val android.app.Activity.textView1: android.widget.TextView!
public val android.app.Dialog.textView1: android.widget.TextView!
public val android.app.Fragment.textView1: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.textView1: android.widget.TextView!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -20,12 +22,15 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.`fun`: android.widget.TextView!
public val android.app.Dialog.`fun`: android.widget.TextView!
public val android.app.Fragment.`fun`: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.`fun`: android.widget.TextView!
public val android.app.Activity.includeTag: android.view.View!
public val android.app.Dialog.includeTag: android.view.View!
public val android.app.Fragment.includeTag: android.view.View!
public val kotlinx.android.extensions.LayoutContainer.includeTag: android.view.View!
public val android.app.Activity.set: android.widget.Button!
public val android.app.Dialog.set: android.widget.Button!
public val android.app.Fragment.set: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.set: android.widget.Button!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,15 +20,19 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.item_detail_container: android.widget.FrameLayout!
public val android.app.Dialog.item_detail_container: android.widget.FrameLayout!
public val android.app.Fragment.item_detail_container: android.widget.FrameLayout!
public val kotlinx.android.extensions.LayoutContainer.item_detail_container: android.widget.FrameLayout!
public val android.app.Activity.login: android.widget.Button!
public val android.app.Dialog.login: android.widget.Button!
public val android.app.Fragment.login: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.login: android.widget.Button!
public val android.app.Activity.password: android.widget.EditText!
public val android.app.Dialog.password: android.widget.EditText!
public val android.app.Fragment.password: android.widget.EditText!
public val kotlinx.android.extensions.LayoutContainer.password: android.widget.EditText!
public val android.app.Activity.textView1: android.widget.TextView!
public val android.app.Dialog.textView1: android.widget.TextView!
public val android.app.Fragment.textView1: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.textView1: android.widget.TextView!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -20,12 +22,15 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.`fun`: android.widget.TextView!
public val android.app.Dialog.`fun`: android.widget.TextView!
public val android.app.Fragment.`fun`: android.widget.TextView!
public val kotlinx.android.extensions.LayoutContainer.`fun`: android.widget.TextView!
public val android.app.Activity.includeTag: android.view.View!
public val android.app.Dialog.includeTag: android.view.View!
public val android.app.Fragment.includeTag: android.view.View!
public val kotlinx.android.extensions.LayoutContainer.includeTag: android.view.View!
public val android.app.Activity.set: android.widget.Button!
public val android.app.Dialog.set: android.widget.Button!
public val android.app.Fragment.set: android.widget.Button!
public val kotlinx.android.extensions.LayoutContainer.set: android.widget.Button!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,6 +20,7 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.MyView: android.view.View!
public val android.app.Dialog.MyView: android.view.View!
public val android.app.Fragment.MyView: android.view.View!
public val kotlinx.android.extensions.LayoutContainer.MyView: android.view.View!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,6 +20,7 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.MyKeyboardView: android.view.View!
public val android.app.Dialog.MyKeyboardView: android.view.View!
public val android.app.Fragment.MyKeyboardView: android.view.View!
public val kotlinx.android.extensions.LayoutContainer.MyKeyboardView: android.view.View!
kotlinx.android.synthetic.main.test.view
@@ -8,6 +8,8 @@ kotlinx.android.synthetic
public fun android.app.Activity.clearFindViewByIdCache(): kotlin.Unit
public fun android.app.Fragment.clearFindViewByIdCache(): kotlin.Unit
public fun android.view.View.clearFindViewByIdCache(): kotlin.Unit
public fun kotlinx.android.extensions.LayoutContainer.clearFindViewByIdCache(): kotlin.Unit
kotlinx.android.synthetic.main
@@ -18,6 +20,7 @@ kotlinx.android.synthetic.main.test
public val android.app.Activity.stub: android.view.ViewStub!
public val android.app.Dialog.stub: android.view.ViewStub!
public val android.app.Fragment.stub: android.view.ViewStub!
public val kotlinx.android.extensions.LayoutContainer.stub: android.view.ViewStub!
kotlinx.android.synthetic.main.test.view