From 628f5a5232c5eaa96ca3d7bad0dfa918caf35711 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Wed, 31 Aug 2011 15:53:54 +0200 Subject: [PATCH] added test for KT-238 --- .../jet/codegen/ExpressionCodegen.java | 8 ++- .../org/jetbrains/jet/codegen/StackValue.java | 1 + idea/testData/codegen/regressions/kt238.jet | 58 +++++++++++++++++++ .../jet/codegen/ArrayGetTestCase.java | 7 +++ .../jet/codegen/CodegenTestCase.java | 6 +- 5 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 idea/testData/codegen/regressions/kt238.jet create mode 100644 idea/tests/org/jetbrains/jet/codegen/ArrayGetTestCase.java diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 121099053bd..7217beb58a5 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1262,7 +1262,7 @@ public class ExpressionCodegen extends JetVisitor { private StackValue generateAssignmentExpression(JetBinaryExpression expression) { StackValue stackValue = gen(expression.getLeft()); - genToJVMStack(expression.getRight()); + gen(expression.getRight(), stackValue.type); stackValue.store(v); return StackValue.none(); } @@ -1507,8 +1507,10 @@ public class ExpressionCodegen extends JetVisitor { throw new UnsupportedOperationException("unknown accessor type"); } boolean isGetter = accessor.getSignature().getName().equals("get"); - return StackValue.collectionElement(JetTypeMapper.TYPE_OBJECT, isGetter ? accessor : null, - isGetter ? null : accessor); + return StackValue.collectionElement( + isGetter ? accessor.getSignature().getReturnType() : accessor.getSignature().getArgumentTypes()[1], + isGetter ? accessor : null, + isGetter ? null : accessor); } } diff --git a/idea/src/org/jetbrains/jet/codegen/StackValue.java b/idea/src/org/jetbrains/jet/codegen/StackValue.java index 6ddb6eff631..17248b5c6f0 100644 --- a/idea/src/org/jetbrains/jet/codegen/StackValue.java +++ b/idea/src/org/jetbrains/jet/codegen/StackValue.java @@ -422,6 +422,7 @@ public abstract class StackValue { throw new UnsupportedOperationException("no getter specified"); } getter.invoke(v); + coerce(type, v); } @Override diff --git a/idea/testData/codegen/regressions/kt238.jet b/idea/testData/codegen/regressions/kt238.jet new file mode 100644 index 00000000000..d890c1aea61 --- /dev/null +++ b/idea/testData/codegen/regressions/kt238.jet @@ -0,0 +1,58 @@ +fun t1 () { + val a1 = Array(1) + a1[0] = "0" //ok + val s = a1[0] //ok +} + +fun t2 () { + val a2 = Array(1) + a2[0] = 0 //ok + var i = a2[0] //ok +} + +fun t3 () { + val a3 = Array(1) + a3[0] = 0 //verify error + var j = a3[0] //ok + var k : Int = a3[0] ?: 5 //ok +} + +fun t4 () { + val b1 = StrangeIntArray(10) + b1[4] = 5 //ok + var i = b1[1] //ok +} + +fun t5 () { + val b2 = StrangeArray(10, 0) + b2.set(4, 5) //ok + b2[4] = 5 //verify error + var i = b2.get(2) //ok + i = b2[1] //verify error +} + +fun t6() { + val b3 = StrangeArray(10, 0) + b3.set(5, 6) //ok + b3[4] = 5 //verify error + val v = b3[1] //ok +} + +fun box() : String { + return "OK" +} + +class StrangeArray(size: Int, private var defaultValue: T) { + fun get(index: Int): T = defaultValue + fun set(index: Int, v: T) { + defaultValue = v + } +} + +class StrangeIntArray(size: Int) { + private var defaultValue = 0 + fun get(index: Int): Int = defaultValue + fun set(index: Int, v: Int) { + defaultValue = v + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/codegen/ArrayGetTestCase.java b/idea/tests/org/jetbrains/jet/codegen/ArrayGetTestCase.java new file mode 100644 index 00000000000..689dfc6294b --- /dev/null +++ b/idea/tests/org/jetbrains/jet/codegen/ArrayGetTestCase.java @@ -0,0 +1,7 @@ +package org.jetbrains.jet.codegen; + +public class ArrayGetTestCase extends CodegenTestCase { + public void testKt238 () throws Exception { + blackBoxFile("regressions/kt238.jet"); + } +} diff --git a/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java index 54d0a7947c9..b9ac1380d91 100644 --- a/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java +++ b/idea/tests/org/jetbrains/jet/codegen/CodegenTestCase.java @@ -89,9 +89,9 @@ public abstract class CodegenTestCase extends LightCodeInsightFixtureTestCase { final JetNamespace namespace = jetFile.getRootNamespace(); String fqName = NamespaceCodegen.getJVMClassName(namespace.getFQName()).replace("/", "."); Class namespaceClass = loader.loadClass(fqName); - Method method = namespaceClass.getMethod("box"); - return (String) method.invoke(null); - } + Method method = namespaceClass.getMethod("box"); + return (String) method.invoke(null); + } protected String generateToText() { GenerationState state = new GenerationState(getProject(), true);