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(); } }