// RUN: mlir-tblgen -gen-op-defs -I %S/../../include %s | FileCheck %s

include "mlir/IR/OpBase.td"

def Test_Dialect : Dialect {
  let name = "test";
}
class NS_Op<string mnemonic, list<OpTrait> traits> :
    Op<Test_Dialect, mnemonic, traits>;

def OpA : NS_Op<"one_normal_operand_op", []> {
  let arguments = (ins I32:$input);
}

// CHECK-LABEL: OpA definitions

// CHECK:      OpAAdaptor::OpAAdaptor
// CHECK-SAME: odsOperands(values), odsAttrs(attrs)

// CHECK:      void OpA::build
// CHECK:        ::mlir::Value input
// CHECK:        odsState.addOperands(input);

// CHECK:      void OpA::build
// CHECK:        ::mlir::ValueRange operands
// CHECK:        assert(operands.size() == 1u && "mismatched number of parameters");
// CHECK:        odsState.addOperands(operands);

def OpB : NS_Op<"one_variadic_operand_op", []> {
  let arguments = (ins Variadic<I32>:$input);
}

// CHECK-LABEL: OpB::build
// CHECK:         ::mlir::ValueRange input
// CHECK-NOT:     assert
// CHECK:         odsState.addOperands(input);

def OpD : NS_Op<"mix_variadic_and_normal_inputs_op", [SameVariadicOperandSize]> {
  let arguments = (ins Variadic<AnyTensor>:$input1, AnyTensor:$input2, Variadic<AnyTensor>:$input3);
}

// CHECK-LABEL: ::mlir::ValueRange OpDAdaptor::input1
// CHECK-NEXT:    return getODSOperands(0);

// CHECK-LABEL: ::mlir::Value OpDAdaptor::input2
// CHECK-NEXT:    return *getODSOperands(1).begin();

// CHECK-LABEL: ::mlir::ValueRange OpDAdaptor::input3
// CHECK-NEXT:    return getODSOperands(2);

// CHECK-LABEL: ::mlir::Operation::operand_range OpD::input1
// CHECK-NEXT: return getODSOperands(0);

// CHECK-LABEL: ::mlir::Value OpD::input2
// CHECK-NEXT: return *getODSOperands(1).begin();

// CHECK-LABEL: OpD::build
// CHECK-NEXT: odsState.addOperands(input1);
// CHECK-NEXT: odsState.addOperands(input2);
// CHECK-NEXT: odsState.addOperands(input3);
