slcom/slangc/model/clauses/Variables.sauce

95 lines
2.4 KiB
Plaintext
Raw Permalink Normal View History

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<LocalVariableSlot> slots = new List<LocalVariableSlot>();
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);
}
}