12 #include "clang/AST/ASTContext.h"
13 #include "clang/ASTMatchers/ASTMatchers.h"
14 #include "clang/Frontend/CompilerInstance.h"
15 #include "clang/Lex/MacroArgs.h"
16 #include "clang/Lex/PPCallbacks.h"
17 #include "clang/Lex/Preprocessor.h"
22 namespace readability {
28 static const llvm::StringSet<> MacroNames = {
"TEST",
"TEST_F",
"TEST_P",
29 "TYPED_TEST",
"TYPED_TEST_P"};
30 return MacroNames.find(MacroName) != MacroNames.end();
35 class AvoidUnderscoreInGoogletestNameCallback :
public PPCallbacks {
37 AvoidUnderscoreInGoogletestNameCallback(
38 Preprocessor *PP, AvoidUnderscoreInGoogletestNameCheck *Check)
39 : PP(PP), Check(Check) {}
43 void MacroExpands(
const Token &MacroNameToken,
44 const MacroDefinition &MacroDefinition, SourceRange
Range,
45 const MacroArgs *Args)
override {
46 IdentifierInfo *NameIdentifierInfo = MacroNameToken.getIdentifierInfo();
47 if (!NameIdentifierInfo)
49 StringRef MacroName = NameIdentifierInfo->getName();
51 Args->getNumMacroArguments() < 2)
53 const Token *TestCaseNameToken = Args->getUnexpArgument(0);
54 const Token *TestNameToken = Args->getUnexpArgument(1);
55 if (!TestCaseNameToken || !TestNameToken)
57 std::string TestCaseName = PP->getSpelling(*TestCaseNameToken);
58 if (TestCaseName.find(
'_') != std::string::npos)
59 Check->diag(TestCaseNameToken->getLocation(),
60 "avoid using \"_\" in test case name \"%0\" according to "
64 std::string TestNameMaybeDisabled = PP->getSpelling(*TestNameToken);
65 StringRef TestName = TestNameMaybeDisabled;
67 if (TestName.contains(
'_'))
68 Check->diag(TestNameToken->getLocation(),
69 "avoid using \"_\" in test name \"%0\" according to "
76 AvoidUnderscoreInGoogletestNameCheck *Check;
82 const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
84 std::make_unique<AvoidUnderscoreInGoogletestNameCallback>(PP,
this));