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; } }