//===- Utils.cpp - Transform dialect utilities ----------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "mlir/Dialect/Transform/Utils/Utils.h"

#include "mlir/IR/OpDefinition.h"
#include "mlir/Interfaces/ViewLikeInterface.h"

using namespace mlir;
using namespace mlir::transform;

void mlir::transform::printPackedOrDynamicIndexList(
    OpAsmPrinter &printer, Operation *op, Value packed, Type packedType,
    OperandRange values, TypeRange valueTypes, DenseI64ArrayAttr integers) {
  if (packed) {
    assert(values.empty() && (!integers || integers.empty()) &&
           "expected no values/integers");
    printer << "*(" << packed;
    if (packedType) {
      printer << " : " << packedType;
    }
    printer << ")";
    return;
  }
  printDynamicIndexList(printer, op, values, integers, valueTypes);
}

ParseResult mlir::transform::parsePackedOrDynamicIndexList(
    OpAsmParser &parser, std::optional<OpAsmParser::UnresolvedOperand> &packed,
    Type &packedType, SmallVectorImpl<OpAsmParser::UnresolvedOperand> &values,
    SmallVectorImpl<Type> *valueTypes, DenseI64ArrayAttr &integers) {
  OpAsmParser::UnresolvedOperand packedOperand;
  if (parser.parseOptionalStar().succeeded()) {
    if (parser.parseLParen().failed() ||
        parser.parseOperand(packedOperand).failed())
      return failure();
    if (packedType && (parser.parseColonType(packedType).failed()))
      return failure();
    if (parser.parseRParen().failed())
      return failure();
    packed.emplace(packedOperand);
    integers = parser.getBuilder().getDenseI64ArrayAttr({});
    return success();
  }

  return parseDynamicIndexList(parser, values, integers, valueTypes);
}
