1 //===--- BracesAroundStatementsCheck.h - clang-tidy -------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_BRACESAROUNDSTATEMENTSCHECK_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_BRACESAROUNDSTATEMENTSCHECK_H
11 
12 #include "../ClangTidyCheck.h"
13 
14 namespace clang {
15 namespace tidy {
16 namespace readability {
17 
18 /// Checks that bodies of `if` statements and loops (`for`, `range-for`,
19 /// `do-while`, and `while`) are inside braces
20 ///
21 /// Before:
22 ///
23 /// \code
24 ///   if (condition)
25 ///     statement;
26 /// \endcode
27 ///
28 /// After:
29 ///
30 /// \code
31 ///   if (condition) {
32 ///     statement;
33 ///   }
34 /// \endcode
35 ///
36 /// Additionally, one can define an option `ShortStatementLines` defining the
37 /// minimal number of lines that the statement should have in order to trigger
38 /// this check.
39 ///
40 /// The number of lines is counted from the end of condition or initial keyword
41 /// (`do`/`else`) until the last line of the inner statement.  Default value 0
42 /// means that braces will be added to all statements (not having them already).
43 class BracesAroundStatementsCheck : public ClangTidyCheck {
44 public:
45   BracesAroundStatementsCheck(StringRef Name, ClangTidyContext *Context);
46   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
47   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
48   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
49   void onEndOfTranslationUnit() override;
50 
51 private:
52   bool checkStmt(const ast_matchers::MatchFinder::MatchResult &Result,
53                  const Stmt *S, SourceLocation StartLoc,
54                  SourceLocation EndLocHint = SourceLocation());
55   template <typename IfOrWhileStmt>
56   SourceLocation findRParenLoc(const IfOrWhileStmt *S, const SourceManager &SM,
57                                const ASTContext *Context);
58 
59 private:
60   std::set<const Stmt *> ForceBracesStmts;
61   const unsigned ShortStatementLines;
62 };
63 
64 } // namespace readability
65 } // namespace tidy
66 } // namespace clang
67 
68 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_BRACESAROUNDSTATEMENTSCHECK_H
69