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 }