call overloaded *Assign methods for augmented assignment
This commit is contained in:
@@ -1288,9 +1288,20 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
intrinsic.generate(this, v, Type.VOID_TYPE, expression, Arrays.asList(lhs, expression.getRight()), false);
|
intrinsic.generate(this, v, Type.VOID_TYPE, expression, Arrays.asList(lhs, expression.getRight()), false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
throw new UnsupportedOperationException("TODO");
|
CallableMethod method = (CallableMethod) callable;
|
||||||
|
FunctionDescriptor fd = (FunctionDescriptor) op;
|
||||||
|
StackValue value = generateIntermediateValue(lhs);
|
||||||
|
final boolean keepReturnValue = !fd.getReturnType().equals(JetStandardClasses.getUnitType());
|
||||||
|
if (keepReturnValue) {
|
||||||
|
value.dupReceiver(v, 0);
|
||||||
|
}
|
||||||
|
value.put(lhsType, v);
|
||||||
|
genToJVMStack(expression.getRight());
|
||||||
|
method.invoke(v);
|
||||||
|
if (keepReturnValue) {
|
||||||
|
value.store(v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class ArrayWrapper<T>() {
|
||||||
|
val contents = ArrayList<T>()
|
||||||
|
|
||||||
|
fun add(item: T) {
|
||||||
|
contents.add(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun plusAssign(rhs: ArrayWrapper<T>) {
|
||||||
|
contents.addAll(rhs.contents)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(index: Int): T {
|
||||||
|
return contents.get(index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val v1 = ArrayWrapper<String>()
|
||||||
|
val v2 = ArrayWrapper<String>()
|
||||||
|
v1.add("foo")
|
||||||
|
v2.add("bar")
|
||||||
|
v1 += v2
|
||||||
|
return if (v1.contents.size() == 2) "OK" else "fail"
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
import java.util.*
|
||||||
|
|
||||||
|
class ArrayWrapper<T>() {
|
||||||
|
val contents = ArrayList<T>()
|
||||||
|
|
||||||
|
fun add(item: T) {
|
||||||
|
contents.add(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun plusAssign(rhs: ArrayWrapper<T>): ArrayWrapper<T> {
|
||||||
|
val result = ArrayWrapper<T>()
|
||||||
|
result.contents.addAll(contents)
|
||||||
|
result.contents.addAll(rhs.contents)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
fun get(index: Int): T {
|
||||||
|
return contents.get(index)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val v1 = ArrayWrapper<String>()
|
||||||
|
val v2 = ArrayWrapper<String>()
|
||||||
|
v1.add("foo")
|
||||||
|
val v3 = v1
|
||||||
|
v2.add("bar")
|
||||||
|
v1 += v2
|
||||||
|
return if (v1.contents.size() == 2 && v3.contents.size() == 1) "OK" else "fail"
|
||||||
|
}
|
||||||
@@ -140,6 +140,14 @@ public class ClassGenTest extends CodegenTestCase {
|
|||||||
blackBoxFile("classes/overloadUnaryOperator.jet");
|
blackBoxFile("classes/overloadUnaryOperator.jet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testOverloadPlusAssign() throws Exception {
|
||||||
|
blackBoxFile("classes/overloadPlusAssign.jet");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testOverloadPlusAssignReturn() throws Exception {
|
||||||
|
blackBoxFile("classes/overloadPlusAssignReturn.jet");
|
||||||
|
}
|
||||||
|
|
||||||
public void testEnumClass() throws Exception {
|
public void testEnumClass() throws Exception {
|
||||||
loadText("enum class Direction { NORTH; SOUTH; EAST; WEST }");
|
loadText("enum class Direction { NORTH; SOUTH; EAST; WEST }");
|
||||||
final Class direction = loadAllClasses(generateClassesInFile()).get("Direction");
|
final Class direction = loadAllClasses(generateClassesInFile()).get("Direction");
|
||||||
|
|||||||
Reference in New Issue
Block a user