public ArrayType createArrayType(TType elementType, int dimensions) {
    Assert.isTrue(!elementType.isArrayType());
    Assert.isTrue(!elementType.isAnonymous());
    Assert.isTrue(dimensions > 0);

    int index = dimensions - 1;
    Map arrayTypes = getArrayTypesMap(index);
    ArrayType result = (ArrayType) arrayTypes.get(elementType);
    if (result != null) return result;
    result =
        new ArrayType(
            this, BindingKey.createArrayTypeBindingKey(elementType.getBindingKey(), dimensions));
    arrayTypes.put(elementType, result);
    result.initialize(elementType, dimensions);
    return result;
  }