1 //===--- RedundantVoidArgCheck.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_MODERNIZE_REDUNDANT_VOID_ARG_CHECK_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REDUNDANT_VOID_ARG_CHECK_H
11 
12 #include "../ClangTidyCheck.h"
13 #include "clang/Lex/Token.h"
14 
15 #include <string>
16 
17 namespace clang {
18 namespace tidy {
19 namespace modernize {
20 
21 /// Find and remove redundant void argument lists.
22 ///
23 /// Examples:
24 ///   `int f(void);`                    becomes `int f();`
25 ///   `int (*f(void))(void);`           becomes `int (*f())();`
26 ///   `typedef int (*f_t(void))(void);` becomes `typedef int (*f_t())();`
27 ///   `void (C::*p)(void);`             becomes `void (C::*p)();`
28 ///   `C::C(void) {}`                   becomes `C::C() {}`
29 ///   `C::~C(void) {}`                  becomes `C::~C() {}`
30 ///
31 class RedundantVoidArgCheck : public ClangTidyCheck {
32 public:
RedundantVoidArgCheck(StringRef Name,ClangTidyContext * Context)33   RedundantVoidArgCheck(StringRef Name, ClangTidyContext *Context)
34       : ClangTidyCheck(Name, Context) {}
35 
isLanguageVersionSupported(const LangOptions & LangOpts)36   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
37     return LangOpts.CPlusPlus;
38   }
39 
40   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
41 
42   void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
43 
44 private:
45   void processFunctionDecl(const ast_matchers::MatchFinder::MatchResult &Result,
46                            const FunctionDecl *Function);
47 
48   void
49   processTypedefNameDecl(const ast_matchers::MatchFinder::MatchResult &Result,
50                          const TypedefNameDecl *Typedef);
51 
52   void processFieldDecl(const ast_matchers::MatchFinder::MatchResult &Result,
53                         const FieldDecl *Member);
54 
55   void processVarDecl(const ast_matchers::MatchFinder::MatchResult &Result,
56                       const VarDecl *Var);
57 
58   void
59   processNamedCastExpr(const ast_matchers::MatchFinder::MatchResult &Result,
60                        const CXXNamedCastExpr *NamedCast);
61 
62   void
63   processExplicitCastExpr(const ast_matchers::MatchFinder::MatchResult &Result,
64                           const ExplicitCastExpr *ExplicitCast);
65 
66   void processLambdaExpr(const ast_matchers::MatchFinder::MatchResult &Result,
67                          const LambdaExpr *Lambda);
68 
69   void
70   removeVoidArgumentTokens(const ast_matchers::MatchFinder::MatchResult &Result,
71                            SourceRange Range, StringRef GrammarLocation);
72 
73   void removeVoidToken(Token VoidToken, StringRef Diagnostic);
74 };
75 
76 } // namespace modernize
77 } // namespace tidy
78 } // namespace clang
79 
80 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_MODERNIZE_REDUNDANT_VOID_ARG_CHECK_H
81