//===- TestInterfaces.cpp - Test interface generation and application -----===//
//
// 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 "TestTypes.h"
#include "mlir/Pass/Pass.h"

using namespace mlir;
using namespace test;

namespace {
/// This test checks various aspects of Type interface generation and
/// application.
struct TestTypeInterfaces
    : public PassWrapper<TestTypeInterfaces, OperationPass<ModuleOp>> {
  StringRef getArgument() const final { return "test-type-interfaces"; }
  StringRef getDescription() const final {
    return "Test type interface support.";
  }
  void runOnOperation() override {
    getOperation().walk([](Operation *op) {
      for (Type type : op->getResultTypes()) {
        if (auto testInterface = type.dyn_cast<TestTypeInterface>()) {
          testInterface.printTypeA(op->getLoc());
          testInterface.printTypeB(op->getLoc());
          testInterface.printTypeC(op->getLoc());
          testInterface.printTypeD(op->getLoc());
          // Just check that we can assign the result to a variable of interface
          // type.
          TestTypeInterface result = testInterface.printTypeRet(op->getLoc());
          (void)result;
        }
        if (auto testType = type.dyn_cast<TestType>())
          testType.printTypeE(op->getLoc());
      }
    });
  }
};
} // end anonymous namespace

namespace mlir {
namespace test {
void registerTestInterfaces() { PassRegistration<TestTypeInterfaces>(); }
} // namespace test
} // namespace mlir
