95 lines
2.4 KiB
Plaintext
95 lines
2.4 KiB
Plaintext
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);
|
|
}
|
|
}
|