From eab8e38961ac621f05eb4ca4fb826ac705056d3c Mon Sep 17 00:00:00 2001 From: Sean Orner Date: Fri, 4 Nov 2022 15:57:11 -0400 Subject: clang-tidy module: add check for boolean parameters Co-Authored-by: Kyle Edwards --- Utilities/ClangTidyModule/CMakeLists.txt | 2 + Utilities/ClangTidyModule/Module.cxx | 3 ++ Utilities/ClangTidyModule/Tests/CMakeLists.txt | 1 + .../Tests/cmake-use-bespoke-enum-class-stdout.txt | 18 +++++++ .../Tests/cmake-use-bespoke-enum-class.cxx | 63 ++++++++++++++++++++++ .../ClangTidyModule/UseBespokeEnumClassCheck.cxx | 35 ++++++++++++ .../ClangTidyModule/UseBespokeEnumClassCheck.h | 21 ++++++++ 7 files changed, 143 insertions(+) create mode 100644 Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class-stdout.txt create mode 100644 Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class.cxx create mode 100644 Utilities/ClangTidyModule/UseBespokeEnumClassCheck.cxx create mode 100644 Utilities/ClangTidyModule/UseBespokeEnumClassCheck.h (limited to 'Utilities') diff --git a/Utilities/ClangTidyModule/CMakeLists.txt b/Utilities/ClangTidyModule/CMakeLists.txt index 51603aa32a..8e7b2bc5d2 100644 --- a/Utilities/ClangTidyModule/CMakeLists.txt +++ b/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 diff --git a/Utilities/ClangTidyModule/Module.cxx b/Utilities/ClangTidyModule/Module.cxx index a9d344ff4a..ca9a81201a 100644 --- a/Utilities/ClangTidyModule/Module.cxx +++ b/Utilities/ClangTidyModule/Module.cxx @@ -3,6 +3,7 @@ #include #include +#include "UseBespokeEnumClassCheck.h" #include "UseCmstrlenCheck.h" #include "UseCmsysFstreamCheck.h" @@ -17,6 +18,8 @@ public: CheckFactories.registerCheck("cmake-use-cmstrlen"); CheckFactories.registerCheck( "cmake-use-cmsys-fstream"); + CheckFactories.registerCheck( + "cmake-use-bespoke-enum-class"); } }; diff --git a/Utilities/ClangTidyModule/Tests/CMakeLists.txt b/Utilities/ClangTidyModule/Tests/CMakeLists.txt index a66eaa8d3e..2fedfa1fd2 100644 --- a/Utilities/ClangTidyModule/Tests/CMakeLists.txt +++ b/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) diff --git a/Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class-stdout.txt b/Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class-stdout.txt new file mode 100644 index 0000000000..5e0acddc66 --- /dev/null +++ b/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) + ^ diff --git a/Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class.cxx b/Utilities/ClangTidyModule/Tests/cmake-use-bespoke-enum-class.cxx new file mode 100644 index 0000000000..2913e6a2d6 --- /dev/null +++ b/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; +} diff --git a/Utilities/ClangTidyModule/UseBespokeEnumClassCheck.cxx b/Utilities/ClangTidyModule/UseBespokeEnumClassCheck.cxx new file mode 100644 index 0000000000..26f3749374 --- /dev/null +++ b/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 +#include + +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("type"); + this->diag(Node->getBeginLoc(), + "use a bespoke enum class instead of booleans as parameters"); +} +} +} +} diff --git a/Utilities/ClangTidyModule/UseBespokeEnumClassCheck.h b/Utilities/ClangTidyModule/UseBespokeEnumClassCheck.h new file mode 100644 index 0000000000..be76db037e --- /dev/null +++ b/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 +#include + +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; +}; +} +} +} -- cgit v1.2.1