slcom/slangc/model/LocalVariableSlot.sauce

84 lines
2.0 KiB
Plaintext
Raw Permalink Normal View History

package slangc.model;
import slangc.parser.Branch;
import slangc.parser.Node;
import slangc.parser.NodeType;
public class LocalVariableSlot extends LocalStorageModel implements StorageSlot, ExpressionOwner {
private final StatementOwner owner;
private ExpressionModel initialiser;
public LocalVariableSlot(StatementOwner owner, Branch source, TypeModel type) {
super((MethodModel)owner.getMethodOrField(), ((MethodModel)owner.getMethodOrField()).countLocals(), source, type);
this.owner = owner;
if (source.getNodeType() == NodeType.INITIALISED_SLOT) {
initialiser = ExpressionModel.construct(this, source.getSubnode(source.countSubnodes() - 1));
}
if (owner == null) {
throw new Error("Internal error...");
}
((MethodModel)owner.getMethodOrField()).localAdded(this);
}
@Override
public Node getNameNode() {
return source.getSubnode(0);
}
//@Override
public StorageSlot.Kind getSlotKind() {
return StorageSlot.Kind.LOCAL;
}
public StatementOwner getOwner() {
return owner;
}
public int resolveExpressions() {
if (initialiser != null) {
return initialiser.resolveExpressions();
} else {
return 0;
}
}
//@Override
public InnerTypeScope getTypeScope() {
return owner.getTypeScope();
}
//@Override
public TypeModel resolveType(Node subnode) {
if (owner == null) throw new Error("This shouldn't be null");
return owner.resolveType(subnode);
}
//@Override
public MemberModel getMethodOrField() {
return owner.getMethodOrField();
}
//@Override
public Named lookupSimpleName(String name) {
return owner.lookupSimpleName(name);
}
//@Override
public MethodModel[] lookupSimpleMethod(String name) {
return owner.lookupSimpleMethod(name);
}
//@Override
public TypeModel getExpectedResult(ExpressionModel e) {
return getStorageType();
}
public boolean hasInitialiser() {
return initialiser != null;
}
public ExpressionModel getInitialiser() {
return initialiser;
}
}