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 a665ae8fda9..f35f93c54b6 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 @@ -39,6 +39,7 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassOrAny import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue +import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf import org.jetbrains.org.objectweb.asm.Label import org.jetbrains.org.objectweb.asm.Opcodes.ACC_PRIVATE import org.jetbrains.org.objectweb.asm.Opcodes.ACC_PUBLIC @@ -128,7 +129,23 @@ abstract class AbstractAndroidExtensionsExpressionCodegenExtension : ExpressionC } private fun ResolvedCall<*>.getReceiverDeclarationDescriptor(): ClassifierDescriptor? { - return (extensionReceiver as ReceiverValue).type.constructor.declarationDescriptor + val fromDeclarationSite = resultingDescriptor.extensionReceiverParameter?.type?.constructor?.declarationDescriptor + val fromCallSite = (extensionReceiver as ReceiverValue).type.constructor.declarationDescriptor + + if (fromDeclarationSite == null && fromCallSite == null) + return null + else if (fromDeclarationSite != null && fromCallSite == null) + return fromDeclarationSite + else if (fromDeclarationSite == null && fromCallSite != null) + return fromCallSite + + fromDeclarationSite as ClassifierDescriptor + fromCallSite as ClassifierDescriptor + + return if (fromCallSite.defaultType.isSubtypeOf(fromDeclarationSite.defaultType)) + fromCallSite + else + fromDeclarationSite } override fun generateClassSyntheticParts(codegen: ImplementationBodyCodegen) { diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/kt18545/kt18545.kt b/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/kt18545/kt18545.kt new file mode 100644 index 00000000000..1fbc80d1fb2 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/kt18545/kt18545.kt @@ -0,0 +1,11 @@ +package test + +import android.app.Activity +import android.os.Bundle +import java.io.File +import kotlinx.android.synthetic.main.layout.* + +fun test(obj: Any?) { + obj as Activity + obj.login +} \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/kt18545/res/layout/layout.xml b/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/kt18545/res/layout/layout.xml new file mode 100644 index 00000000000..4d73173b521 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/codegen/bytecodeShape/kt18545/res/layout/layout.xml @@ -0,0 +1,17 @@ + + + + +