package slangc.model.clauses; import slang.data.List; import slangc.api.Reporter; import slangc.model.ClauseModel; import slangc.model.InnerTypeScope; import slangc.model.MemberModel; import slangc.model.Named; import slangc.model.StatementModel; import slangc.model.StatementOwner; import slangc.model.TypeModel; import slangc.model.InnerTypeScope.SourceScope; import slangc.model.statements.VariableStatement; import slangc.parser.Branch; import slangc.parser.Node; import slangc.parser.NodeType; public class SwitchMembers extends ClauseModel implements StatementOwner { private List statements = new List(); private InnerTypeScope.SourceScope typeScope; public SwitchMembers(StatementOwner owner, Branch source) { super(owner, source); for (int i = 0; i < source.countSubnodes(); i++) { if (source.getSubnode(i).getNodeType() != NodeType.SEMICOLON) { statements.append(StatementModel.construct(this, source.getSubnode(i))); } } typeScope = owner.getTypeScope().getInnerScopeForSource(source); } //@Override public InnerTypeScope getTypeScope() { return typeScope == null ? getOwner().getTypeScope() : typeScope; } @Override public void dump(Reporter reporter, String indent, String incr) { reporter.note("DUMP", indent + "> Switch members:"); for (int i = 0; i < statements.count(); i++) { StatementModel s = statements.get(i); s.dump(reporter, indent + incr, incr); } } @Override public int resolveExpressions() { int nresolved = 0; for (int i = 0; i < statements.count(); i++) { StatementModel s = statements.get(i); nresolved += s.resolveExpressions(); } return nresolved; } //@Override public TypeModel resolveType(Node subnode) { return getTypeScope().resolveTypeReference(subnode); } //@Override public MemberModel getMethodOrField() { return getOwner().getMethodOrField(); } @Override public Named lookupSimpleName(String name) { for (int i = 0; i < statements.count(); i++) { StatementModel s = statements.get(i); if (s instanceof VariableStatement) { VariableStatement vs = (VariableStatement) s; if (vs.hasVariable(name)) { return vs.getVariable(name); } } } if (typeScope != null) { if (typeScope.hasInnerType(name)) { return typeScope.getInnerType(name); } } return super.lookupSimpleName(name); } public int countMembers() { return statements.count(); } public StatementModel getMember(int i) { return statements.get(i); } }