84 lines
2.0 KiB
Plaintext
84 lines
2.0 KiB
Plaintext
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;
|
|
}
|
|
}
|