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);
|
||||
}
|
||||
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");
|
||||
}
|
||||
|
||||
public void testOverloadPlusAssign() throws Exception {
|
||||
blackBoxFile("classes/overloadPlusAssign.jet");
|
||||
}
|
||||
|
||||
public void testOverloadPlusAssignReturn() throws Exception {
|
||||
blackBoxFile("classes/overloadPlusAssignReturn.jet");
|
||||
}
|
||||
|
||||
public void testEnumClass() throws Exception {
|
||||
loadText("enum class Direction { NORTH; SOUTH; EAST; WEST }");
|
||||
final Class direction = loadAllClasses(generateClassesInFile()).get("Direction");
|
||||
|
||||
Reference in New Issue
Block a user