code: function array (type, stateDefinitions, contractName, location) {
    var arraySize
    var match = type.match(/(.*)\[(.*?)\]( storage ref| storage pointer| memory| calldata)?$/)
    if (!match) {
      console.log('unable to parse type ' + type)
      return null
    }
    if (!location) {
      location = match[3].trim()
    }
    arraySize = match[2] === '' ? 'dynamic' : parseInt(match[2])
    var underlyingType = parseType(match[1], stateDefinitions, contractName, location)
    if (underlyingType === null) {
      console.log('unable to parse type ' + type)
      return null
    }
    return new ArrayType(underlyingType, arraySize, location)
  }
docs: ArrayType decode the given @arg type
  
  @param {String} type - type given by the AST (e.g int256[] storage ref, int256[] storage ref[] storage ref)
  @param {Object} stateDefinitions - all state definitions given by the AST (including struct and enum type declaration) for all contracts
  @param {String} contractName - contract the @args typeName belongs to
  @param {String} location - location of the data (storage ref| storage pointer| memory| calldata)
  @return {Object} returns decoded info about the current type: { storageBytes, typeName, arraySize, subArray}