diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java index 8e18bca4ad3..e52ca807130 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ExpressionCodegen.java @@ -1705,7 +1705,7 @@ public class ExpressionCodegen extends KtVisitor impleme Collection codegenExtensions = ExpressionCodegenExtension.Companion.getInstances(state.getProject()); if (!codegenExtensions.isEmpty() && resolvedCall != null) { - ExpressionCodegenExtension.Context context = new ExpressionCodegenExtension.Context(typeMapper, v); + ExpressionCodegenExtension.Context context = new ExpressionCodegenExtension.Context(this, typeMapper, v); KotlinType returnType = propertyDescriptor.getReturnType(); for (ExpressionCodegenExtension extension : codegenExtensions) { if (returnType != null) { @@ -2141,7 +2141,7 @@ public class ExpressionCodegen extends KtVisitor impleme Collection codegenExtensions = ExpressionCodegenExtension.Companion.getInstances(state.getProject()); if (!codegenExtensions.isEmpty()) { - ExpressionCodegenExtension.Context context = new ExpressionCodegenExtension.Context(typeMapper, v); + ExpressionCodegenExtension.Context context = new ExpressionCodegenExtension.Context(this, typeMapper, v); for (ExpressionCodegenExtension extension : codegenExtensions) { StackValue stackValue = extension.applyFunction(receiver, resolvedCall, context); if (stackValue != null) return stackValue; diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt index 984a83f5686..b6a9148a036 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/extensions/ExpressionCodegenExtension.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.codegen.extensions +import org.jetbrains.kotlin.codegen.ExpressionCodegen import org.jetbrains.kotlin.codegen.ImplementationBodyCodegen import org.jetbrains.kotlin.codegen.StackValue import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper @@ -28,6 +29,7 @@ interface ExpressionCodegenExtension { "org.jetbrains.kotlin.expressionCodegenExtension", ExpressionCodegenExtension::class.java) class Context( + val codegen: ExpressionCodegen, val typeMapper: KotlinTypeMapper, val v: InstructionAdapter ) diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt index f35f93c54b6..6b01174a210 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/synthetic/codegen/AbstractAndroidExtensionsExpressionCodegenExtension.kt @@ -103,11 +103,12 @@ abstract class AbstractAndroidExtensionsExpressionCodegenExtension : ExpressionC } if (containerOptions.containerType == AndroidContainerType.UNKNOWN) return null + val actualReceiver = StackValue.receiver(resolvedCall, receiver, c.codegen, null) return StackValue.functionCall(Type.VOID_TYPE) { val bytecodeClassName = c.typeMapper.mapType(container).internalName - receiver.put(c.typeMapper.mapType(container), it) + actualReceiver.put(c.typeMapper.mapType(container), it) it.invokevirtual(bytecodeClassName, CLEAR_CACHE_METHOD_NAME, "()V", false) } } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/fragment/0.kt b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/fragment/0.kt index d4de3895e92..036e3ba7565 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/fragment/0.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/fragment/0.kt @@ -7,6 +7,7 @@ import android.view.View import android.widget.* import org.my.cool.MyButton import kotlinx.android.synthetic.main.layout.* +import kotlinx.android.synthetic.clearFindViewByIdCache class R { class id { @@ -36,7 +37,9 @@ class MyFragment(): Fragment() { override fun getView(): View = baseView public fun box(): String { - return if (login.toString() == "MyButton") "OK" else "" + val result = if (login.toString() == "MyButton") "OK" else "" + clearFindViewByIdCache() + return result } } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/singleFile/0.kt b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/singleFile/0.kt index 0c8fdc01bbe..94107f19a03 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/singleFile/0.kt +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/android/singleFile/0.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.view.View import android.widget.* import kotlinx.android.synthetic.main.layout.* +import kotlinx.android.synthetic.clearFindViewByIdCache class R { class id { @@ -32,11 +33,15 @@ class MyActivity(): Activity() { } } - public fun box(): String{ - return if (textView1.toString() == "TextView" && - password.toString() == "EditText" && - login.toString() == "Button") - "OK" else "" + public fun box(): String { + val result = when { + textView1.toString() == "TextView" && password.toString() == "EditText" && login.toString() == "Button" -> "OK" + else -> "" + } + + clearFindViewByIdCache() + + return result } }