slcom/slangc/model/StatementModel.sauce

100 lines
3.3 KiB
Plaintext
Raw Permalink Normal View History

package slangc.model;
import slangc.api.BytecodeInstructionWriter;
import slangc.api.Reporter;
import slangc.model.statements.*;
import slangc.parser.Branch;
import slangc.parser.Node;
import slangc.parser.NodeType;
public abstract class StatementModel extends StatementOrExpression {
private StatementOwner owner;
private Node source;
public StatementModel(StatementOwner owner, Node source) {
this.owner = owner;
this.source = source;
}
public StatementOwner getOwner() {
return owner;
}
public Node getSource() {
return source;
}
public static StatementModel construct(StatementOwner owner, Node source) {
switch (source.getNodeType()) {
case NodeType.VARIABLE_STATEMENT:
return new VariableStatement(owner, (Branch)source);
case NodeType.RETURN_NOTHING_STATEMENT:
return new ReturnNothingStatement(owner, (Branch)source);
case NodeType.RETURN_EXPRESSION_STATEMENT:
return new ReturnExpressionStatement(owner, (Branch)source);
case NodeType.EXPRESSION_STATEMENT:
return new ExpressionStatement(owner, (Branch)source);
case NodeType.TRY_STATEMENT:
return new TryStatement(owner, (Branch)source);
case NodeType.THROW_STATEMENT:
return new ThrowStatement(owner, (Branch)source);
case NodeType.ASSERT_STATEMENT:
return new AssertStatement(owner, (Branch)source);
case NodeType.BLOCK_STATEMENT:
return new BlockStatement(owner, (Branch)source);
case NodeType.IF_STATEMENT:
return new IfStatement(owner, (Branch)source);
case NodeType.WHILE_STATEMENT:
return new WhileStatement(owner, (Branch)source);
case NodeType.DO_WHILE_STATEMENT:
return new DoWhileStatement(owner, (Branch) source);
case NodeType.BREAK_STATEMENT:
return new BreakStatement(owner, (Branch) source);
case NodeType.CONTINUE_STATEMENT:
return new ContinueStatement(owner, (Branch) source);
case NodeType.FOR_STATEMENT:
return new ForStatement(owner, (Branch) source);
case NodeType.SWITCH_STATEMENT:
return new SwitchStatement(owner, (Branch) source);
case NodeType.CASE_LABEL:
return new CaseLabelStatement(owner, (Branch)source);
case NodeType.DEFAULT_LABEL:
return new DefaultLabelStatement(owner, (Branch)source);
case NodeType.SYNCHRONIZED_STATEMENT:
return new SynchronizedStatement(owner, (Branch) source);
case NodeType.SEMICOLON:
return new EmptyStatement(owner, (Branch) source);
case NodeType.CLASS_DECLARATION:
case NodeType.INTERFACE_DECLARATION:
case NodeType.ENUM_DECLARATION:
case NodeType.ATTRIBUTE_DECLARATION:
return new TypeDeclarationStatement(owner, (Branch) source);
default:
return new UnrecognisedStatement(owner, source);
}
}
public void dump(Reporter reporter, String indent, String incr) {
reporter.note("DUMP", indent + incr + "TODO: dump " + Type.of(this));
}
public Named lookupSimpleName(String name) {
return getOwner().lookupSimpleName(name);
}
public MethodModel[] lookupSimpleMethod(String name) {
return getOwner().lookupSimpleMethod(name);
}
@Override
public abstract int resolveExpressions();
public abstract void innerGenerate(BytecodeInstructionWriter w);
public final void generate(BytecodeInstructionWriter w) {
w.pushSource(getSource());
innerGenerate(w);
w.popSource();
}
}