package slangc.model.clauses; import slangc.api.Reporter; import slangc.model.ClauseModel; import slangc.model.InnerTypeScope; import slangc.model.LocalVariableSlot; import slangc.model.MemberModel; import slangc.model.MethodModel; import slangc.model.Named; import slangc.model.StatementModel; import slangc.model.StatementOwner; import slangc.model.TypeModel; import slangc.parser.Branch; import slangc.parser.Node; public class CatchClause extends ClauseModel implements StatementOwner { private Variables variables; private StatementModel innerStatement; public CatchClause(StatementOwner owner, Branch source) { super(owner, source); // TODO: Handle catch parameter... //sourceFile.annotate(ErrorType.INTERNAL_ERROR, "TODO: Finish catch clause"); variables = (Variables) ClauseModel.construct(this, ((Branch)((Branch)source.getSubnode(1)).getSubnode(1)).getSubnode(0)); innerStatement = StatementModel.construct(this, source.getSubnode(2)); } @Override public void dump(Reporter reporter, String indent, String incr) { reporter.note("DUMP", indent + "> Catch:"); variables.dump(reporter, indent + incr, incr); innerStatement.dump(reporter, indent + incr, incr); } @Override public int resolveExpressions() { return variables.resolveExpressions() + innerStatement.resolveExpressions(); } //@Override public TypeModel resolveType(Node subnode) { return getOwner().resolveType(subnode); } //@Override public MemberModel getMethodOrField() { return getOwner().getMethodOrField(); } //@Override public InnerTypeScope getTypeScope() { return getOwner().getTypeScope(); } @Override public Named lookupSimpleName(String name) { if (variables.hasVariable(name)) { return variables.getVariable(name); } return super.lookupSimpleName(name); } public StatementModel getInnerStatement() { return innerStatement; } public LocalVariableSlot getCatchVariable() { return variables.getVariable(0); } public TypeModel getCatchType() { return variables.getVariable(0).getStorageType(); } }