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
|
val length : Int
|
||||||
|
|
||||||
fun plus(other : Any?) : String
|
fun plus(other : Any?) : String
|
||||||
fun plusAssign(other: Any?): String
|
|
||||||
|
|
||||||
fun equals(other : Any?) : Boolean
|
fun equals(other : Any?) : Boolean
|
||||||
fun equalsIgnoreCase(other: String?) : Boolean
|
fun equalsIgnoreCase(other: String?) : Boolean
|
||||||
|
|||||||
@@ -1268,14 +1268,8 @@ public class ExpressionCodegen extends JetVisitor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (callable instanceof IntrinsicMethod) {
|
final boolean keepReturnValue = !((FunctionDescriptor) op).getReturnType().equals(JetStandardClasses.getUnitType());
|
||||||
final IntrinsicMethod intrinsic = (IntrinsicMethod) callable;
|
callAugAssignMethod(expression, (CallableMethod) callable, lhsType, keepReturnValue);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,13 @@ public class Concat implements IntrinsicMethod {
|
|||||||
@Override
|
@Override
|
||||||
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, boolean haveReceiver) {
|
public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List<JetExpression> arguments, boolean haveReceiver) {
|
||||||
codegen.generateStringBuilderConstructor();
|
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));
|
codegen.invokeAppend(arguments.get(1));
|
||||||
v.invokevirtual(ExpressionCodegen.CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;");
|
v.invokevirtual(ExpressionCodegen.CLASS_STRING_BUILDER, "toString", "()Ljava/lang/String;");
|
||||||
return StackValue.onStack(Type.getObjectType("java/lang/String"));
|
return StackValue.onStack(Type.getObjectType("java/lang/String"));
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ public class IntrinsicMethods {
|
|||||||
declareIntrinsicFunction("Boolean", "not", 0, new Not());
|
declareIntrinsicFunction("Boolean", "not", 0, new Not());
|
||||||
|
|
||||||
declareIntrinsicFunction("String", "plus", 1, new Concat());
|
declareIntrinsicFunction("String", "plus", 1, new Concat());
|
||||||
declareIntrinsicFunction("String", "plusAssign", 1, new PlusConcat());
|
|
||||||
|
|
||||||
declareIntrinsicStringMethods();
|
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