Ver código fonte

clang-tidy module: add check for ostringstream

Joe Blaauboer 2 anos atrás
pai
commit
04638e7358

+ 2 - 0
Utilities/ClangTidyModule/CMakeLists.txt

@@ -14,6 +14,8 @@ find_package(Clang REQUIRED)
 add_library(cmake-clang-tidy-module MODULE
   Module.cxx
 
+  OstringstreamUseCmstrcatCheck.cxx
+  OstringstreamUseCmstrcatCheck.h
   UseBespokeEnumClassCheck.cxx
   UseBespokeEnumClassCheck.h
   UseCmstrlenCheck.cxx

+ 3 - 0
Utilities/ClangTidyModule/Module.cxx

@@ -3,6 +3,7 @@
 #include <clang-tidy/ClangTidyModule.h>
 #include <clang-tidy/ClangTidyModuleRegistry.h>
 
+#include "OstringstreamUseCmstrcatCheck.h"
 #include "UseBespokeEnumClassCheck.h"
 #include "UseCmstrlenCheck.h"
 #include "UseCmsysFstreamCheck.h"
@@ -20,6 +21,8 @@ public:
       "cmake-use-cmsys-fstream");
     CheckFactories.registerCheck<UseBespokeEnumClassCheck>(
       "cmake-use-bespoke-enum-class");
+    CheckFactories.registerCheck<OstringstreamUseCmstrcatCheck>(
+      "cmake-ostringstream-use-cmstrcat");
   }
 };
 

+ 52 - 0
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");
+    }
+  }
+}
+}
+}
+}

+ 21 - 0
Utilities/ClangTidyModule/OstringstreamUseCmstrcatCheck.h

@@ -0,0 +1,21 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#pragma once
+
+#include <clang-tidy/ClangTidyCheck.h>
+#include <clang/ASTMatchers/ASTMatchFinder.h>
+
+namespace clang {
+namespace tidy {
+namespace cmake {
+class OstringstreamUseCmstrcatCheck : public ClangTidyCheck
+{
+public:
+  OstringstreamUseCmstrcatCheck(StringRef Name, ClangTidyContext* Context);
+  void registerMatchers(ast_matchers::MatchFinder* Finder) override;
+
+  void check(const ast_matchers::MatchFinder::MatchResult& Result) override;
+};
+}
+}
+}