slcom/slangc/model/clauses/SwitchMembers.sauce

96 lines
2.6 KiB
Plaintext
Raw Permalink Normal View History

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<StatementModel> statements = new List<StatementModel>();
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);
}
}