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 }