package slangc.model.clauses; import slang.data.List; import slangc.api.Reporter; import slangc.model.InnerTypeScope; import slangc.model.LocalVariableSlot; import slangc.model.MemberModel; import slangc.model.Named; import slangc.model.StatementOwner; import slangc.model.TypeModel; import slangc.parser.Branch; import slangc.parser.Node; import slangc.parser.NodeType; public class Variables extends ExpressionsOrVariables implements StatementOwner { private TypeModel type; private List slots = new List(); public Variables(StatementOwner owner, Branch source) { super(owner, source); type = owner.resolveType(source.getSubnode(1)); if (type == null) return; Branch l = (Branch) source.getSubnode(2); if (l.getNodeType() == NodeType.NAME || l.getNodeType() == NodeType.INDEXED_NAME) { slots.append(new LocalVariableSlot(this, l, type)); } else { for (int i = 0; i < l.countSubnodes(); i++) { slots.append(new LocalVariableSlot(this, (Branch)l.getSubnode(i), type)); } } } @Override public void dump(Reporter reporter, String indent, String incr) { reporter.note("DUMP", indent + "> Variables:"); // do not recurse: type.dump(reporter, indent + incr, incr); for (int i = 0; i < slots.count(); i++) { slots.get(i).dump(reporter, indent + incr, incr); } } @Override public int resolveExpressions() { int nresolved = 0; for (int i = 0; i < slots.count(); i++) { nresolved += slots.get(i).resolveExpressions(); } return nresolved; } //@Override public TypeModel resolveType(Node subnode) { return getOwner().resolveType(subnode); } //@Override public MemberModel getMethodOrField() { return getOwner().getMethodOrField(); } //@Override public InnerTypeScope getTypeScope() { return getOwner().getTypeScope(); } public boolean hasVariable(String name) { for (int i = 0; i < slots.count(); i++) { if (slots.get(i).getName().equals(name)) { return true; } } return false; } public Named getVariable(String name) { for (int i = 0; i < slots.count(); i++) { if (slots.get(i).getName().equals(name)) { return slots.get(i); } } return null; } public int countVariables() { return slots.count(); } public LocalVariableSlot getVariable(int i) { return slots.get(i); } }