clang-tools  16.0.0git
RenamerClangTidyCheck.h
Go to the documentation of this file.
1 //===--- RenamerClangTidyCheck.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_RENAMERCLANGTIDYCHECK_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_RENAMERCLANGTIDYCHECK_H
11 
12 #include "../ClangTidyCheck.h"
13 #include "llvm/ADT/DenseMap.h"
14 #include "llvm/ADT/DenseSet.h"
15 #include "llvm/ADT/FunctionExtras.h"
16 #include "llvm/ADT/Optional.h"
17 #include <string>
18 #include <utility>
19 
20 namespace clang {
21 
22 class MacroInfo;
23 
24 namespace tidy {
25 
26 /// Base class for clang-tidy checks that want to flag declarations and/or
27 /// macros for renaming based on customizable criteria.
29 public:
30  RenamerClangTidyCheck(StringRef CheckName, ClangTidyContext *Context);
32 
33  /// Derived classes should not implement any matching logic themselves; this
34  /// class will do the matching and call the derived class'
35  /// getDeclFailureInfo() and getMacroFailureInfo() for determining whether a
36  /// given identifier passes or fails the check.
37  void registerMatchers(ast_matchers::MatchFinder *Finder) final;
38  void check(const ast_matchers::MatchFinder::MatchResult &Result) final;
39  void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP,
40  Preprocessor *ModuleExpanderPP) final;
41  void onEndOfTranslationUnit() final;
42 
43  /// Derived classes that override this function should call this method from
44  /// the overridden method.
45  void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
46 
47  /// This enum will be used in %select of the diagnostic message.
48  /// Each value below IgnoreFailureThreshold should have an error message.
49  enum class ShouldFixStatus {
50  ShouldFix,
51 
52  /// The fixup will conflict with a language keyword,
53  /// so we can't fix it automatically.
55 
56  /// The fixup will conflict with a macro
57  /// definition, so we can't fix it
58  /// automatically.
60 
61  /// The fixup results in an identifier that is not a valid c/c++ identifier.
63 
64  /// Values pass this threshold will be ignored completely
65  /// i.e no message, no fixup.
67 
68  /// If the identifier was used or declared within a macro we
69  /// won't offer a fixup for safety reasons.
71  };
72 
73  /// Information describing a failed check
74  struct FailureInfo {
75  std::string KindName; // Tag or misc info to be used as derived classes need
76  std::string Fixup; // The name that will be proposed as a fix-it hint
77  };
78 
79  /// Holds an identifier name check failure, tracking the kind of the
80  /// identifier, its possible fixup and the starting locations of all the
81  /// identifier usages.
84 
85  /// Whether the failure should be fixed or not.
86  ///
87  /// e.g.: if the identifier was used or declared within a macro we won't
88  /// offer a fixup for safety reasons.
89  bool shouldFix() const {
90  return FixStatus == ShouldFixStatus::ShouldFix && !Info.Fixup.empty();
91  }
92 
93  bool shouldNotify() const {
95  }
96 
98 
99  /// A set of all the identifier usages starting SourceLocation.
100  llvm::DenseSet<SourceLocation> RawUsageLocs;
101 
102  NamingCheckFailure() = default;
103  };
104 
105  using NamingCheckId = std::pair<SourceLocation, std::string>;
106 
107  using NamingCheckFailureMap =
108  llvm::DenseMap<NamingCheckId, NamingCheckFailure>;
109 
110  /// Check Macros for style violations.
111  void checkMacro(SourceManager &SourceMgr, const Token &MacroNameTok,
112  const MacroInfo *MI);
113 
114  /// Add a usage of a macro if it already has a violation.
115  void expandMacro(const Token &MacroNameTok, const MacroInfo *MI);
116 
118  SourceRange Range, SourceManager *SourceMgr = nullptr);
119 
120  /// Convenience method when the usage to be added is a NamedDecl.
121  void addUsage(const NamedDecl *Decl, SourceRange Range,
122  SourceManager *SourceMgr = nullptr);
123 
124 protected:
125  /// Overridden by derived classes, returns information about if and how a Decl
126  /// failed the check. A 'None' result means the Decl did not fail the check.
127  virtual llvm::Optional<FailureInfo>
128  getDeclFailureInfo(const NamedDecl *Decl, const SourceManager &SM) const = 0;
129 
130  /// Overridden by derived classes, returns information about if and how a
131  /// macro failed the check. A 'None' result means the macro did not fail the
132  /// check.
133  virtual llvm::Optional<FailureInfo>
134  getMacroFailureInfo(const Token &MacroNameTok,
135  const SourceManager &SM) const = 0;
136 
137  /// Represents customized diagnostic text and how arguments should be applied.
138  /// Example usage:
139  ///
140  /// return DiagInfo{"my %1 very %2 special %3 text",
141  /// [=](DiagnosticBuilder &diag) {
142  /// diag << arg1 << arg2 << arg3;
143  /// }};
144  struct DiagInfo {
145  std::string Text;
146  llvm::unique_function<void(DiagnosticBuilder &)> ApplyArgs;
147  };
148 
149  /// Overridden by derived classes, returns a description of the diagnostic
150  /// that should be emitted for the given failure. The base class will then
151  /// further customize the diagnostic by adding info about whether the fix-it
152  /// can be automatically applied or not.
153  virtual DiagInfo getDiagInfo(const NamingCheckId &ID,
154  const NamingCheckFailure &Failure) const = 0;
155 
156 private:
157  NamingCheckFailureMap NamingCheckFailures;
158  const bool AggressiveDependentMemberLookup;
159 };
160 
161 } // namespace tidy
162 } // namespace clang
163 
164 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_RENAMERCLANGTIDYCHECK_H
Range
CharSourceRange Range
SourceRange for the file name.
Definition: IncludeOrderCheck.cpp:39
clang::tidy::RenamerClangTidyCheck::RenamerClangTidyCheck
RenamerClangTidyCheck(StringRef CheckName, ClangTidyContext *Context)
Definition: RenamerClangTidyCheck.cpp:101
clang::tidy::ClangTidyOptions::OptionMap
llvm::StringMap< ClangTidyValue > OptionMap
Definition: ClangTidyOptions.h:115
clang::tidy::RenamerClangTidyCheck::onEndOfTranslationUnit
void onEndOfTranslationUnit() final
Definition: RenamerClangTidyCheck.cpp:530
clang::tidy::RenamerClangTidyCheck::FailureInfo::KindName
std::string KindName
Definition: RenamerClangTidyCheck.h:75
clang::tidy::RenamerClangTidyCheck::storeOptions
void storeOptions(ClangTidyOptions::OptionMap &Opts) override
Derived classes that override this function should call this method from the overridden method.
Definition: RenamerClangTidyCheck.cpp:108
clang::tidy::RenamerClangTidyCheck::NamingCheckFailure::shouldNotify
bool shouldNotify() const
Definition: RenamerClangTidyCheck.h:93
clang::tidy::ClangTidyCheck
Base class for all clang-tidy checks.
Definition: ClangTidyCheck.h:53
clang::tidy::RenamerClangTidyCheck::NamingCheckFailureMap
llvm::DenseMap< NamingCheckId, NamingCheckFailure > NamingCheckFailureMap
Definition: RenamerClangTidyCheck.h:108
clang::tidy::RenamerClangTidyCheck::~RenamerClangTidyCheck
~RenamerClangTidyCheck()
clang::tidy::RenamerClangTidyCheck::checkMacro
void checkMacro(SourceManager &SourceMgr, const Token &MacroNameTok, const MacroInfo *MI)
Check Macros for style violations.
Definition: RenamerClangTidyCheck.cpp:476
clang::tidy::RenamerClangTidyCheck::getDeclFailureInfo
virtual llvm::Optional< FailureInfo > getDeclFailureInfo(const NamedDecl *Decl, const SourceManager &SM) const =0
Overridden by derived classes, returns information about if and how a Decl failed the check.
clang::tidy::RenamerClangTidyCheck::NamingCheckFailure
Holds an identifier name check failure, tracking the kind of the identifier, its possible fixup and t...
Definition: RenamerClangTidyCheck.h:82
clang::tidy::RenamerClangTidyCheck::DiagInfo
Represents customized diagnostic text and how arguments should be applied.
Definition: RenamerClangTidyCheck.h:144
SourceMgr
llvm::SourceMgr * SourceMgr
Definition: ConfigCompile.cpp:101
clang::tidy::RenamerClangTidyCheck::DiagInfo::Text
std::string Text
Definition: RenamerClangTidyCheck.h:145
clang::tidy::RenamerClangTidyCheck::getDiagInfo
virtual DiagInfo getDiagInfo(const NamingCheckId &ID, const NamingCheckFailure &Failure) const =0
Overridden by derived classes, returns a description of the diagnostic that should be emitted for the...
clang::tidy::RenamerClangTidyCheck::NamingCheckFailure::FixStatus
ShouldFixStatus FixStatus
Definition: RenamerClangTidyCheck.h:97
Decl
const FunctionDecl * Decl
Definition: AvoidBindCheck.cpp:100
clang::tidy::RenamerClangTidyCheck::ShouldFixStatus
ShouldFixStatus
This enum will be used in select of the diagnostic message.
Definition: RenamerClangTidyCheck.h:49
clang::tidy::RenamerClangTidyCheck::ShouldFixStatus::InsideMacro
@ InsideMacro
If the identifier was used or declared within a macro we won't offer a fixup for safety reasons.
clang::tidy::RenamerClangTidyCheck::registerMatchers
void registerMatchers(ast_matchers::MatchFinder *Finder) final
Derived classes should not implement any matching logic themselves; this class will do the matching a...
Definition: RenamerClangTidyCheck.cpp:113
clang::tidy::RenamerClangTidyCheck::getMacroFailureInfo
virtual llvm::Optional< FailureInfo > getMacroFailureInfo(const Token &MacroNameTok, const SourceManager &SM) const =0
Overridden by derived classes, returns information about if and how a macro failed the check.
clang::tidy::RenamerClangTidyCheck::ShouldFixStatus::IgnoreFailureThreshold
@ IgnoreFailureThreshold
Values pass this threshold will be ignored completely i.e no message, no fixup.
clang::tidy::ClangTidyContext
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.
Definition: ClangTidyDiagnosticConsumer.h:67
clang::tidy::RenamerClangTidyCheck::NamingCheckFailure::RawUsageLocs
llvm::DenseSet< SourceLocation > RawUsageLocs
A set of all the identifier usages starting SourceLocation.
Definition: RenamerClangTidyCheck.h:100
clang::tidy::RenamerClangTidyCheck::registerPPCallbacks
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) final
Override this to register PPCallbacks in the preprocessor.
Definition: RenamerClangTidyCheck.cpp:131
clang::tidy::RenamerClangTidyCheck::NamingCheckFailure::Info
FailureInfo Info
Definition: RenamerClangTidyCheck.h:83
clang::tidy::RenamerClangTidyCheck::FailureInfo::Fixup
std::string Fixup
Definition: RenamerClangTidyCheck.h:76
clang::tidy::RenamerClangTidyCheck::ShouldFixStatus::ShouldFix
@ ShouldFix
clang::tidy::RenamerClangTidyCheck::addUsage
void addUsage(const RenamerClangTidyCheck::NamingCheckId &Decl, SourceRange Range, SourceManager *SourceMgr=nullptr)
Definition: RenamerClangTidyCheck.cpp:155
clang::tidy::bugprone::PP
static Preprocessor * PP
Definition: BadSignalToKillThreadCheck.cpp:29
clang::tidy::RenamerClangTidyCheck::expandMacro
void expandMacro(const Token &MacroNameTok, const MacroInfo *MI)
Add a usage of a macro if it already has a violation.
Definition: RenamerClangTidyCheck.cpp:496
clang::tidy::RenamerClangTidyCheck
Base class for clang-tidy checks that want to flag declarations and/or macros for renaming based on c...
Definition: RenamerClangTidyCheck.h:28
clang::tidy::RenamerClangTidyCheck::NamingCheckId
std::pair< SourceLocation, std::string > NamingCheckId
Definition: RenamerClangTidyCheck.h:105
ID
static char ID
Definition: Logger.cpp:74
clang
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
Definition: ApplyReplacements.h:27
clang::tidy::RenamerClangTidyCheck::NamingCheckFailure::NamingCheckFailure
NamingCheckFailure()=default
clang::tidy::RenamerClangTidyCheck::DiagInfo::ApplyArgs
llvm::unique_function< void(DiagnosticBuilder &)> ApplyArgs
Definition: RenamerClangTidyCheck.h:146
clang::tidy::RenamerClangTidyCheck::ShouldFixStatus::ConflictsWithMacroDefinition
@ ConflictsWithMacroDefinition
The fixup will conflict with a macro definition, so we can't fix it automatically.
clang::tidy::RenamerClangTidyCheck::FailureInfo
Information describing a failed check.
Definition: RenamerClangTidyCheck.h:74
clang::tidy::RenamerClangTidyCheck::ShouldFixStatus::FixInvalidIdentifier
@ FixInvalidIdentifier
The fixup results in an identifier that is not a valid c/c++ identifier.
clang::tidy::RenamerClangTidyCheck::NamingCheckFailure::shouldFix
bool shouldFix() const
Whether the failure should be fixed or not.
Definition: RenamerClangTidyCheck.h:89
clang::tidy::RenamerClangTidyCheck::check
void check(const ast_matchers::MatchFinder::MatchResult &Result) final
ClangTidyChecks that register ASTMatchers should do the actual work in here.
Definition: RenamerClangTidyCheck.cpp:271
clang::tidy::RenamerClangTidyCheck::ShouldFixStatus::ConflictsWithKeyword
@ ConflictsWithKeyword
The fixup will conflict with a language keyword, so we can't fix it automatically.