From 99d19a2f27b0273e0472e3e41cf4302a7f904fb6 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Wed, 2 Nov 2011 11:41:23 +0100 Subject: [PATCH] KT-33 --- .../jet/codegen/ExpressionCodegen.java | 30 ++++++++++--------- .../testData/codegen/regressions/kt33.jet | 6 ++++ .../jetbrains/jet/codegen/ArrayGenTest.java | 11 +++++++ 3 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt33.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 559b651abcd..13b47845a66 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1970,23 +1970,25 @@ public class ExpressionCodegen extends JetVisitor { } } else { - final PsiElement declaration = BindingContextUtils.resolveToDeclarationPsiElement(bindingContext, expression); - assert declaration != null : "No declaration found for " + expression.getText(); - final CallableMethod accessor; - if (declaration instanceof PsiMethod) { - accessor = typeMapper.mapToCallableMethod((PsiMethod) declaration); - } - else if (declaration instanceof JetNamedFunction) { - accessor = typeMapper.mapToCallableMethod((JetNamedFunction) declaration, null); + DeclarationDescriptor operationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression); + CallableMethod accessor = typeMapper.mapToCallableMethod((FunctionDescriptor) operationDescriptor, OwnerKind.IMPLEMENTATION); + + boolean isGetter = accessor.getSignature().getName().equals("get"); + + if(isGetter) { + FunctionDescriptor setterDescriptor = bindingContext.get(BindingContext.INDEXED_LVALUE_SET, expression); + return StackValue.collectionElement( + accessor.getSignature().getReturnType(), + accessor, + setterDescriptor != null ? typeMapper.mapToCallableMethod(setterDescriptor, OwnerKind.IMPLEMENTATION) : null); } else { - throw new UnsupportedOperationException("unknown accessor type: " + declaration); + FunctionDescriptor getterDescriptor = bindingContext.get(BindingContext.INDEXED_LVALUE_GET, expression); + return StackValue.collectionElement( + accessor.getSignature().getArgumentTypes()[1], + getterDescriptor != null ? typeMapper.mapToCallableMethod(getterDescriptor, OwnerKind.IMPLEMENTATION) : null, + accessor); } - boolean isGetter = accessor.getSignature().getName().equals("get"); - return StackValue.collectionElement( - isGetter ? accessor.getSignature().getReturnType() : accessor.getSignature().getArgumentTypes()[1], - isGetter ? accessor : null, - isGetter ? null : accessor); } } diff --git a/compiler/testData/codegen/regressions/kt33.jet b/compiler/testData/codegen/regressions/kt33.jet new file mode 100644 index 00000000000..59cf1415c72 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt33.jet @@ -0,0 +1,6 @@ +fun box () : String { + val s = java.util.ArrayList() + s.add("foo") + s[0] += "bar" + return if(s[0] == "foobar") "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index 76d4f93928c..6628d1d6358 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -96,4 +96,15 @@ public class ArrayGenTest extends CodegenTestCase { Method foo = generateFunction(); foo.invoke(null); } + + public void testCollectionPlusAssign () throws Exception { + blackBoxFile("regressions/kt33.jet"); + } + + public void testArrayPlusAssign () throws Exception { + loadText("fun box() : Int { val s = IntArray(1); s [0] = 5; s[0] += 7; return s[0] }"); + System.out.println(generateToText()); + Method foo = generateFunction(); + assertTrue((Integer)foo.invoke(null) == 12); + } }