10 #include "../utils/Matchers.h" 11 #include "clang/ASTMatchers/ASTMatchers.h" 18 namespace readability {
20 void RedundantStringInitCheck::registerMatchers(MatchFinder *Finder) {
21 if (!getLangOpts().CPlusPlus)
25 const auto StringConstructorExpr = expr(anyOf(
26 cxxConstructExpr(argumentCountIs(1),
27 hasDeclaration(cxxMethodDecl(hasName(
"basic_string")))),
30 cxxConstructExpr(argumentCountIs(2),
31 hasDeclaration(cxxMethodDecl(hasName(
"basic_string"))),
32 hasArgument(1, cxxDefaultArgExpr()))));
35 const auto EmptyStringCtorExpr = cxxConstructExpr(
36 StringConstructorExpr,
37 hasArgument(0, ignoringParenImpCasts(stringLiteral(hasSize(0)))));
39 const auto EmptyStringCtorExprWithTemporaries =
40 cxxConstructExpr(StringConstructorExpr,
41 hasArgument(0, ignoringImplicit(EmptyStringCtorExpr)));
49 varDecl(hasType(hasUnqualifiedDesugaredType(recordType(
50 hasDeclaration(cxxRecordDecl(hasName(
"basic_string")))))),
51 hasInitializer(expr(ignoringImplicit(anyOf(
53 EmptyStringCtorExprWithTemporaries)))
55 unless(parmVarDecl()))
60 void RedundantStringInitCheck::check(
const MatchFinder::MatchResult &
Result) {
61 const auto *CtorExpr = Result.Nodes.getNodeAs<Expr>(
"expr");
62 const auto *Decl = Result.Nodes.getNodeAs<NamedDecl>(
"decl");
63 diag(CtorExpr->getExprLoc(),
"redundant string initialization")
64 << FixItHint::CreateReplacement(CtorExpr->getSourceRange(),
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
llvm::Optional< llvm::Expected< tooling::AtomicChanges > > Result