slcom/slangc/model/ArrayTypeModel.sauce

91 lines
2.0 KiB
Plaintext

package slangc.model;
import slangc.api.Reporter;
public class ArrayTypeModel extends SyntheticTypeModel {
private TypeModel target;
public ArrayTypeModel(TypeModel target) {
super(target.getPackage(), "[]", TypeLevel.ARRAY, target);
this.target = target;
}
@Override
public TypeType getTypeType() {
return TypeType.ARRAY;
}
@Override
public int expand() {
/*
if (existsAtRuntime() && target == null) {
target = targetPackage.getType(targetName);
return 1;
} else {
return 0;
}*/
/*if (target == null) {
return 0;
} else {
return target.expand();
}*/
return 0;
}
@Override
public int resolveTypes() {
//System.out.println("TODO: resolveTypes in " + this.getClass().getName());
return expand();
}
@Override
public void dump(Reporter reporter, String indent, String incr) {
super.dump(reporter, indent, incr);
reporter.note("DUMP", indent + incr + "[element type " + target + "]");
}
@Override
public TypeModel simplify() {
return this;
}
public TypeModel getElementType() {
return target;
}
@Override
public boolean isObjectType() {
// Arrays are generally treated as objects
return true;
}
@Override
public boolean inherits(TypeModel otherType) {
if (otherType == getPackage().getSystem().getDefaultBaseType()) {
return true;
} else {
return false;
}
}
@Override
public MethodModel[] getMethods(String name, boolean includeBase) {
if (includeBase) {
return getPackage().getSystem().getDefaultBaseType().getMethods(name, includeBase);
} else {
return new MethodModel[0];
}
}
@Override
public boolean isAssignableFrom(TypeModel otherType) {
if (super.isAssignableFrom(otherType)) {
return true;
} else if (target.isObjectType() && otherType instanceof ArrayTypeModel) {
return target.isAssignableFrom(((ArrayTypeModel) otherType).target);
} else {
return false;
}
}
}