package org.develnext.jphp.core.compiler.jvm.statement.expr.value; import org.develnext.jphp.core.compiler.common.misc.StackItem; import org.develnext.jphp.core.compiler.jvm.statement.ExpressionStmtCompiler; import org.develnext.jphp.core.compiler.jvm.statement.expr.BaseExprCompiler; import org.develnext.jphp.core.tokenizer.token.Token; import org.develnext.jphp.core.tokenizer.token.expr.ValueExprToken; import org.develnext.jphp.core.tokenizer.token.expr.value.StringBuilderExprToken; import org.develnext.jphp.core.tokenizer.token.stmt.ExprStmtToken; import php.runtime.Memory; import php.runtime.memory.BinaryMemory; import java.util.List; public class StringBuilderValueCompiler extends BaseExprCompiler<StringBuilderExprToken> { public StringBuilderValueCompiler(ExpressionStmtCompiler exprCompiler) { super(exprCompiler); } public void writeBuilder(List<Token> tokens) { writeBuilder(tokens, false); } public void writeBuilder(List<Token> tokens, boolean binary) { expr.writePushNewObject(StringBuilder.class); for(Token el : tokens){ //writePushDup(); if (el instanceof ValueExprToken){ expr.writePush((ValueExprToken) el, true, false); } else if (el instanceof ExprStmtToken){ //unexpectedToken(el); expr.writeExpression((ExprStmtToken) el, true, false, true); } else expr.unexpectedToken(el); StackItem.Type peek = expr.stackPeek().type; if (!peek.isConstant()) { expr.writeSysDynamicCall(StringBuilder.class, "append", StringBuilder.class, Object.class); } else expr.writeSysDynamicCall(StringBuilder.class, "append", StringBuilder.class, peek.toClass()); } expr.writeSysDynamicCall(StringBuilder.class, "toString", String.class); if (binary) { expr.writeSysStaticCall(BinaryMemory.class, "valueOf", Memory.class, String.class); } } @Override public void write(StringBuilderExprToken value, boolean returnValue) { writeBuilder(value.getExpression(), value.isBinary()); } }