100 lines
3.3 KiB
Plaintext
100 lines
3.3 KiB
Plaintext
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();
|
|
}
|
|
}
|