Ver código fonte

clang-tidy module: add check for boolean parameters

Co-Authored-by: Kyle Edwards <[email protected]>
Sean Orner 3 anos atrás
pai
commit
eab8e38961

+ 2 - 0
Utilities/ClangTidyModule/CMakeLists.txt

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

+ 3 - 0
Utilities/ClangTidyModule/Module.cxx

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

+ 1 - 0
Utilities/ClangTidyModule/Tests/CMakeLists.txt

@@ -12,3 +12,4 @@ endfunction()
 
 add_run_clang_tidy_test(cmake-use-cmstrlen)
 add_run_clang_tidy_test(cmake-use-cmsys-fstream)
+add_run_clang_tidy_test(cmake-use-bespoke-enum-class)

+ 18 - 0
Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class-stdout.txt

@@ -0,0 +1,18 @@
+cmake-use-bespoke-enum-class.cxx:3:16: warning: use a bespoke enum class instead of booleans as parameters [cmake-use-bespoke-enum-class]
+bool function1(bool i)
+               ^
+cmake-use-bespoke-enum-class.cxx:8:15: warning: use a bespoke enum class instead of booleans as parameters [cmake-use-bespoke-enum-class]
+int function2(bool i)
+              ^
+cmake-use-bespoke-enum-class.cxx:13:16: warning: use a bespoke enum class instead of booleans as parameters [cmake-use-bespoke-enum-class]
+char function3(bool i)
+               ^
+cmake-use-bespoke-enum-class.cxx:18:16: warning: use a bespoke enum class instead of booleans as parameters [cmake-use-bespoke-enum-class]
+void function4(bool i)
+               ^
+cmake-use-bespoke-enum-class.cxx:22:17: warning: use a bespoke enum class instead of booleans as parameters [cmake-use-bespoke-enum-class]
+float function5(bool i)
+                ^
+cmake-use-bespoke-enum-class.cxx:27:18: warning: use a bespoke enum class instead of booleans as parameters [cmake-use-bespoke-enum-class]
+double function6(bool i)
+                 ^

+ 63 - 0
Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class.cxx

@@ -0,0 +1,63 @@
+// Correction needed
+
+bool function1(bool i)
+{
+  return true;
+}
+
+int function2(bool i)
+{
+  return 0;
+}
+
+char function3(bool i)
+{
+  return 'a';
+}
+
+void function4(bool i)
+{
+}
+
+float function5(bool i)
+{
+  return 1.0;
+}
+
+double function6(bool i)
+{
+  return 0;
+}
+
+// No correction needed
+bool global;
+
+bool function7(int i)
+{
+  bool l;
+  return true;
+}
+
+int function8(int i)
+{
+  return i;
+}
+
+char function9(char i)
+{
+  return i;
+}
+
+void function10()
+{
+}
+
+float function11(float i)
+{
+  return i;
+}
+
+double function12(double i)
+{
+  return i;
+}

+ 35 - 0
Utilities/ClangTidyModule/UseBespokeEnumClassCheck.cxx

@@ -0,0 +1,35 @@
+/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+   file Copyright.txt or https://cmake.org/licensing for details.  */
+#include "UseBespokeEnumClassCheck.h"
+
+#include <clang/AST/Type.h>
+#include <clang/ASTMatchers/ASTMatchFinder.h>
+
+namespace clang {
+namespace tidy {
+namespace cmake {
+using namespace ast_matchers;
+
+UseBespokeEnumClassCheck::UseBespokeEnumClassCheck(StringRef Name,
+                                                   ClangTidyContext* Context)
+  : ClangTidyCheck(Name, Context)
+{
+}
+
+void UseBespokeEnumClassCheck::registerMatchers(MatchFinder* Finder)
+{
+  Finder->addMatcher(
+    parmVarDecl(
+      hasTypeLoc(typeLoc(loc(qualType(asString("_Bool")))).bind("type"))),
+    this);
+}
+
+void UseBespokeEnumClassCheck::check(const MatchFinder::MatchResult& Result)
+{
+  const TypeLoc* Node = Result.Nodes.getNodeAs<TypeLoc>("type");
+  this->diag(Node->getBeginLoc(),
+             "use a bespoke enum class instead of booleans as parameters");
+}
+}
+}
+}

+ 21 - 0
Utilities/ClangTidyModule/UseBespokeEnumClassCheck.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 UseBespokeEnumClassCheck : public ClangTidyCheck
+{
+public:
+  UseBespokeEnumClassCheck(StringRef Name, ClangTidyContext* Context);
+  void registerMatchers(ast_matchers::MatchFinder* Finder) override;
+
+  void check(const ast_matchers::MatchFinder::MatchResult& Result) override;
+};
+}
+}
+}