96 lines
2.6 KiB
Plaintext
96 lines
2.6 KiB
Plaintext
|
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);
|
||
|
}
|
||
|
}
|