package org.develnext.jphp.core.tokenizer.token.stmt;
import org.develnext.jphp.core.compiler.common.ASMExpression;
import org.develnext.jphp.core.tokenizer.TokenType;
import org.develnext.jphp.core.tokenizer.token.Token;
import org.develnext.jphp.core.tokenizer.TokenMeta;
import org.develnext.jphp.core.tokenizer.token.expr.value.YieldExprToken;
import php.runtime.env.Context;
import php.runtime.env.Environment;
import java.util.Arrays;
import java.util.List;
public class ExprStmtToken extends StmtToken {
private List<Token> tokens;
private ExprStmtToken asmExpr;
private boolean isStmtList = true;
private boolean constantly = true;
protected ExprStmtToken(TokenMeta meta) {
super(meta, TokenType.T_J_CUSTOM);
}
public ExprStmtToken(Environment env, Context context, List<Token> tokens){
this(TokenMeta.of(tokens));
setTokens(tokens);
if (!isStmtList() && env != null && context != null) {
updateAsmExpr(env, context);
}
}
public ExprStmtToken(Environment env, Context context,Token... tokens){
this(env, context, Arrays.asList(tokens));
}
public void updateAsmExpr(Environment env, Context context) {
if (!isStmtList()) {
setAsmExpr(new ASMExpression(env, context, this).getResult());
}
}
public List<Token> getTokens() {
return tokens;
}
public void setTokens(List<Token> tokens) {
for (Token el : tokens){
if (el == null) continue;
if (!(el instanceof StmtToken)) {
isStmtList = false;
break;
}
if (el instanceof GotoStmtToken || el instanceof LabelStmtToken) {
constantly = false;
}
}
this.tokens = tokens;
}
public boolean isSingle(){
return tokens.size() == 1;
}
public Token getSingle(){
return tokens.get(0);
}
public Token getLast(){
if (tokens.size() == 0)
return null;
return tokens.get(tokens.size() - 1);
}
public boolean isStmtList() {
return isStmtList;
}
public boolean isConstantly() {
return constantly;
}
public ExprStmtToken getAsmExpr() {
return asmExpr;
}
public void setAsmExpr(ExprStmtToken asmExpr) {
this.asmExpr = asmExpr;
}
}