/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#include "OstringstreamUseCmstrcatCheck.h"

#include <clang/AST/Type.h>
#include <clang/ASTMatchers/ASTMatchFinder.h>

namespace clang {
namespace tidy {
namespace cmake {
using namespace ast_matchers;

OstringstreamUseCmstrcatCheck::OstringstreamUseCmstrcatCheck(
  StringRef Name, ClangTidyContext* Context)
  : ClangTidyCheck(Name, Context)
{
}

void OstringstreamUseCmstrcatCheck::registerMatchers(MatchFinder* Finder)
{
  Finder->addMatcher(typeLoc(loc(qualType(hasDeclaration(
                               namedDecl(hasName("::std::ostringstream"))))))
                       .bind("ostringstream"),
                     this);
}

void OstringstreamUseCmstrcatCheck::check(
  MatchFinder::MatchResult const& Result)
{
  TypeLoc const* ParentTypeNode =
    Result.Nodes.getNodeAs<TypeLoc>("parentType");
  TypeLoc const* RootNode = Result.Nodes.getNodeAs<TypeLoc>("ostringstream");

  if (ParentTypeNode != nullptr) {
    if (ParentTypeNode->getBeginLoc().isValid()) {
      this->diag(ParentTypeNode->getBeginLoc(),
                 "use strings and cmStrCat() instead of std::ostringstream");
    }

  } else if (RootNode != nullptr) {
    if (RootNode->getBeginLoc().isValid()) {
      this->diag(RootNode->getBeginLoc(),
                 "use strings and cmStrCat() instead of std::ostringstream");
    }
  }
}
}
}
}
