annotate clang-tools-extra/clang-tidy/google/AvoidUnderscoreInGoogletestNameCheck.cpp @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents 79ff65ed7e25
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- AvoidUnderscoreInGoogletestNameCheck.cpp - clang-tidy --*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include <string>
anatofuz
parents:
diff changeset
10
anatofuz
parents:
diff changeset
11 #include "AvoidUnderscoreInGoogletestNameCheck.h"
anatofuz
parents:
diff changeset
12 #include "clang/AST/ASTContext.h"
anatofuz
parents:
diff changeset
13 #include "clang/ASTMatchers/ASTMatchers.h"
anatofuz
parents:
diff changeset
14 #include "clang/Frontend/CompilerInstance.h"
anatofuz
parents:
diff changeset
15 #include "clang/Lex/MacroArgs.h"
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
16 #include "clang/Lex/PPCallbacks.h"
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
17 #include "clang/Lex/Preprocessor.h"
150
anatofuz
parents:
diff changeset
18
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
19 namespace clang::tidy::google::readability {
150
anatofuz
parents:
diff changeset
20
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
21 constexpr llvm::StringLiteral KDisabledTestPrefix = "DISABLED_";
150
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 // Determines whether the macro is a Googletest test macro.
anatofuz
parents:
diff changeset
24 static bool isGoogletestTestMacro(StringRef MacroName) {
anatofuz
parents:
diff changeset
25 static const llvm::StringSet<> MacroNames = {"TEST", "TEST_F", "TEST_P",
anatofuz
parents:
diff changeset
26 "TYPED_TEST", "TYPED_TEST_P"};
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
27 return MacroNames.contains(MacroName);
150
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 namespace {
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 class AvoidUnderscoreInGoogletestNameCallback : public PPCallbacks {
anatofuz
parents:
diff changeset
33 public:
anatofuz
parents:
diff changeset
34 AvoidUnderscoreInGoogletestNameCallback(
anatofuz
parents:
diff changeset
35 Preprocessor *PP, AvoidUnderscoreInGoogletestNameCheck *Check)
anatofuz
parents:
diff changeset
36 : PP(PP), Check(Check) {}
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 // Detects expansions of the TEST, TEST_F, TEST_P, TYPED_TEST, TYPED_TEST_P
anatofuz
parents:
diff changeset
39 // macros and checks that their arguments do not have any underscores.
anatofuz
parents:
diff changeset
40 void MacroExpands(const Token &MacroNameToken,
anatofuz
parents:
diff changeset
41 const MacroDefinition &MacroDefinition, SourceRange Range,
anatofuz
parents:
diff changeset
42 const MacroArgs *Args) override {
anatofuz
parents:
diff changeset
43 IdentifierInfo *NameIdentifierInfo = MacroNameToken.getIdentifierInfo();
anatofuz
parents:
diff changeset
44 if (!NameIdentifierInfo)
anatofuz
parents:
diff changeset
45 return;
anatofuz
parents:
diff changeset
46 StringRef MacroName = NameIdentifierInfo->getName();
anatofuz
parents:
diff changeset
47 if (!isGoogletestTestMacro(MacroName) || !Args ||
anatofuz
parents:
diff changeset
48 Args->getNumMacroArguments() < 2)
anatofuz
parents:
diff changeset
49 return;
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
50 const Token *TestSuiteNameToken = Args->getUnexpArgument(0);
150
anatofuz
parents:
diff changeset
51 const Token *TestNameToken = Args->getUnexpArgument(1);
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
52 if (!TestSuiteNameToken || !TestNameToken)
150
anatofuz
parents:
diff changeset
53 return;
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
54 std::string TestSuiteNameMaybeDisabled =
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
55 PP->getSpelling(*TestSuiteNameToken);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
56 StringRef TestSuiteName = TestSuiteNameMaybeDisabled;
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
57 TestSuiteName.consume_front(KDisabledTestPrefix);
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
58 if (TestSuiteName.contains('_'))
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
59 Check->diag(TestSuiteNameToken->getLocation(),
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
60 "avoid using \"_\" in test suite name \"%0\" according to "
150
anatofuz
parents:
diff changeset
61 "Googletest FAQ")
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
62 << TestSuiteName;
150
anatofuz
parents:
diff changeset
63
anatofuz
parents:
diff changeset
64 std::string TestNameMaybeDisabled = PP->getSpelling(*TestNameToken);
anatofuz
parents:
diff changeset
65 StringRef TestName = TestNameMaybeDisabled;
221
79ff65ed7e25 LLVM12 Original
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 TestName.consume_front(KDisabledTestPrefix);
150
anatofuz
parents:
diff changeset
67 if (TestName.contains('_'))
anatofuz
parents:
diff changeset
68 Check->diag(TestNameToken->getLocation(),
anatofuz
parents:
diff changeset
69 "avoid using \"_\" in test name \"%0\" according to "
anatofuz
parents:
diff changeset
70 "Googletest FAQ")
anatofuz
parents:
diff changeset
71 << TestName;
anatofuz
parents:
diff changeset
72 }
anatofuz
parents:
diff changeset
73
anatofuz
parents:
diff changeset
74 private:
anatofuz
parents:
diff changeset
75 Preprocessor *PP;
anatofuz
parents:
diff changeset
76 AvoidUnderscoreInGoogletestNameCheck *Check;
anatofuz
parents:
diff changeset
77 };
anatofuz
parents:
diff changeset
78
anatofuz
parents:
diff changeset
79 } // namespace
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 void AvoidUnderscoreInGoogletestNameCheck::registerPPCallbacks(
anatofuz
parents:
diff changeset
82 const SourceManager &SM, Preprocessor *PP, Preprocessor *ModuleExpanderPP) {
anatofuz
parents:
diff changeset
83 PP->addPPCallbacks(
anatofuz
parents:
diff changeset
84 std::make_unique<AvoidUnderscoreInGoogletestNameCallback>(PP, this));
anatofuz
parents:
diff changeset
85 }
anatofuz
parents:
diff changeset
86
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 221
diff changeset
87 } // namespace clang::tidy::google::readability