|
7 | 7 | //===----------------------------------------------------------------------===// |
8 | 8 |
|
9 | 9 | #include "AssertEquals.h" |
| 10 | +#include "llvm/ADT/StringMap.h" |
10 | 11 |
|
11 | | -#include <map> |
12 | 12 | #include <string> |
13 | 13 |
|
14 | 14 | using namespace clang::ast_matchers; |
15 | 15 |
|
16 | 16 | namespace clang::tidy::objc { |
17 | 17 |
|
18 | 18 | // Mapping from `XCTAssert*Equal` to `XCTAssert*EqualObjects` name. |
19 | | -static const std::map<std::string, std::string> &nameMap() { |
20 | | - static const std::map<std::string, std::string> Map{ |
21 | | - {"XCTAssertEqual", "XCTAssertEqualObjects"}, |
22 | | - {"XCTAssertNotEqual", "XCTAssertNotEqualObjects"}, |
23 | | - |
24 | | - }; |
25 | | - return Map; |
26 | | -} |
| 19 | +static const llvm::StringMap<StringRef> NameMap{ |
| 20 | + {"XCTAssertEqual", "XCTAssertEqualObjects"}, |
| 21 | + {"XCTAssertNotEqual", "XCTAssertNotEqualObjects"}, |
| 22 | +}; |
27 | 23 |
|
28 | 24 | void AssertEquals::registerMatchers(MatchFinder *Finder) { |
29 | | - for (const auto &Pair : nameMap()) { |
| 25 | + for (const auto &[CurrName, _] : NameMap) { |
30 | 26 | Finder->addMatcher( |
31 | 27 | binaryOperator(anyOf(hasOperatorName("!="), hasOperatorName("==")), |
32 | | - isExpandedFromMacro(Pair.first), |
| 28 | + isExpandedFromMacro(std::string(CurrName)), |
33 | 29 | anyOf(hasLHS(hasType(qualType( |
34 | 30 | hasCanonicalType(asString("NSString *"))))), |
35 | 31 | hasRHS(hasType(qualType( |
36 | | - hasCanonicalType(asString("NSString *")))))) |
37 | | - |
38 | | - ) |
39 | | - .bind(Pair.first), |
| 32 | + hasCanonicalType(asString("NSString *"))))))) |
| 33 | + .bind(CurrName), |
40 | 34 | this); |
41 | 35 | } |
42 | 36 | } |
43 | 37 |
|
44 | 38 | void AssertEquals::check(const ast_matchers::MatchFinder::MatchResult &Result) { |
45 | | - for (const auto &Pair : nameMap()) { |
46 | | - if (const auto *Root = Result.Nodes.getNodeAs<BinaryOperator>(Pair.first)) { |
| 39 | + for (const auto &[CurrName, TargetName] : NameMap) { |
| 40 | + if (const auto *Root = Result.Nodes.getNodeAs<BinaryOperator>(CurrName)) { |
47 | 41 | const SourceManager *Sm = Result.SourceManager; |
48 | 42 | // The macros are nested two levels, so going up twice. |
49 | 43 | auto MacroCallsite = Sm->getImmediateMacroCallerLoc( |
50 | 44 | Sm->getImmediateMacroCallerLoc(Root->getBeginLoc())); |
51 | | - diag(MacroCallsite, "use " + Pair.second + " for comparing objects") |
| 45 | + diag(MacroCallsite, |
| 46 | + (Twine("use ") + TargetName + " for comparing objects").str()) |
52 | 47 | << FixItHint::CreateReplacement( |
53 | 48 | clang::CharSourceRange::getCharRange( |
54 | 49 | MacroCallsite, |
55 | | - MacroCallsite.getLocWithOffset(Pair.first.length())), |
56 | | - Pair.second); |
| 50 | + MacroCallsite.getLocWithOffset(CurrName.size())), |
| 51 | + TargetName); |
57 | 52 | } |
58 | 53 | } |
59 | 54 | } |
|
0 commit comments