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

0001 /*
0002     SPDX-FileCopyrightText: 2017 Sergio Martins <smartins@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "connect-by-name.h"
0008 #include "AccessSpecifierManager.h"
0009 #include "ClazyContext.h"
0010 #include "clazy_stl.h"
0011 
0012 #include <clang/AST/DeclCXX.h>
0013 #include <clang/Basic/LLVM.h>
0014 #include <llvm/Support/Casting.h>
0015 
0016 #include <vector>
0017 
0018 namespace clang
0019 {
0020 class Decl;
0021 } // namespace clang
0022 
0023 using namespace clang;
0024 
0025 ConnectByName::ConnectByName(const std::string &name, ClazyContext *context)
0026     : CheckBase(name, context)
0027 {
0028     context->enableAccessSpecifierManager();
0029 }
0030 
0031 void ConnectByName::VisitDecl(clang::Decl *decl)
0032 {
0033     auto *record = dyn_cast<CXXRecordDecl>(decl);
0034     if (!record) {
0035         return;
0036     }
0037 
0038     AccessSpecifierManager *accessSpecifierManager = m_context->accessSpecifierManager;
0039     if (!accessSpecifierManager) {
0040         return;
0041     }
0042 
0043     for (auto *method : record->methods()) {
0044         std::string name = method->getNameAsString();
0045         if (clazy::startsWith(name, "on_")) {
0046             QtAccessSpecifierType qst = accessSpecifierManager->qtAccessSpecifierType(method);
0047             if (qst == QtAccessSpecifier_Slot) {
0048                 auto tokens = clazy::splitString(name, '_');
0049                 if (tokens.size() == 3) {
0050                     emitWarning(method, "Slots named on_foo_bar are error prone");
0051                 }
0052             }
0053         }
0054     }
0055 }