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 43b085ce7d0..6887dc3680e 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 @@ -52,6 +52,7 @@ import com.intellij.openapi.vfs.impl.* import com.intellij.openapi.vfs.* import kotlin.properties.* import com.intellij.psi.impl.* +import org.jetbrains.kotlin.types.Flexibility public abstract class AndroidUIXmlProcessor(protected val project: Project) { @@ -91,7 +92,7 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { val commonFiles = if (generateCommonFiles) { val clearCacheFile = renderLayoutFile("kotlinx.android.synthetic") {} + renderClearCacheFunction("Activity") + renderClearCacheFunction("Fragment") - listOf(clearCacheFile) + listOf(clearCacheFile, FLEXIBLE_TYPE_FILE) } else listOf() return resourceManager.getLayoutXmlFiles().flatMap { file -> @@ -131,7 +132,7 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { } private fun KotlinStringWriter.writeAndroidImports() { - androidImports.forEach { writeImport(it) } + ANDROID_IMPORTS.forEach { writeImport(it) } writeEmptyLine() } @@ -141,9 +142,10 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { private fun KotlinStringWriter.writeSyntheticProperty(receiver: String, widget: AndroidWidget, stubCall: String) { val body = arrayListOf("return $stubCall as ${widget.className}") + val type = widget.className writeImmutableExtensionProperty(receiver, name = widget.id, - retType = widget.className, + retType = "$EXPLICIT_FLEXIBLE_CLASS_NAME<$type, $type?>", getterBody = body) } @@ -154,11 +156,17 @@ public abstract class AndroidUIXmlProcessor(protected val project: Project) { } class object { - private val androidImports = listOf( + private val EXPLICIT_FLEXIBLE_PACKAGE = Flexibility.FLEXIBLE_TYPE_CLASSIFIER.getPackageFqName().asString() + private val EXPLICIT_FLEXIBLE_CLASS_NAME = Flexibility.FLEXIBLE_TYPE_CLASSIFIER.getRelativeClassName().asString() + + private val ANDROID_IMPORTS = listOf( "android.app.Activity", "android.app.Fragment", "android.view.View", - "android.widget.*") + "android.widget.*", + Flexibility.FLEXIBLE_TYPE_CLASSIFIER.asSingleFqName().asString()) + + private val FLEXIBLE_TYPE_FILE = "package $EXPLICIT_FLEXIBLE_PACKAGE\n\nclass $EXPLICIT_FLEXIBLE_CLASS_NAME" } } \ No newline at end of file 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 6f303b90ac9..408aed95d87 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 @@ -4,10 +4,11 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val Activity.MyButton: org.my.cool.Button +val Activity.MyButton: ft get() = findViewById(0) as org.my.cool.Button -val Fragment.MyButton: org.my.cool.Button +val Fragment.MyButton: ft get() = getView().findViewById(0) as org.my.cool.Button diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt index c47d6a88d51..a208b38d2e6 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInAttr/layout1.kt @@ -4,7 +4,8 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val View.MyButton: org.my.cool.Button +val View.MyButton: ft get() = 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 6f303b90ac9..408aed95d87 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 @@ -4,10 +4,11 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val Activity.MyButton: org.my.cool.Button +val Activity.MyButton: ft get() = findViewById(0) as org.my.cool.Button -val Fragment.MyButton: org.my.cool.Button +val Fragment.MyButton: ft get() = getView().findViewById(0) as org.my.cool.Button diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt index c47d6a88d51..a208b38d2e6 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/fqNameInTag/layout1.kt @@ -4,7 +4,8 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val View.MyButton: org.my.cool.Button +val View.MyButton: ft get() = 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 354d78b29f0..ad6834680d0 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 @@ -4,28 +4,29 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val Activity.item_detail_container: FrameLayout +val Activity.item_detail_container: ft get() = findViewById(0) as FrameLayout -val Fragment.item_detail_container: FrameLayout +val Fragment.item_detail_container: ft get() = getView().findViewById(0) as FrameLayout -val Activity.textView1: TextView +val Activity.textView1: ft get() = findViewById(0) as TextView -val Fragment.textView1: TextView +val Fragment.textView1: ft get() = getView().findViewById(0) as TextView -val Activity.password: EditText +val Activity.password: ft get() = findViewById(0) as EditText -val Fragment.password: EditText +val Fragment.password: ft get() = getView().findViewById(0) as EditText -val Activity.login: Button +val Activity.login: ft get() = findViewById(0) as Button -val Fragment.login: Button +val Fragment.login: ft 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 4b61ee6a807..f9f44be50b9 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 @@ -4,16 +4,17 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val View.item_detail_container: FrameLayout +val View.item_detail_container: ft get() = findViewById(0) as FrameLayout -val View.textView1: TextView +val View.textView1: ft get() = findViewById(0) as TextView -val View.password: EditText +val View.password: ft get() = findViewById(0) as EditText -val View.login: Button +val View.login: ft get() = findViewById(0) as Button diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt index a32a827099f..6eaee9ebe6c 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout2.kt @@ -4,28 +4,29 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val Activity.frameLayout: FrameLayout +val Activity.frameLayout: ft get() = findViewById(0) as FrameLayout -val Fragment.frameLayout: FrameLayout +val Fragment.frameLayout: ft get() = getView().findViewById(0) as FrameLayout -val Activity.passwordField: TextView +val Activity.passwordField: ft get() = findViewById(0) as TextView -val Fragment.passwordField: TextView +val Fragment.passwordField: ft get() = getView().findViewById(0) as TextView -val Activity.passwordCaption: EditText +val Activity.passwordCaption: ft get() = findViewById(0) as EditText -val Fragment.passwordCaption: EditText +val Fragment.passwordCaption: ft get() = getView().findViewById(0) as EditText -val Activity.loginButton: Button +val Activity.loginButton: ft get() = findViewById(0) as Button -val Fragment.loginButton: Button +val Fragment.loginButton: ft get() = getView().findViewById(0) as Button diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt index 071c81699c4..1ebaca425c0 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/multiFile/layout3.kt @@ -4,16 +4,17 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val View.frameLayout: FrameLayout +val View.frameLayout: ft get() = findViewById(0) as FrameLayout -val View.passwordField: TextView +val View.passwordField: ft get() = findViewById(0) as TextView -val View.passwordCaption: EditText +val View.passwordCaption: ft get() = findViewById(0) as EditText -val View.loginButton: Button +val View.loginButton: ft get() = 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 354d78b29f0..ad6834680d0 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 @@ -4,28 +4,29 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val Activity.item_detail_container: FrameLayout +val Activity.item_detail_container: ft get() = findViewById(0) as FrameLayout -val Fragment.item_detail_container: FrameLayout +val Fragment.item_detail_container: ft get() = getView().findViewById(0) as FrameLayout -val Activity.textView1: TextView +val Activity.textView1: ft get() = findViewById(0) as TextView -val Fragment.textView1: TextView +val Fragment.textView1: ft get() = getView().findViewById(0) as TextView -val Activity.password: EditText +val Activity.password: ft get() = findViewById(0) as EditText -val Fragment.password: EditText +val Fragment.password: ft get() = getView().findViewById(0) as EditText -val Activity.login: Button +val Activity.login: ft get() = findViewById(0) as Button -val Fragment.login: Button +val Fragment.login: ft get() = getView().findViewById(0) as Button diff --git a/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt index 4b61ee6a807..f9f44be50b9 100644 --- a/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt +++ b/plugins/android-compiler-plugin/testData/android/converter/simple/singleFile/layout1.kt @@ -4,16 +4,17 @@ import android.app.Activity import android.app.Fragment import android.view.View import android.widget.* +import kotlin.internal.flexible.ft -val View.item_detail_container: FrameLayout +val View.item_detail_container: ft get() = findViewById(0) as FrameLayout -val View.textView1: TextView +val View.textView1: ft get() = findViewById(0) as TextView -val View.password: EditText +val View.password: ft get() = findViewById(0) as EditText -val View.login: Button +val View.login: ft get() = findViewById(0) as Button