File indexing completed on 2024-05-12 17:13:17

0001 /*
0002   This file is part of the clazy static checker.
0003 
0004     Copyright (C) 2019 Jean-Michaƫl Celerier <jeanmichael.celerier@gmail.com>
0005 
0006     This library is free software; you can redistribute it and/or
0007     modify it under the terms of the GNU Library General Public
0008     License as published by the Free Software Foundation; either
0009     version 2 of the License, or (at your option) any later version.
0010 
0011     This library is distributed in the hope that it will be useful,
0012     but WITHOUT ANY WARRANTY; without even the implied warranty of
0013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014     Library General Public License for more details.
0015 
0016     You should have received a copy of the GNU Library General Public License
0017     along with this library; see the file COPYING.LIB.  If not, write to
0018     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0019     Boston, MA 02110-1301, USA.
0020 */
0021 
0022 #ifndef CLAZY_QPROPERTY_TYPE_MISMATCH_H
0023 #define CLAZY_QPROPERTY_TYPE_MISMATCH_H
0024 
0025 #include "checkbase.h"
0026 
0027 #include <clang/Basic/SourceLocation.h>
0028 
0029 #include <vector>
0030 #include <string>
0031 #include <unordered_map>
0032 
0033 class ClazyContext;
0034 namespace clang {
0035 class CXXMethodDecl;
0036 class FieldDecl;
0037 class Decl;
0038 class MacroInfo;
0039 class Token;
0040 class TypeAliasDecl;
0041 }  // namespace clang
0042 
0043 /**
0044  * See README-qproperty-type-mismatch.md for more info.
0045  */
0046 class QPropertyTypeMismatch
0047     : public CheckBase
0048 {
0049 public:
0050     explicit QPropertyTypeMismatch(const std::string &name, ClazyContext *context);
0051     void VisitDecl(clang::Decl *) override;
0052 private:
0053     void VisitMethod(const clang::CXXMethodDecl &);
0054     void VisitField(const clang::FieldDecl &);
0055     void VisitTypedef(const clang::TypedefNameDecl *);
0056 
0057     void VisitMacroExpands(const clang::Token &MacroNameTok,
0058                            const clang::SourceRange &range, const clang::MacroInfo *minfo = nullptr) override;
0059 
0060     struct Property
0061     {
0062         clang::SourceLocation loc;
0063         bool member{};
0064         std::string name;
0065         std::string type;
0066         std::string read;
0067         std::string write;
0068         std::string notify;
0069     };
0070 
0071     std::vector<Property> m_qproperties;
0072     std::string cleanupType(clang::QualType type, bool unscoped = false) const;
0073     void checkMethodAgainstProperty(const Property &prop, const clang::CXXMethodDecl &method, const std::string &methodName);
0074     void checkFieldAgainstProperty(const Property &prop, const clang::FieldDecl &method, const std::string &methodName);
0075 
0076     bool typesMatch(const std::string &type1, clang::QualType type2Qt, std::string &type2Cleaned) const;
0077     std::unordered_map<std::string, clang::QualType> m_typedefMap;
0078 };
0079 
0080 #endif