From 7443d26f9db26ba5be370f12f252f22f4bd0a00a Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Fri, 24 Aug 2018 17:53:52 +0100 Subject: connect-3arg-lambda: Also warn for QMenu::addAction() --- src/checks/level1/connect-3arg-lambda.cpp | 25 ++++++++++++++++++++++--- src/checks/level1/connect-3arg-lambda.h | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/checks/level1/connect-3arg-lambda.cpp b/src/checks/level1/connect-3arg-lambda.cpp index a66110f7..9422c986 100644 --- a/src/checks/level1/connect-3arg-lambda.cpp +++ b/src/checks/level1/connect-3arg-lambda.cpp @@ -49,11 +49,17 @@ void Connect3ArgLambda::VisitStmt(clang::Stmt *stmt) if (numParams != 2 && numParams != 3) return; - if (fdecl->getQualifiedNameAsString() == "QTimer::singleShot") { + string qualifiedName = fdecl->getQualifiedNameAsString(); + if (qualifiedName == "QTimer::singleShot") { processQTimer(fdecl, stmt); return; } + if (qualifiedName == "QMenu::addAction") { + processQMenu(fdecl, stmt); + return; + } + if (numParams != 3 || !clazy::isConnect(fdecl)) return; @@ -112,7 +118,6 @@ void Connect3ArgLambda::processQTimer(FunctionDecl *func, Stmt *stmt) // QTimer::singleShot(int msec, Functor functor) // QTimer::singleShot(int msec, Qt::TimerType timerType, Functor functor) - const uint numParams = func->getNumParams(); if (numParams == 2) { if (func->getParamDecl(0)->getNameAsString() == "interval" && @@ -123,7 +128,21 @@ void Connect3ArgLambda::processQTimer(FunctionDecl *func, Stmt *stmt) if (func->getParamDecl(0)->getNameAsString() == "interval" && func->getParamDecl(1)->getNameAsString() == "timerType" && func->getParamDecl(2)->getNameAsString() == "slot") { - emitWarning(stmt, "Pass a context object as 3nd singleShot parameter"); + emitWarning(stmt, "Pass a context object as 3rd singleShot parameter"); } } } + +void Connect3ArgLambda::processQMenu(FunctionDecl *func, Stmt *stmt) +{ + // Signatures to catch: + // QMenu::addAction(const QString &text, Func1 slot, const QKeySequence &shortcut = 0) + const uint numParams = func->getNumParams(); + if (numParams == 3) { + if (func->getParamDecl(0)->getNameAsString() == "text" && + func->getParamDecl(1)->getNameAsString() == "slot" && + func->getParamDecl(2)->getNameAsString() == "shortcut") { + emitWarning(stmt, "Pass a context object as 2nd singleShot parameter"); + } + } +} diff --git a/src/checks/level1/connect-3arg-lambda.h b/src/checks/level1/connect-3arg-lambda.h index 66f3d3ff..13c819dd 100644 --- a/src/checks/level1/connect-3arg-lambda.h +++ b/src/checks/level1/connect-3arg-lambda.h @@ -35,6 +35,7 @@ public: void VisitStmt(clang::Stmt *stmt) override; private: void processQTimer(clang::FunctionDecl *, clang::Stmt *); + void processQMenu(clang::FunctionDecl *, clang::Stmt *); }; #endif -- cgit v1.2.3