diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index d4140c3c47d..f0609efca0f 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -725,7 +725,8 @@ public class ExpressionCodegen extends JetVisitor { if (receiver == StackValue.none()) { receiver = generateThisOrOuter((ClassDescriptor) propertyDescriptor.getContainingDeclaration()); } - receiver.put(JetTypeMapper.TYPE_OBJECT, v); + JetType receiverType = bindingContext.get(BindingContext.EXPRESSION_TYPE, r); + receiver.put(receiverType != null ? typeMapper.mapType(receiverType) : JetTypeMapper.TYPE_OBJECT, v); } return iValue; } @@ -772,7 +773,8 @@ public class ExpressionCodegen extends JetVisitor { public StackValue intermediateValueForProperty(PropertyDescriptor propertyDescriptor, final boolean forceField, boolean forceInterface) { DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration(); boolean isStatic = containingDeclaration instanceof NamespaceDescriptorImpl; - propertyDescriptor = propertyDescriptor.getOriginal(); + while(propertyDescriptor != propertyDescriptor.getOriginal()) + propertyDescriptor = propertyDescriptor.getOriginal(); final JetType outType = propertyDescriptor.getOutType(); boolean isInsideClass = !forceInterface && containingDeclaration == contextType(); Method getter; @@ -797,7 +799,7 @@ public class ExpressionCodegen extends JetVisitor { isInterface = !(containingDeclaration instanceof ClassDescriptor && ((ClassDescriptor) containingDeclaration).isObject()); } - return StackValue.property(propertyDescriptor.getName(), owner, typeMapper.mapType(outType), isStatic, isInterface, getter, setter); + return StackValue.property(propertyDescriptor.getName(), owner, typeMapper.mapType(propertyDescriptor.getOutType()), isStatic, isInterface, getter, setter); } @Override diff --git a/idea/testData/codegen/regressions/kt257.jet b/idea/testData/codegen/regressions/kt257.jet new file mode 100644 index 00000000000..3a965795a2c --- /dev/null +++ b/idea/testData/codegen/regressions/kt257.jet @@ -0,0 +1,20 @@ +class A(var t: T) {} +class B(val r: R) {} + +fun box() : String { + val ai = A(1) + val aai = A>(ai) + if(aai.t.t != 1) return "fail" + + aai.t.t = 2 + if(aai.t.t != 2) return "fail" + + if(ai.t != 2) return "fail" + if(aai.t != ai) return "fail" + if(aai.t !== ai) return "fail" + + val abi = A>(B(1)) + if(abi.t.r != 1) return "fail" + + return "OK" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java b/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java index 28ab6b95901..f6621b37e98 100644 --- a/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java @@ -130,4 +130,8 @@ public class PropertyGenTest extends CodegenTestCase { final Class aClass = loadClass("Foo", codegens); assertNotNull(aClass.getMethod("getX")); } + + public void testKt257 () throws Exception { + blackBoxFile("regressions/kt257.jet"); + } }