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