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

0001 /*
0002     SPDX-FileCopyrightText: 2016 Sergio Martins <smartins@kde.org>
0003     SPDX-FileCopyrightText: 2016 Klarälvdalens Datakonsult AB a KDAB Group company info@kdab.coms
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "connect-non-signal.h"
0009 #include "AccessSpecifierManager.h"
0010 #include "ClazyContext.h"
0011 #include "QtUtils.h"
0012 
0013 #include <clang/AST/Decl.h>
0014 #include <clang/AST/DeclCXX.h>
0015 #include <clang/AST/Expr.h>
0016 #include <clang/AST/Stmt.h>
0017 #include <clang/Basic/LLVM.h>
0018 #include <llvm/Support/Casting.h>
0019 
0020 using namespace clang;
0021 
0022 ConnectNonSignal::ConnectNonSignal(const std::string &name, ClazyContext *context)
0023     : CheckBase(name, context, Option_CanIgnoreIncludes)
0024 {
0025     context->enableAccessSpecifierManager();
0026 }
0027 
0028 void ConnectNonSignal::VisitStmt(clang::Stmt *stmt)
0029 {
0030     auto *call = dyn_cast<CallExpr>(stmt);
0031     if (!call) {
0032         return;
0033     }
0034 
0035     FunctionDecl *func = call->getDirectCallee();
0036     if (!clazy::isConnect(func) || !clazy::connectHasPMFStyle(func)) {
0037         return;
0038     }
0039 
0040     CXXMethodDecl *method = clazy::pmfFromConnect(call, /*argIndex=*/1);
0041     if (!method) {
0042         if (clazy::isQMetaMethod(call, 1)) {
0043             return;
0044         }
0045         emitWarning(call->getBeginLoc(), "couldn't find method from pmf connect, please report a bug");
0046         return;
0047     }
0048 
0049     AccessSpecifierManager *accessSpecifierManager = m_context->accessSpecifierManager;
0050     if (!accessSpecifierManager) {
0051         return;
0052     }
0053 
0054     QtAccessSpecifierType qst = accessSpecifierManager->qtAccessSpecifierType(method);
0055     if (qst != QtAccessSpecifier_Unknown && qst != QtAccessSpecifier_Signal) {
0056         emitWarning(call, method->getQualifiedNameAsString() + std::string(" is not a signal"));
0057     }
0058 }