we don't need a separate implementation of plusAssign for strings after all

This commit is contained in:
Dmitry Jemerov
2011-07-15 14:05:02 +02:00
parent bf5a525748
commit 10d6e584ff
5 changed files with 9 additions and 41 deletions
-1
View File
@@ -78,7 +78,6 @@ class String() : Comparable<String> {
val length : Int
fun plus(other : Any?) : String
fun plusAssign(other: Any?): String
fun equals(other : Any?) : Boolean
fun equalsIgnoreCase(other: String?) : Boolean
@@ -1268,14 +1268,8 @@ public class ExpressionCodegen extends JetVisitor {
}
}
else {
if (callable instanceof IntrinsicMethod) {
final IntrinsicMethod intrinsic = (IntrinsicMethod) callable;
intrinsic.generate(this, v, Type.VOID_TYPE, expression, Arrays.asList(lhs, expression.getRight()), false);
}
else {
final boolean keepReturnValue = !((FunctionDescriptor) op).getReturnType().equals(JetStandardClasses.getUnitType());
callAugAssignMethod(expression, (CallableMethod) callable, lhsType, keepReturnValue);
}
final boolean keepReturnValue = !((FunctionDescriptor) op).getReturnType().equals(JetStandardClasses.getUnitType());
callAugAssignMethod(expression, (CallableMethod) callable, lhsType, keepReturnValue);
}
}
@@ -16,7 +16,13 @@ public class Concat implements IntrinsicMethod {
@Override
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, boolean haveReceiver) {
codegen.generateStringBuilderConstructor();
codegen.invokeAppend(arguments.get(0));
if (haveReceiver) {
v.swap();
codegen.invokeAppendMethod(codegen.expressionType(arguments.get(0)));
}
else {
codegen.invokeAppend(arguments.get(0));
}
codegen.invokeAppend(arguments.get(1));
v.invokevirtual(ExpressionCodegen.CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;");
return StackValue.onStack(Type.getObjectType("java/lang/String"));
@@ -66,7 +66,6 @@ public class IntrinsicMethods {
declareIntrinsicFunction("Boolean", "not", 0, new Not());
declareIntrinsicFunction("String", "plus", 1, new Concat());
declareIntrinsicFunction("String", "plusAssign", 1, new PlusConcat());
declareIntrinsicStringMethods();
}
@@ -1,30 +0,0 @@
package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.psi.JetExpression;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.InstructionAdapter;
import java.util.List;
/**
* @author yole
*/
public class PlusConcat implements IntrinsicMethod {
@Override
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, boolean haveReceiver) {
final JetExpression lhs = arguments.get(0);
final Type lhsType = codegen.expressionType(lhs);
codegen.generateStringBuilderConstructor(); // StringBuilder
StackValue value = codegen.generateIntermediateValue(lhs); // StringBuilder receiver
value.dupReceiver(v, 1); // receiver StringBuilder receiver
value.put(lhsType, v); // receiver StringBuilder value
codegen.invokeAppendMethod(lhsType); // receiver StringBuilder
codegen.invokeAppend(arguments.get(1)); // receiver StringBuilder
v.invokevirtual(ExpressionCodegen.CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;");
value.store(v);
return null;
}
}