diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt index f07d83937a5..3d9eec41a4f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/PropertyReferenceCodegen.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.JetCallableReferenceExpression import org.jetbrains.kotlin.resolve.DescriptorFactory +import org.jetbrains.kotlin.resolve.PropertyImportedFromObject import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny @@ -154,6 +155,10 @@ public class PropertyReferenceCodegen( val fakeCodegen = ExpressionCodegen( this, FrameMap(), OBJECT_TYPE, context.intoFunction(fakeDescriptor), state, this@PropertyReferenceCodegen ) + if (target is PropertyImportedFromObject) { + val containingObject = target.containingObject + StackValue.singleton(containingObject, typeMapper).put(typeMapper.mapClass(containingObject), this) + } val receiver = if (receiverType != null) StackValue.coercion(StackValue.local(1, OBJECT_TYPE), typeMapper.mapType(receiverType)) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt index a1756c5d3e4..bdb7f6b7f0a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/importedFromObject.kt @@ -39,7 +39,7 @@ class FunctionImportedFromObject(val functionFromObject: FunctionDescriptor) : } } -class PropertyImportedFromObject(private val propertyFromObject: PropertyDescriptor) : +class PropertyImportedFromObject(val propertyFromObject: PropertyDescriptor) : PropertyDescriptor by propertyFromObject, ImportedFromObjectCallableDescriptor(propertyFromObject.containingDeclaration as ClassDescriptor) { override fun getDispatchReceiverParameter(): ReceiverParameterDescriptor? = null diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/function/memberImportedFromObject.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/function/memberImportedFromObject.kt new file mode 100644 index 00000000000..56744d67697 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/function/memberImportedFromObject.kt @@ -0,0 +1,17 @@ +import A.foo +import A.bar + +object A { + fun foo() = "O" + fun String.foo() = "K" + + @JvmStatic + fun bar(s: Int) = "OK" +} + +fun box(): String { + val static = (::bar)(0) + if (static != "OK") return "1" + + return (::foo)() + (String::foo)("") +} diff --git a/compiler/testData/codegen/boxWithStdlib/callableReference/property/memberImportedFromObject.kt b/compiler/testData/codegen/boxWithStdlib/callableReference/property/memberImportedFromObject.kt new file mode 100644 index 00000000000..9cd43438f86 --- /dev/null +++ b/compiler/testData/codegen/boxWithStdlib/callableReference/property/memberImportedFromObject.kt @@ -0,0 +1,33 @@ +import A.foo +import A.bar +import A.baz + +object A { + var foo = "NotOk" + var String.foo: String + get() = "K" + set(i) {} + + @JvmStatic + val bar: String = "OK" + + @JvmStatic + val String.baz: String + get() = "OK" +} + +fun box(): String { + + val static = (::bar).get() + if (static != "OK") return static + + val staticExt = (String::baz).get("a") + if (staticExt != "OK") return staticExt + + val nonExt = ::foo + + nonExt.set("O") + val ext = String::foo + ext.set("", "Whatever") + return nonExt.get() + ext.get("") +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java index 2f47ef79962..15ad291fe42 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxWithStdlibCodegenTestGenerated.java @@ -558,6 +558,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("memberImportedFromObject.kt") + public void testMemberImportedFromObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/memberImportedFromObject.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("nestedConstructorFromClass.kt") public void testNestedConstructorFromClass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/function/nestedConstructorFromClass.kt"); @@ -852,6 +858,12 @@ public class BlackBoxWithStdlibCodegenTestGenerated extends AbstractBlackBoxCode doTestWithStdlib(fileName); } + @TestMetadata("memberImportedFromObject.kt") + public void testMemberImportedFromObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/property/memberImportedFromObject.kt"); + doTestWithStdlib(fileName); + } + @TestMetadata("overriddenInSubclass.kt") public void testOverriddenInSubclass() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/boxWithStdlib/callableReference/property/overriddenInSubclass.kt");