package org.develnext.jphp.core.compiler.jvm.statement;
import org.objectweb.asm.Label;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.LineNumberNode;
import org.objectweb.asm.tree.MethodNode;
import php.runtime.common.Messages;
import org.develnext.jphp.core.compiler.jvm.JvmCompiler;
import php.runtime.exceptions.ParseException;
import php.runtime.exceptions.support.ErrorType;
import php.runtime.reflection.support.Entity;
import org.develnext.jphp.core.tokenizer.TokenType;
import org.develnext.jphp.core.tokenizer.token.Token;
abstract public class StmtCompiler<T extends Entity> {
protected final JvmCompiler compiler;
protected T entity;
public StmtCompiler(JvmCompiler compiler){
this.compiler = compiler;
}
abstract public T compile();
public JvmCompiler getCompiler() {
return compiler;
}
public LabelNode writeLabel(MethodNode mv, int lineNumber){
LabelNode node = new LabelNode(new Label());
mv.instructions.add(node);
if (lineNumber != -1)
mv.instructions.add(new LineNumberNode(lineNumber, node));
return node;
}
public LabelNode writeLabel(MethodNode mv){
return writeLabel(mv, -1);
}
public T getEntity() {
return entity;
}
/**
* @throws ParseException
* @param token
*/
public void unexpectedToken(Token token){
Object unexpected = token.getWord();
if (token.getType() == TokenType.T_J_CUSTOM)
unexpected = token.getWord();
compiler.getEnvironment().error(
token.toTraceInfo(compiler.getContext()),
ErrorType.E_PARSE,
Messages.ERR_PARSE_UNEXPECTED_X,
unexpected
);
}
protected void unexpectedToken(Token token, Object expected){
Object unexpected = token.getWord();
if (token.getType() == TokenType.T_J_CUSTOM)
unexpected = token.getWord();
compiler.getEnvironment().error(
token.toTraceInfo(compiler.getContext()),
ErrorType.E_PARSE,
Messages.ERR_PARSE_UNEXPECTED_X_EXPECTED_Y,
unexpected, expected
);
}
}