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