class AbstractNewArrayExpr implements NewArrayExpr, ConvertToBaf {

  protected Type baseType;
  protected final ValueBox sizeBox;

  protected AbstractNewArrayExpr(Type type, ValueBox sizeBox) {
    this.baseType = type;
    this.sizeBox = sizeBox;
  }

  @Override
  public abstract Object clone();

  @Override
  public boolean equivTo(Object o) {
    if (o instanceof AbstractNewArrayExpr) {
      AbstractNewArrayExpr ae = (AbstractNewArrayExpr) o;
      return this.sizeBox.getValue().equivTo(ae.sizeBox.getValue()) && this.baseType.equals(ae.baseType);
    }
    return false;
  }

  /** Returns a hash code for this object, consistent with structural equality. */
  @Override
  public int equivHashCode() {
    return sizeBox.getValue().equivHashCode() * 101 + baseType.hashCode() * 17;
  }

  @Override
  public String toString() {
    StringBuilder buf = new StringBuilder(Jimple.NEWARRAY + " (");
    buf.append(getBaseTypeString()).append(")[").append(sizeBox.getValue().toString()).append(']');
    return buf.toString();
  }

  @Override
  public void toString(UnitPrinter up) {
    up.literal(Jimple.NEWARRAY + " (");
    up.type(baseType);
    up.literal(")[");
    sizeBox.toString(up);
    up.literal("]");
  }

  private String getBaseTypeString() {
    return baseType.toString();
  }

  @Override
  public Type getBaseType() {
    return baseType;
  }

  @Override
  public void setBaseType(Type type) {
    baseType = type;
  }

  @Override
  public ValueBox getSizeBox() {
    return sizeBox;
  }

  @Override
  public Value getSize() {
    return sizeBox.getValue();
  }

  @Override
  public void setSize(Value size) {
    sizeBox.setValue(size);
  }

  @Override
  public final List<ValueBox> getUseBoxes() {
    List<ValueBox> useBoxes = new ArrayList<ValueBox>(sizeBox.getValue().getUseBoxes());
    useBoxes.add(sizeBox);
    return useBoxes;
  }

  @Override
  public Type getType() {<FILL_FUNCTION_BODY>}

  @Override
  public void apply(Switch sw) {
    ((ExprSwitch) sw).caseNewArrayExpr(this);
  }

  @Override
  public void convertToBaf(JimpleToBafContext context, List<Unit> out) {
    ((ConvertToBaf) getSize()).convertToBaf(context, out);

    Unit u = Baf.v().newNewArrayInst(getBaseType());
    out.add(u);
    u.addAllTagsOf(context.getCurrentUnit());
  }
}

    if (baseType instanceof ArrayType) {
      ArrayType base = (ArrayType) baseType;
      return ArrayType.v(base.baseType, base.numDimensions + 1);
    } else {
      return ArrayType.v(baseType, 1);
    }
  
<no_super_class>