Author: alexfh Date: Mon Oct 13 07:46:22 2014 New Revision: 219611 URL: http://llvm.org/viewvc/llvm-project?rev=219611&view=rev Log: [clang-tidy] misc-braces-around-statements.ShortStatementLines option
Add option ShortStatementLines to trigger this check only if the statement spans over at least a given number of lines. Modifications from the original patch: merged test/clang-tidy/misc-braces-around-statements-always.cpp into test/clang-tidy/misc-braces-around-statements.cpp and removed unnecessary CHECK-NOTs from the tests. http://reviews.llvm.org/D5642 Patch by Marek Kurdej! Added: clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-few-lines.cpp clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-same-line.cpp clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-single-line.cpp Modified: clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.cpp clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.h clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements.cpp Modified: clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.cpp?rev=219611&r1=219610&r2=219611&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.cpp Mon Oct 13 07:46:22 2014 @@ -110,6 +110,17 @@ SourceLocation findEndLocation(SourceLoc } // namespace +BracesAroundStatementsCheck::BracesAroundStatementsCheck( + StringRef Name, ClangTidyContext *Context) + : ClangTidyCheck(Name, Context), + // Always add braces by default. + ShortStatementLines(Options.get("ShortStatementLines", 0U)) {} + +void +BracesAroundStatementsCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { + Options.store(Opts, "ShortStatementLines", ShortStatementLines); +} + void BracesAroundStatementsCheck::registerMatchers(MatchFinder *Finder) { Finder->addMatcher(ifStmt().bind("if"), this); Finder->addMatcher(whileStmt().bind("while"), this); @@ -206,11 +217,6 @@ BracesAroundStatementsCheck::checkStmt(c if (S->getLocStart().isMacroID()) return; - // TODO: Add an option to insert braces if: - // * the body doesn't fit on the same line with the control statement - // * the body takes more than one line - // * always. - const SourceManager &SM = *Result.SourceManager; const ASTContext *Context = Result.Context; @@ -230,6 +236,16 @@ BracesAroundStatementsCheck::checkStmt(c } assert(StartLoc.isValid()); + assert(EndLoc.isValid()); + // Don't require braces for statements spanning less than certain number of + // lines. + if (ShortStatementLines) { + unsigned StartLine = SM.getSpellingLineNumber(StartLoc); + unsigned EndLine = SM.getSpellingLineNumber(EndLoc); + if (EndLine - StartLine < ShortStatementLines) + return; + } + auto Diag = diag(StartLoc, "statement should be inside braces"); Diag << FixItHint::CreateInsertion(StartLoc, " {") << FixItHint::CreateInsertion(EndLoc, ClosingInsertion); Modified: clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.h?rev=219611&r1=219610&r2=219611&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.h (original) +++ clang-tools-extra/trunk/clang-tidy/misc/BracesAroundStatementsCheck.h Mon Oct 13 07:46:22 2014 @@ -15,10 +15,29 @@ namespace clang { namespace tidy { +/// \brief Checks that bodies of 'if' statements and loops ('for', 'range-for', +/// 'do-while', and 'while') are inside braces +/// +/// Before: +/// if (condition) +/// statement; +/// +/// After: +/// if (condition) { +/// statement; +/// } +/// +/// Additionally, one can define an option `ShortStatementLines` defining the +/// minimal number of lines that the statement should have in order to trigger +/// this check. +/// The number of lines is counted from the end of condition or initial keyword +/// (do/else) until the last line of the inner statement. +/// Default value 0 means that braces will be added to all statements (not +/// having them already). class BracesAroundStatementsCheck : public ClangTidyCheck { public: - BracesAroundStatementsCheck(StringRef Name, ClangTidyContext *Context) - : ClangTidyCheck(Name, Context) {} + BracesAroundStatementsCheck(StringRef Name, ClangTidyContext *Context); + void storeOptions(ClangTidyOptions::OptionMap &Opts) override; void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; @@ -29,6 +48,9 @@ private: template <typename IfOrWhileStmt> SourceLocation findRParenLoc(const IfOrWhileStmt *S, const SourceManager &SM, const ASTContext *Context); + +private: + const unsigned ShortStatementLines; }; } // namespace tidy Added: clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-few-lines.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-few-lines.cpp?rev=219611&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-few-lines.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-few-lines.cpp Mon Oct 13 07:46:22 2014 @@ -0,0 +1,31 @@ +// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-braces-around-statements %t -config="{CheckOptions: [{key: misc-braces-around-statements.ShortStatementLines, value: 4}]}" -- +// REQUIRES: shell + +void do_something(const char *) {} + +bool cond(const char *) { + return false; +} + +void test() { + if (cond("if1") /*comment*/) do_something("same-line"); + + if (cond("if2")) + do_something("single-line"); + + if (cond("if3") /*comment*/) + // some comment + do_something("three" + "lines"); + + if (cond("if4") /*comment*/) + // some comment + do_something("many" + "many" + "many" + "many" + "lines"); + // CHECK-MESSAGES: :[[@LINE-7]]:31: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if4") /*comment*/) { + // CHECK-FIXES: } +} Added: clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-same-line.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-same-line.cpp?rev=219611&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-same-line.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-same-line.cpp Mon Oct 13 07:46:22 2014 @@ -0,0 +1,37 @@ +// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-braces-around-statements %t -config="{CheckOptions: [{key: misc-braces-around-statements.ShortStatementLines, value: 1}]}" -- +// REQUIRES: shell + +void do_something(const char *) {} + +bool cond(const char *) { + return false; +} + +void test() { + if (cond("if1") /*comment*/) do_something("same-line"); + + if (cond("if2")) + do_something("single-line"); + // CHECK-MESSAGES: :[[@LINE-2]]:19: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if2")) { + // CHECK-FIXES: } + + if (cond("if3") /*comment*/) + // some comment + do_something("three" + "lines"); + // CHECK-MESSAGES: :[[@LINE-4]]:31: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if3") /*comment*/) { + // CHECK-FIXES: } + + if (cond("if4") /*comment*/) + // some comment + do_something("many" + "many" + "many" + "many" + "lines"); + // CHECK-MESSAGES: :[[@LINE-7]]:31: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if4") /*comment*/) { + // CHECK-FIXES: } +} Added: clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-single-line.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-single-line.cpp?rev=219611&view=auto ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-single-line.cpp (added) +++ clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements-single-line.cpp Mon Oct 13 07:46:22 2014 @@ -0,0 +1,34 @@ +// RUN: $(dirname %s)/check_clang_tidy_fix.sh %s misc-braces-around-statements %t -config="{CheckOptions: [{key: misc-braces-around-statements.ShortStatementLines, value: 2}]}" -- +// REQUIRES: shell + +void do_something(const char *) {} + +bool cond(const char *) { + return false; +} + +void test() { + if (cond("if1") /*comment*/) do_something("same-line"); + + if (cond("if2")) + do_something("single-line"); + + if (cond("if3") /*comment*/) + // some comment + do_something("three" + "lines"); + // CHECK-MESSAGES: :[[@LINE-4]]:31: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if3") /*comment*/) { + // CHECK-FIXES: } + + if (cond("if4") /*comment*/) + // some comment + do_something("many" + "many" + "many" + "many" + "lines"); + // CHECK-MESSAGES: :[[@LINE-7]]:31: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if4") /*comment*/) { + // CHECK-FIXES: } +} Modified: clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements.cpp?rev=219611&r1=219610&r2=219611&view=diff ============================================================================== --- clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements.cpp (original) +++ clang-tools-extra/trunk/test/clang-tidy/misc-braces-around-statements.cpp Mon Oct 13 07:46:22 2014 @@ -11,8 +11,17 @@ bool cond(const char *) { #define EMPTY_MACRO_FUN() void test() { - // CHECK-NOT: warning - // if + if (cond("if0") /*comment*/) do_something("same-line"); + // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if0") /*comment*/) { do_something("same-line"); + // CHECK-FIXES: } + + if (cond("if0.1")) + do_something("single-line"); + // CHECK-MESSAGES: :[[@LINE-2]]:21: warning: statement should be inside braces + // CHECK-FIXES: if (cond("if0.1")) { + // CHECK-FIXES: } + if (cond("if1") /*comment*/) // some comment do_something("if1"); @@ -28,7 +37,6 @@ void test() { // CHECK-FIXES: if (cond("if3")) { // CHECK-FIXES: } - // if-else if (cond("if-else1")) do_something("if-else1"); // CHECK-MESSAGES: :[[@LINE-2]]:24: warning: statement should be inside braces @@ -44,8 +52,6 @@ void test() { do_something("if-else2 else"); } - // CHECK-NOT: warning - // if-else if-else if (cond("if-else if-else1")) do_something("if"); // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: statement should be inside braces @@ -65,7 +71,6 @@ void test() { do_something("else"); } - // CHECK-NOT: warning for (;;) do_something("for"); // CHECK-MESSAGES: :[[@LINE-2]]:11: warning: statement should be inside braces @@ -80,7 +85,6 @@ void test() { // CHECK-FIXES: for (;;) { // CHECK-FIXES: } - // CHECK-NOT: warning int arr[4] = {1, 2, 3, 4}; for (int a : arr) do_something("for-range"); @@ -96,7 +100,6 @@ void test() { // CHECK-FIXES: for (int a : arr) { // CHECK-FIXES: } - // CHECK-NOT: warning while (cond("while1")) do_something("while"); // CHECK-MESSAGES: :[[@LINE-2]]:25: warning: statement should be inside braces @@ -111,7 +114,6 @@ void test() { // CHECK-FIXES: while (false) { // CHECK-FIXES: } - // CHECK-NOT: warning do do_something("do1"); while (cond("do1")); @@ -129,7 +131,6 @@ void test() { // CHECK-FIXES: do { // CHECK-FIXES: } while (false); - // CHECK-NOT: warning if (cond("ifif1")) // comment if (cond("ifif2")) @@ -159,7 +160,6 @@ void test() { // CHECK-FIXES: if (cond("ifif5")) { // CHECK-FIXES: }/* multi-line - // CHECK-NOT: warning if (1) while (2) if (3) for (;;) do ; while(false) /**/;/**/ // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: statement should be inside braces // CHECK-MESSAGES: :[[@LINE-2]]:19: warning: statement should be inside braces @@ -171,8 +171,4 @@ void test() { // CHECK-FIXES-NEXT: } // CHECK-FIXES-NEXT: } // CHECK-FIXES-NEXT: } - - // CHECK-NOT: warning - - // CHECK-MESSAGES: {{clang-tidy applied [0-9]+ of [0-9]+ suggested fixes.}} } _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
