//===---------- Matchers.cpp - clang-tidy ---------------------------------===//
//
// 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 "Matchers.h"
#include "ASTUtils.h"

namespace clang::tidy::matchers {

bool NotIdenticalStatementsPredicate::operator()(
    const clang::ast_matchers::internal::BoundNodesMap &Nodes) const {
  return !utils::areStatementsIdentical(Node.get<Stmt>(),
                                        Nodes.getNodeAs<Stmt>(ID), *Context);
}

MatchesAnyListedTypeNameMatcher::MatchesAnyListedTypeNameMatcher(
    llvm::ArrayRef<StringRef> NameList)
    : NameMatchers(NameList.begin(), NameList.end()) {}

MatchesAnyListedTypeNameMatcher::~MatchesAnyListedTypeNameMatcher() = default;

bool MatchesAnyListedTypeNameMatcher::matches(
    const QualType &Node, ast_matchers::internal::ASTMatchFinder *Finder,
    ast_matchers::internal::BoundNodesTreeBuilder *Builder) const {

  if (NameMatchers.empty())
    return false;

  PrintingPolicy PrintingPolicyWithSuppressedTag(
      Finder->getASTContext().getLangOpts());
  PrintingPolicyWithSuppressedTag.PrintCanonicalTypes = true;
  PrintingPolicyWithSuppressedTag.SuppressElaboration = true;
  PrintingPolicyWithSuppressedTag.SuppressScope = false;
  PrintingPolicyWithSuppressedTag.SuppressTagKeyword = true;
  PrintingPolicyWithSuppressedTag.SuppressUnwrittenScope = true;
  std::string TypeName =
      Node.getUnqualifiedType().getAsString(PrintingPolicyWithSuppressedTag);

  return llvm::any_of(NameMatchers, [&TypeName](const llvm::Regex &NM) {
    return NM.isValid() && NM.match(TypeName);
  });
}

} // namespace clang::tidy::matchers
