12#include "clang/AST/ASTContext.h"
13#include "clang/Frontend/CompilerInstance.h"
14#include "clang/Lex/MacroArgs.h"
15#include "clang/Lex/PPCallbacks.h"
16#include "clang/Lex/Preprocessor.h"
24 static const llvm::StringSet<> MacroNames = {
"TEST",
"TEST_F",
"TEST_P",
25 "TYPED_TEST",
"TYPED_TEST_P"};
26 return MacroNames.contains(MacroName);
31class AvoidUnderscoreInGoogletestNameCallback :
public PPCallbacks {
33 AvoidUnderscoreInGoogletestNameCallback(
34 Preprocessor *PP, AvoidUnderscoreInGoogletestNameCheck *Check)
35 : PP(PP), Check(Check) {}
39 void MacroExpands(
const Token &MacroNameToken,
40 const MacroDefinition &MacroDefinition, SourceRange Range,
41 const MacroArgs *Args)
override {
42 IdentifierInfo *NameIdentifierInfo = MacroNameToken.getIdentifierInfo();
43 if (!NameIdentifierInfo)
45 StringRef MacroName = NameIdentifierInfo->getName();
47 Args->getNumMacroArguments() < 2)
49 const Token *TestSuiteNameToken = Args->getUnexpArgument(0);
50 const Token *TestNameToken = Args->getUnexpArgument(1);
51 if (!TestSuiteNameToken || !TestNameToken)
53 std::string TestSuiteNameMaybeDisabled =
54 PP->getSpelling(*TestSuiteNameToken);
55 StringRef TestSuiteName = TestSuiteNameMaybeDisabled;
57 if (TestSuiteName.contains(
'_'))
58 Check->diag(TestSuiteNameToken->getLocation(),
59 "avoid using \"_\" in test suite name \"%0\" according to "
63 std::string TestNameMaybeDisabled = PP->getSpelling(*TestNameToken);
64 StringRef TestName = TestNameMaybeDisabled;
66 if (TestName.contains(
'_'))
67 Check->diag(TestNameToken->getLocation(),
68 "avoid using \"_\" in test name \"%0\" according to "
75 AvoidUnderscoreInGoogletestNameCheck *Check;
81 const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
83 std::make_unique<AvoidUnderscoreInGoogletestNameCallback>(PP,
this));
void registerPPCallbacks(const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) override
static bool isGoogletestTestMacro(StringRef MacroName)
constexpr llvm::StringLiteral KDisabledTestPrefix