File indexing completed on 2024-05-12 05:40:58

0001 /*
0002     SPDX-FileCopyrightText: 2017 Klarälvdalens Datakonsult AB a KDAB Group company info@kdab.com
0003     SPDX-FileContributor: SĂ©rgio Martins <sergio.martins@kdab.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "qlatin1string-non-ascii.h"
0009 #include "HierarchyUtils.h"
0010 #include "Utils.h"
0011 
0012 #include <clang/AST/DeclCXX.h>
0013 #include <clang/AST/Expr.h>
0014 #include <clang/AST/ExprCXX.h>
0015 #include <clang/AST/Stmt.h>
0016 #include <clang/Basic/LLVM.h>
0017 #include <llvm/Support/Casting.h>
0018 
0019 class ClazyContext;
0020 
0021 using namespace clang;
0022 
0023 QLatin1StringNonAscii::QLatin1StringNonAscii(const std::string &name, ClazyContext *context)
0024     : CheckBase(name, context, Option_CanIgnoreIncludes)
0025 {
0026 }
0027 
0028 void QLatin1StringNonAscii::VisitStmt(clang::Stmt *stmt)
0029 {
0030     auto *constructExpr = dyn_cast<CXXConstructExpr>(stmt);
0031     CXXConstructorDecl *ctor = constructExpr ? constructExpr->getConstructor() : nullptr;
0032 
0033     if (!ctor || ctor->getQualifiedNameAsString() != "QLatin1String::QLatin1String") {
0034         return;
0035     }
0036 
0037     auto *lt = clazy::getFirstChildOfType2<StringLiteral>(stmt);
0038     if (lt && !Utils::isAscii(lt)) {
0039         emitWarning(stmt, "QLatin1String with non-ascii literal");
0040     }
0041 }