44 StringRef AbseilStringsMatchHeader) {
45 auto StringLikeClass = cxxRecordDecl(hasAnyName(StringLikeClassNames));
47 hasUnqualifiedDesugaredType(recordType(hasDeclaration(StringLikeClass)));
49 hasUnqualifiedDesugaredType(pointerType(pointee(isAnyCharacter())));
50 auto CharType = hasUnqualifiedDesugaredType(isCharType());
51 auto StringNpos = declRefExpr(
52 to(varDecl(hasName(
"npos"), hasDeclContext(StringLikeClass))));
53 auto StringFind = cxxMemberCallExpr(
55 hasName(
"find"), parameterCountIs(2),
57 0, parmVarDecl(anyOf(hasType(StringType), hasType(CharStarType),
58 hasType(CharType)))))),
59 on(hasType(StringType)), hasArgument(0, expr().bind(
"parameter_to_find")),
60 anyOf(hasArgument(1, integerLiteral(equals(0))),
61 hasArgument(1, cxxDefaultArgExpr())),
62 onImplicitObjectArgument(expr().bind(
"string_being_searched")));
64 RewriteRuleWith<std::string> Rule = applyFirst(
66 binaryOperator(hasOperatorName(
"=="),
67 hasOperands(ignoringParenImpCasts(StringNpos),
68 ignoringParenImpCasts(StringFind))),
69 {changeTo(cat(
"!absl::StrContains(", node(
"string_being_searched"),
70 ", ", node(
"parameter_to_find"),
")")),
71 addInclude(AbseilStringsMatchHeader)},
72 cat(
"use !absl::StrContains instead of find() == npos")),
74 binaryOperator(hasOperatorName(
"!="),
75 hasOperands(ignoringParenImpCasts(StringNpos),
76 ignoringParenImpCasts(StringFind))),
77 {changeTo(cat(
"absl::StrContains(", node(
"string_being_searched"),
78 ", ", node(
"parameter_to_find"),
")")),
79 addInclude(AbseilStringsMatchHeader)},
80 cat(
"use absl::StrContains instead "
81 "of find() != npos"))});
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.