11 #include "../utils/Matchers.h" 12 #include "clang/ASTMatchers/ASTMatchers.h" 19 namespace readability {
21 void RedundantStringInitCheck::registerMatchers(MatchFinder *Finder) {
22 if (!getLangOpts().CPlusPlus)
26 const auto StringConstructorExpr = expr(anyOf(
27 cxxConstructExpr(argumentCountIs(1),
28 hasDeclaration(cxxMethodDecl(hasName(
"basic_string")))),
31 cxxConstructExpr(argumentCountIs(2),
32 hasDeclaration(cxxMethodDecl(hasName(
"basic_string"))),
33 hasArgument(1, cxxDefaultArgExpr()))));
36 const auto EmptyStringCtorExpr = cxxConstructExpr(
37 StringConstructorExpr,
38 hasArgument(0, ignoringParenImpCasts(stringLiteral(hasSize(0)))));
40 const auto EmptyStringCtorExprWithTemporaries =
41 cxxConstructExpr(StringConstructorExpr,
42 hasArgument(0, ignoringImplicit(EmptyStringCtorExpr)));
50 varDecl(hasType(hasUnqualifiedDesugaredType(recordType(
51 hasDeclaration(cxxRecordDecl(hasName(
"basic_string")))))),
52 hasInitializer(expr(ignoringImplicit(anyOf(
54 EmptyStringCtorExprWithTemporaries)))
56 unless(parmVarDecl()))
61 void RedundantStringInitCheck::check(
const MatchFinder::MatchResult &Result) {
62 const auto *CtorExpr = Result.Nodes.getNodeAs<Expr>(
"expr");
63 const auto *Decl = Result.Nodes.getNodeAs<NamedDecl>(
"decl");
64 diag(CtorExpr->getExprLoc(),
"redundant string initialization")
65 << FixItHint::CreateReplacement(CtorExpr->getSourceRange(),