package railo.transformer.bytecode.statement;
import railo.runtime.exp.TemplateException;
import railo.transformer.bytecode.BytecodeContext;
import railo.transformer.bytecode.BytecodeException;
import railo.transformer.bytecode.Position;
import railo.transformer.bytecode.Statement;
import railo.transformer.bytecode.util.ExpressionUtil;
/**
* A single Statement
*/
public abstract class StatementBase implements Statement {
private Position start;
private Position end;
private Statement parent;
private int hasReturnChild=-1;
/**
* constructor of the class
* @param line
*/
public StatementBase(Position start, Position end) {
this.start=start;
this.end=end;
}
/**
* @see railo.transformer.bytecode.Statement#getParent()
*/
public Statement getParent() {
return parent;
}
/**
* @see railo.transformer.bytecode.Statement#setParent(railo.transformer.bytecode.Statement)
*/
public void setParent(Statement parent) {
this.parent=parent;
if(hasReturnChild!=-1 && parent!=null)
parent.setHasFlowController(hasReturnChild==1);
}
/**
* write out the stament to adapter
* @param adapter
* @throws TemplateException
*/
public final void writeOut(BytecodeContext bc) throws BytecodeException {
ExpressionUtil.visitLine(bc, start);
_writeOut(bc);
ExpressionUtil.visitLine(bc, end);
}
/**
* write out the stament to the adater
* @param adapter
* @throws BytecodeException
*/
public abstract void _writeOut(BytecodeContext bc) throws BytecodeException;
/**
* sets the line value.
* @param line The line to set.
*/
public void setStart(Position start) {
this.start = start;
}
/**
* sets the line value.
* @param line The line to set.
*/
public void setEnd(Position end) {
this.end = end;
}
@Override
public Position getStart() {
return start;
}
@Override
public Position getEnd() {
return end;
}
/**
* @see railo.transformer.bytecode.Statement#getDescendantCount()
*/
public final int getDescendantCount() {
return 0;
}
/**
*
* @see railo.transformer.bytecode.Statement#hasFlowController()
*/
public boolean hasFlowController() {
return hasReturnChild==1;
}
/**
* @param hasReturnChild the hasReturnChild to set
*/
public void setHasFlowController(boolean hasReturnChild) {
if(parent!=null)parent.setHasFlowController(hasReturnChild);
this.hasReturnChild = hasReturnChild?1:0;
}
}