diff options
Diffstat (limited to 'Utilities/ClangTidyModule/OstringstreamUseCmstrcatCheck.cxx')
-rw-r--r-- | Utilities/ClangTidyModule/OstringstreamUseCmstrcatCheck.cxx | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/Utilities/ClangTidyModule/OstringstreamUseCmstrcatCheck.cxx b/Utilities/ClangTidyModule/OstringstreamUseCmstrcatCheck.cxx new file mode 100644 index 0000000000..920fdf3a90 --- /dev/null +++ b/Utilities/ClangTidyModule/OstringstreamUseCmstrcatCheck.cxx @@ -0,0 +1,52 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt 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(unless(elaboratedTypeLoc()), + optionally(hasParent(elaboratedTypeLoc().bind("parentType"))), + loc(qualType( + hasDeclaration(namedDecl(hasName("::std::ostringstream")))))) + .bind("ostringstream"), + this); +} + +void OstringstreamUseCmstrcatCheck::check( + const MatchFinder::MatchResult& Result) +{ + const TypeLoc* ParentTypeNode = + Result.Nodes.getNodeAs<TypeLoc>("parentType"); + const TypeLoc* 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"); + } + } +} +} +} +} |