we don't need a separate implementation of plusAssign for strings after all
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user