| 292 | } |
| 293 | |
| 294 | void QtSupport::visitCallExpr(clang::CallExpr* e) |
| 295 | { |
| 296 | clang::CXXMethodDecl *methodDecl = clang::dyn_cast_or_null<clang::CXXMethodDecl>(e->getCalleeDecl()); |
| 297 | if (!methodDecl || !methodDecl->getDeclName().isIdentifier() || !methodDecl->getParent()) |
| 298 | return; |
| 299 | if (!methodDecl->getParent()->getDeclName().isIdentifier()) |
| 300 | return; |
| 301 | |
| 302 | auto parentName = methodDecl->getParent()->getName(); |
| 303 | |
| 304 | if (!parentName.startswith("Q")) |
| 305 | return; // only Qt classes |
| 306 | |
| 307 | if (parentName == "QObject" |
| 308 | && (methodDecl->getName() == "connect" || methodDecl->getName() == "disconnect")) { |
| 309 | // We have a call to QObject::connect or disconnect |
| 310 | if (methodDecl->isStatic()) { |
| 311 | if (e->getNumArgs() >= 4) { |
| 312 | handleSignalOrSlot(e->getArg(0), e->getArg(1)); |
| 313 | handleSignalOrSlot(e->getArg(2), e->getArg(3)); |
| 314 | } |
| 315 | } else if (clang::CXXMemberCallExpr *me = clang::dyn_cast<clang::CXXMemberCallExpr>(e)) { |
| 316 | if (e->getNumArgs() >= 3) { |
| 317 | handleSignalOrSlot(e->getArg(0), e->getArg(1)); |
| 318 | handleSignalOrSlot(me->getImplicitObjectArgument(), e->getArg(2)); |
| 319 | } |
| 320 | } |
| 321 | } |
| 322 | if (parentName == "QTimer" && methodDecl->getName() == "singleShot") { |
| 323 | if (e->getNumArgs() >= 3) { |
| 324 | handleSignalOrSlot(e->getArg(1), e->getArg(2)); |
| 325 | } |
| 326 | } |
| 327 | if (parentName == "QHostInfo" && methodDecl->getName() == "lookupHost") { |
| 328 | if (e->getNumArgs() >= 3) { |
| 329 | handleSignalOrSlot(e->getArg(1), e->getArg(2)); |
| 330 | } |
| 331 | } |
| 332 | if (parentName == "QNetworkAccessCache" && methodDecl->getName() == "requestEntry") { |
| 333 | if (e->getNumArgs() >= 3) { |
| 334 | handleSignalOrSlot(e->getArg(1), e->getArg(2)); |
| 335 | } |
| 336 | } |
| 337 | if (parentName == "QDBusAbstractInterface" && methodDecl->getName() == "callWithCallback") { |
| 338 | if (e->getNumArgs() == 4) { |
| 339 | handleSignalOrSlot(e->getArg(2), e->getArg(3)); |
| 340 | } else if (e->getNumArgs() == 5) { |
| 341 | handleSignalOrSlot(e->getArg(2), e->getArg(3)); |
| 342 | handleSignalOrSlot(e->getArg(2), e->getArg(4)); |
| 343 | } |
| 344 | } |
| 345 | if (methodDecl->getName() == "open" && ( |
| 346 | parentName == "QFileDialog" || |
| 347 | parentName == "QColorDialog" || |
| 348 | parentName == "QFontDialog" || |
| 349 | parentName == "QMessageBox" || |
| 350 | parentName == "QInputDialog" || |
| 351 | parentName == "QPrintDialog" || |