File indexing completed on 2024-05-05 05:41:37

0001 #include <QtCore/QObject>
0002 #include <QtDBus/QDBusPendingReply>
0003 #include <memory>
0004 struct A {};
0005 struct NonNamespacedGadget {
0006     Q_GADGET
0007 };
0008 
0009 namespace NS {
0010     struct MyType {};
0011 
0012     struct NamespacedGadget {
0013         Q_GADGET
0014     };
0015 
0016     enum EnumFoo { EnumFoo1 };
0017 
0018     class MyObject : public QObject
0019     {
0020         Q_OBJECT
0021         Q_PROPERTY(NS::MyType foo READ foo) // OK, not gadget
0022         Q_PROPERTY(MyType foo1 READ foo) // OK, not gadget
0023         Q_PROPERTY(EnumFoo enumFoo READ enumFoo CONSTANT) // OK
0024         Q_PROPERTY(NamespacedGadget namespacedGadget READ namespacedGadget CONSTANT) // Warn, gadget
0025         Q_PROPERTY(NS::NamespacedGadget namespacedGadget2 READ namespacedGadget2 CONSTANT) // OK
0026         Q_PROPERTY(NonNamespacedGadget nonNamespacedGadget READ nonNamespacedGadget CONSTANT) // OK
0027     Q_SIGNALS:
0028         void mysig(NS::MyType);
0029         void mysig2(MyType &); // Warn
0030         void mysig3(NS::MyType);
0031         void mysig4(const NS::MyType &);
0032         void mysig5(A);
0033         void mysig6(const A);
0034         void mysig7(const A *);
0035         void mysig8(A *);
0036     public Q_SLOTS:
0037         void myslot1(NS::MyType);
0038         void myslot2(MyType); // Warn
0039         void myslot3(NS::MyType);
0040         void myslot4(const NS::MyType &);
0041         void myslot5(A);
0042         void myslot6(const A);
0043         void myslot7(const A *);
0044         void myslot8(A *);
0045     public:
0046         Q_INVOKABLE void myinvokable1(NS::MyType);
0047         Q_INVOKABLE void myinvokable2(MyType); // Warn
0048         Q_INVOKABLE void myinvokable3(NS::MyType);
0049         Q_INVOKABLE void myinvokable4(const NS::MyType &);
0050         Q_INVOKABLE void myinvokable5(A);
0051         Q_INVOKABLE void myinvokable6(const A);
0052         Q_INVOKABLE void myinvokable7(const A *);
0053         Q_INVOKABLE void myinvokable8(A *);
0054         Q_INVOKABLE MyType* myinvokable9(NS::MyType); // Warn
0055         NS::MyType foo();
0056         NamespacedGadget namespacedGadget() const;
0057         NamespacedGadget namespacedGadget2() const;
0058         NonNamespacedGadget nonNamespacedGadget() const;
0059         EnumFoo enumFoo() const;
0060     };
0061 }
0062 
0063 
0064 
0065 namespace { // annonymous
0066     struct AnnonFoo {};
0067 };
0068 
0069 using namespace std; // pair<bool,QualMe> is returned for one method, the check should warn about the missing "std::" prefix
0070 class MyObj2 : public QObject
0071 {
0072 public:
0073     struct QualMe {};
0074     using MyList = QList<QualMe>; // QualMe is not fully qualified here, but it shouldn't matter when using the typedef
0075 Q_OBJECT
0076 Q_SIGNALS:
0077     void mySig(AnnonFoo);
0078 public Q_SLOTS:
0079     inline std::pair<bool,QualMe> unqualPairParam() {return {};} // Warn
0080     inline pair<bool,QualMe> unqualPairClass() {return {};} // Warn
0081     inline std::pair<bool, MyObj2::QualMe> fullyQUalPair() {return {};} // OK
0082     inline MyList typeAlias() {return {};} // WARN
0083     inline QList<QualMe> genericWithoutFullyQual() {return {};} // WARN
0084     inline QList<MyObj2::QualMe> genericFullyQual() {return {};} // OK
0085     inline QStringList qstringListTypealias() {return {};} // OK
0086     inline MyObj2::MyList fullTypeAlias() {return {};} // OK
0087     inline QDBusPendingReply<QualMe> unqualGenericDbusReply() {return {};} // WARN
0088     inline QDBusPendingReply<bool> boolDbusReply() {return {};} // OK
0089     inline QDBusPendingReply<> voidDbusReply() {return {};} // OK
0090     inline QDBusPendingReply<MyList> typedefInGeneric() {return {};} // WARN
0091     inline void nestedGeneric(QDBusPendingReply<std::shared_ptr<MyObj2>>) {} // OK
0092     inline void nestedNotFullyQualifiedGeneric(QDBusPendingReply<std::shared_ptr<MyList>>) {} // WARN
0093     inline const MyList& notQualWithModifier() {return lst;};
0094 private:
0095     MyList lst;
0096 };
0097 
0098 Q_DECLARE_METATYPE(MyObj2::QualMe);
0099 Q_DECLARE_METATYPE(std::shared_ptr<MyObj2::MyList>);
0100 
0101 #if QT_VERSION_MAJOR == 5
0102 #include "main.qt5.moc_"
0103 #else
0104 #include "main.qt6.moc_"
0105 #endif