1 /*
2  * DQt - D bindings for the Qt Toolkit
3  *
4  * GNU Lesser General Public License Usage
5  * This file may be used under the terms of the GNU Lesser
6  * General Public License version 3 as published by the Free Software
7  * Foundation and appearing in the file LICENSE.LGPL3 included in the
8  * packaging of this file. Please review the following information to
9  * ensure the GNU Lesser General Public License version 3 requirements
10  * will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
11  */
12 module qt.core.metamacros;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.bytearray;
17 import qt.core.object;
18 import qt.core.objectdefs;
19 import qt.core.point;
20 import qt.core.string;
21 import qt.helpers;
22 import std.traits;
23 import std.meta;
24 
25 static if(!defined!"Q_MOC_OUTPUT_REVISION")
26 {
27 /+ #define Q_MOC_OUTPUT_REVISION 68 +/
28 }
29 static if(false)
30 {
31 /+ # define QT_ANNOTATE_CLASS(type, ...)
32 # define QT_ANNOTATE_CLASS2(type, a1, a2)
33 # define QT_ANNOTATE_FUNCTION(x)
34 # define QT_ANNOTATE_ACCESS_SPECIFIER(x)
35 #  define QT_NO_EMIT +/
36 }
37 /+ #     define slots Q_SLOTS
38 #     define signals Q_SIGNALS
39 # define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
40 # define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
41 # define Q_PRIVATE_SLOT(d, signature) QT_ANNOTATE_CLASS2(qt_private_slot, d, signature)
42 # define Q_EMIT
43 # define emit +/
44 static if(!defined!"Q_CLASSINFO")
45 {
46 /+ # define Q_CLASSINFO(name, value) +/
47 }
48 /+ #define Q_PLUGIN_METADATA(x) QT_ANNOTATE_CLASS(qt_plugin_metadata, x)
49 #define Q_INTERFACES(x) QT_ANNOTATE_CLASS(qt_interfaces, x)
50 #define Q_PROPERTY(...) QT_ANNOTATE_CLASS(qt_property, __VA_ARGS__)
51 #define Q_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_private_property, d, text) +/
52 static if(!defined!"Q_REVISION")
53 {
54 /+ # define Q_REVISION(...) +/
55 }
56 /+ #define Q_OVERRIDE(text) QT_ANNOTATE_CLASS(qt_override, text)
57 #define QDOC_PROPERTY(text) QT_ANNOTATE_CLASS(qt_qdoc_property, text)
58 #define Q_ENUMS(x) QT_ANNOTATE_CLASS(qt_enums, x)
59 #define Q_FLAGS(x) QT_ANNOTATE_CLASS(qt_enums, x)
60 #define Q_ENUM_IMPL(ENUM) \
61     friend constexpr const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \
62     friend constexpr const char *qt_getEnumName(ENUM) noexcept { return #ENUM; }
63 #define Q_ENUM(x) Q_ENUMS(x) Q_ENUM_IMPL(x)
64 #define Q_FLAG(x) Q_FLAGS(x) Q_ENUM_IMPL(x)
65 #define Q_ENUM_NS_IMPL(ENUM) \
66     inline constexpr const QMetaObject *qt_getEnumMetaObject(ENUM) noexcept { return &staticMetaObject; } \
67     inline constexpr const char *qt_getEnumName(ENUM) noexcept { return #ENUM; }
68 #define Q_ENUM_NS(x) Q_ENUMS(x) Q_ENUM_NS_IMPL(x)
69 #define Q_FLAG_NS(x) Q_FLAGS(x) Q_ENUM_NS_IMPL(x)
70 #define Q_SCRIPTABLE QT_ANNOTATE_FUNCTION(qt_scriptable)
71 #define Q_INVOKABLE  QT_ANNOTATE_FUNCTION(qt_invokable)
72 #define Q_SIGNAL QT_ANNOTATE_FUNCTION(qt_signal)
73 #define Q_SLOT QT_ANNOTATE_FUNCTION(qt_slot)
74 #define Q_MOC_INCLUDE(...) QT_ANNOTATE_CLASS(qt_moc_include, __VA_ARGS__) +/
75 version(QT_NO_TRANSLATION){}else
76 {
77 /+ #  define QT_TR_FUNCTIONS \
78     static inline QString tr(const char *s, const char *c = nullptr, int n = -1) \
79         { return staticMetaObject.tr(s, c, n); } +/
80 enum QT_TR_FUNCTIONS =
81         q{pragma(inline, true) static dqtimported!"qt.core.string".QString tr(const(char)* s, const(char)* c = null, int n = -1)
82             { return staticMetaObject.tr(s, c, n); }};
83 }
84 version(QT_NO_TRANSLATION)
85 {
86 /+ # define QT_TR_FUNCTIONS +/
87 }
88 static if(false)
89 {
90 /+ #define QT_TR_FUNCTIONS
91 # define Q_DECL_HIDDEN_STATIC_METACALL +/
92 }
93 /+ # define Q_DECL_HIDDEN_STATIC_METACALL Q_DECL_HIDDEN +/
94 static if(false)
95 {
96 /+ #  define Q_OBJECT_NO_OVERRIDE_WARNING      QT_WARNING_DISABLE_CLANG("-Winconsistent-missing-override") +/
97 }
98 /+ #  define Q_OBJECT_NO_OVERRIDE_WARNING      QT_WARNING_DISABLE_GCC("-Wsuggest-override") +/
99 static if(false)
100 {
101 /+ #  define Q_OBJECT_NO_OVERRIDE_WARNING +/
102 }
103 /+ #  define Q_OBJECT_NO_ATTRIBUTES_WARNING    QT_WARNING_DISABLE_GCC("-Wattributes") +/
104 static if(false)
105 {
106 /+ #  define Q_OBJECT_NO_ATTRIBUTES_WARNING +/
107 }
108 /+ #define Q_OBJECT \
109 public: \
110     QT_WARNING_PUSH \
111     Q_OBJECT_NO_OVERRIDE_WARNING \
112     static const QMetaObject staticMetaObject; \
113     virtual const QMetaObject *metaObject() const; \
114     virtual void *qt_metacast(const char *); \
115     virtual int qt_metacall(QMetaObject::Call, int, void **); \
116     QT_TR_FUNCTIONS \
117 private: \
118     Q_OBJECT_NO_ATTRIBUTES_WARNING \
119     Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
120     QT_WARNING_POP \
121     struct QPrivateSignal {}; \
122     QT_ANNOTATE_CLASS(qt_qobject, "") +/
123 enum Q_OBJECT =
124 q{    public:
125         /+ QT_WARNING_PUSH
126         Q_OBJECT_NO_OVERRIDE_WARNING +/
127         static import qt.core.objectdefs;
128         extern(C++) extern } ~ exportOnWindows ~ q{static __gshared const(qt.core.objectdefs.QMetaObject) staticMetaObject;
129         extern(C++) override /+ virtual +/ const(qt.core.objectdefs.QMetaObject)* metaObject() const;
130         extern(C++) override /+ virtual +/ void* qt_metacast(const(char)* );
131         extern(C++) override /+ virtual +/ int qt_metacall(qt.core.objectdefs.QMetaObject.Call, int, void** );
132         } ~ QT_TR_FUNCTIONS ~ q{
133     private:
134         /+ Q_OBJECT_NO_ATTRIBUTES_WARNING +/
135         /+ Q_DECL_HIDDEN_STATIC_METACALL +/ static void qt_static_metacall(dqtimported!"qt.core.object".QObject , qt.core.objectdefs.QMetaObject.Call, int, void** );
136         /+ QT_WARNING_POP +/
137         extern(C++) struct QPrivateSignal {}};
138         /+ QT_ANNOTATE_CLASS(qt_qobject, "") +/
139 
140 
141 struct CPPMemberFunctionPointer(T)
142 {
143     void *ptr;
144     uint adj;
145 }
146 
147 template memberFunctionExternDeclaration(alias F)
148 {
149     version(Windows)
150     mixin((){
151             string code;
152             version(Windows)
153                 static if(IsInQtPackage!(F))
154                     code ~= "export ";
155             code ~= "extern(" ~ functionLinkage!F ~ ")";
156             code ~= q{pragma(mangle, F.mangleof) ReturnType!F memberFunctionExternDeclaration(__traits(parent, F), Parameters!F);};
157             return code;
158         }());
159     else
160         alias memberFunctionExternDeclaration = F;
161 }
162 
163 enum NotIsConstructor(alias F) = __traits(identifier, F) != "__ctor";
164 
165 template MetaObjectImpl(T)
166 {
167     import qt.core.refcount;
168     import qt.core.metatype;
169     extern(D):
170 
171     alias Overloads(string name) = __traits(getOverloads, T, name);
172     //pragma(msg, staticMap!(Overloads, __traits(derivedMembers, T)));
173     alias allFunctions = Filter!(NotIsConstructor, staticMap!(Overloads, __traits(derivedMembers, T)));
174     alias allSignals = Filter!(IsQSignal, allFunctions);
175     alias allSlots = Filter!(IsQSlot, allFunctions);
176     alias allInvokables = Filter!(IsQInvokable, allFunctions);
177     alias allMethods = std.meta.AliasSeq!(allSignals, allSlots, allInvokables);
178 
179     /*pragma(msg, allSignals);
180     pragma(msg, allSlots);
181     pragma(msg, allInvokables);*/
182 
183     template signalIndex(alias F)
184     {
185         enum signalIndex = staticIndexOf!(F, allSignals);
186     }
187 
188     enum CODE = (){
189         import std.conv;
190 
191         string concatenatedStrings;
192         string stringLiteralsCode;
193         size_t numStrings;
194         size_t[string] stringCache;
195 
196         size_t addString(string s)
197         {
198             if(s in stringCache)
199                 return stringCache[s];
200             stringLiteralsCode ~= text("cast(uint)(stringdata_t.stringdata0.offsetof + ", concatenatedStrings.length, "), ", s.length, ",\n");
201             concatenatedStrings ~= s;
202             concatenatedStrings ~= "\0";
203             stringCache[s] = numStrings;
204             return numStrings++;
205         }
206 
207         addString(__traits(identifier, T));
208 
209         size_t currentOutputIndex = 0;
210         size_t initialMetatypeOffsets = 0;
211         string metaTypes;
212 
213         currentOutputIndex += 14;
214 
215         size_t methodsStartIndex = currentOutputIndex;
216 
217         string metaDataCode = mixin(interpolateMixin(q{
218              // content:
219                    9,       // revision
220                    0,       // classname
221                    0,    0, // classinfo
222                    $(text(allMethods.length)),   $(text(methodsStartIndex)), // methods
223                    0,    0, // properties
224                    0,    0, // enums/sets
225                    0,    0, // constructors
226                    0,       // flags
227                    $(text(allSignals.length)),       // signalCount
228 
229         }));
230 
231         assert(methodsStartIndex == currentOutputIndex);
232         currentOutputIndex += 6 * allMethods.length;
233 
234         string typeToMeta(T2)()
235         {
236             import qt.core.list: QList;
237             import qt.core.vector: QVector;
238             static if(is(T2 == int))
239                 return "QMetaType.Type.Int";
240             else static if(is(T2 == uint))
241                 return "QMetaType.Type.UInt";
242             else static if(is(T2 == bool))
243                 return "QMetaType.Type.Bool";
244             else static if(is(T2 == double))
245                 return "QMetaType.Type.Double";
246             else static if(is(const(T2) == const(QString)))
247                 return "QMetaType.Type.QString";
248             else static if(is(const(T2) == const(QList!int)))
249                 return text("0x80000000 | ", addString("QList<int>"));
250             else static if(is(const(T2) == const(QVector!int)))
251                 return text("0x80000000 | ", addString("QVector<int>"));
252             else static if(is(const(T2) == const(QPoint)))
253                 return "QMetaType.Type.QPoint";
254             else static if(is(T2 == int*))
255                 return text("0x80000000 | ", addString("int*"));
256             else static if(is(T2 == class) && __traits(getLinkage, T2) == "C++")
257                 return text("0x80000000 | ", addString(__traits(identifier, T2) ~ "*"));
258             else
259                 static assert("TODO: Type not yet supported ", T2.stringof);
260         }
261 
262         void addMethods(M...)(string typename, uint type)
263         {
264             if(M.length)
265                 metaDataCode ~= "    // " ~ typename ~ ": name, argc, parameters, tag, flags, initial metatype offsets\n";
266             static foreach(i; 0..M.length)
267             {{
268                 size_t nameId = addString(__traits(identifier, M[i]));
269                 size_t parameterCount = Parameters!(M[i]).length;
270                 uint flags;
271                 flags |= 2; // Public // TODO
272                 if(typename == "signals")
273                     flags |= 4;
274                 if(typename == "slots")
275                     flags |= 8;
276                 metaDataCode ~= mixin(interpolateMixin(q{
277                        $(text(nameId)),    $(text(parameterCount)),   $(text(currentOutputIndex)),    2, $(text(flags)), $(text(initialMetatypeOffsets)), $("// " ~ __traits(identifier, M[i]))
278                 }));
279                 currentOutputIndex += 1 + 2 * parameterCount;
280                 initialMetatypeOffsets += 1 + parameterCount;
281                 foreach(j; 0 .. 1 + parameterCount)
282                     metaTypes ~= ", null";
283             }}
284         }
285         addMethods!(allSignals)("signals", 4);
286         addMethods!(allSlots)("slots", 8);
287         addMethods!(allInvokables)("methods", 0);
288         void addMethodParameters(M...)(string typename)
289         {
290             if(M.length)
291                 metaDataCode ~= "    // " ~ typename ~ ": parameters\n";
292             static foreach(i; 0..M.length)
293             {
294                 metaDataCode ~= "                    QMetaType.Type.Void, "; // TODO: correct return type
295                 foreach(P; Parameters!(M[i]))
296                     metaDataCode ~= typeToMeta!(P) ~ ", ";
297                 foreach(j, P; Parameters!(M[i]))
298                     metaDataCode ~= text(addString(ParameterIdentifierTuple!(M[i])[j]), ", ");
299                 metaDataCode ~= "// " ~ __traits(identifier, M[i]) ~ "\n";
300             }
301         }
302         addMethodParameters!(allSignals)("signals");
303         addMethodParameters!(allSlots)("slots");
304         addMethodParameters!(allInvokables)("methods");
305 
306         addString("");
307 
308         string concatenatedStringsCode = "\"";
309         foreach(char c; concatenatedStrings)
310         {
311             if(c == '\0')
312                 concatenatedStringsCode ~= "\\0";
313             else if(c == '\\')
314                 concatenatedStringsCode ~= "\\\\";
315             else if(c == '\n')
316                 concatenatedStringsCode ~= "\\n";
317             else if(c == '\r')
318                 concatenatedStringsCode ~= "\\r";
319             else if(c == '\"')
320                 concatenatedStringsCode ~= "\\\"";
321             else if(c == '\'')
322                 concatenatedStringsCode ~= "\\\'";
323             else
324                 concatenatedStringsCode ~= c;
325         }
326         concatenatedStringsCode ~= "\"";
327 
328         return mixin(interpolateMixin(q{
329             extern(C++) struct stringdata_t {
330                 uint[$(text(numStrings*2))] offsetsAndSize;
331                 char[$(text(concatenatedStrings.length))] stringdata0;
332             };
333 
334             extern(C++) static __gshared const stringdata_t stringdata = {
335                 [
336                     $(stringLiteralsCode)
337                 ],
338                 $(concatenatedStringsCode)
339             };
340 
341             extern(C++) static __gshared const uint[$(text(currentOutputIndex + 1))] meta_data = [
342                     $(metaDataCode)
343                    0        // eod
344             ];
345 
346             version(Windows)
347             {
348                 pragma(mangle, T.staticMetaObject.mangleof)
349                 extern(C++) static __gshared const(QMetaObject) staticMetaObject = { {
350                     null,
351                     &stringdata,
352                     meta_data.ptr,
353                     &T.qt_static_metacall,
354                     null,
355                     qt_incomplete_metaTypeArray!(stringdata_t$(metaTypes)).ptr,
356                     null
357                 } };
358                 shared static this()
359                 {
360                     // Necessary for Windows, because staticMetaObject from a DLL can't be used directly.
361                     (cast(QMetaObject*)&staticMetaObject).d.superdata.direct = &BaseClassesTuple!(T)[0].staticMetaObject;
362                 }
363             }
364             else
365             {
366                 pragma(mangle, T.staticMetaObject.mangleof)
367                 extern(C++) static __gshared const(QMetaObject) staticMetaObject = { {
368                     QMetaObject.SuperData.link!(BaseClassesTuple!(T)[0].staticMetaObject)(),
369                     &stringdata,
370                     meta_data.ptr,
371                     &T.qt_static_metacall,
372                     null,
373                     qt_incomplete_metaTypeArray!(stringdata_t$(metaTypes)).ptr,
374                     null
375                 } };
376             }
377         }));
378     }();
379     mixin(CODE);
380 }
381 
382 enum Q_OBJECT_D = q{
383     public:
384         static import qt.core.objectdefs;
385         extern(C++) extern static __gshared const(qt.core.objectdefs.QMetaObject) staticMetaObject;
386         extern(C++) override const(qt.core.objectdefs.QMetaObject)* metaObject() const
387         {
388             import qt.core.object;
389             return qt.core.object.QObject.d_ptr.metaObject ? qt.core.object.QObject.d_ptr.dynamicMetaObject() : &staticMetaObject;
390         }
391         extern(C++) override void * qt_metacast(const(char)* _clname)
392         {
393             import qt.core.metamacros;
394             import qt.core.objectdefs;
395             if (!_clname) return null;
396             import core.stdc.string;
397             if (!core.stdc..string.strcmp(_clname, qt.core.metamacros.MetaObjectImpl!(typeof(this)).stringdata.stringdata0.ptr))
398                 return static_cast!(void*)(this);
399             return super.qt_metacast(_clname);
400         }
401         extern(C++) override int qt_metacall(qt.core.objectdefs.QMetaObject.Call  _c, int _id, void **_a)
402         {
403             import qt.core.metamacros;
404             import qt.core.objectdefs;
405             _id = super.qt_metacall(_c, _id, _a);
406             if (_id < 0)
407                 return _id;
408             alias allMethods = qt.core.metamacros.MetaObjectImpl!(typeof(this)).allMethods;
409             if (_c == qt.core.objectdefs.QMetaObject.Call.InvokeMetaMethod) {
410                 if (_id < allMethods.length)
411                     qt_static_metacall(this, _c, _id, _a);
412                 _id -= allMethods.length;
413             } else if (_c == qt.core.objectdefs.QMetaObject.Call.RegisterMethodArgumentMetaType) {
414                 if (_id < allMethods.length)
415                     *reinterpret_cast!(int*)(_a[0]) = -1;
416                 _id -= allMethods.length;
417             }
418             return _id;
419         }
420         extern(C++) static void qt_static_metacall(dqtimported!"qt.core.object".QObject _o, qt.core.objectdefs.QMetaObject.Call _c, int _id, void **_a)
421         {
422             import qt.core.metamacros;
423             import qt.core.objectdefs;
424             if (_c == qt.core.objectdefs.QMetaObject.Call.InvokeMetaMethod) {
425                 alias allMethods = qt.core.metamacros.MetaObjectImpl!(typeof(this)).allMethods;
426                 import std.conv, std.traits;
427                 auto _t = static_cast!(typeof(this))(_o);
428                 //Q_UNUSED(_t)
429                 switch (_id) {
430                     mixin((){
431                             string methodCallCases;
432                             static foreach(i; 0..allMethods.length)
433                             {{
434                                 methodCallCases ~= text("\n                    case ", i, ": _t.", __traits(identifier, allMethods[i]), "(");
435                                 static foreach(j, P; Parameters!(allMethods[i]))
436                                 {
437                                     methodCallCases ~= text("*cast(Parameters!(allMethods[", i, "])[", j, "]*)(_a[", j + 1, "]), ");
438                                 }
439                                 methodCallCases ~= "); break;";
440                             }}
441                             return methodCallCases;
442                         }());
443                 default: {}
444                 }
445             } else if (_c == qt.core.objectdefs.QMetaObject.Call.RegisterMethodArgumentMetaType) {
446                 // TODO
447             } else if (_c == qt.core.objectdefs.QMetaObject.Call.IndexOfMethod) {
448                 alias allSignals = qt.core.metamacros.MetaObjectImpl!(typeof(this)).allSignals;
449                 int *result = reinterpret_cast!(int *)(_a[0]);
450                 static foreach(i; 0..allSignals.length)
451                 {{
452                     alias _t = qt.core.metamacros.CPPMemberFunctionPointer!(typeof(this));
453 
454                     auto fp = &memberFunctionExternDeclaration!(allSignals[i]);
455                     qt.core.metamacros.CPPMemberFunctionPointer!(typeof(this)) memberFunction = qt.core.metamacros.CPPMemberFunctionPointer!(typeof(this))(fp);
456 
457                     if (*reinterpret_cast!(_t *)(_a[1]) == memberFunction) {
458                         *result = i;
459                         return;
460                     }
461                 }}
462             }
463             //Q_UNUSED(_a);
464         }
465         } ~ QT_TR_FUNCTIONS ~ q{
466     private:
467         struct QPrivateSignal {}
468 };
469 
470 enum Q_SIGNAL_IMPL_D = q{
471     struct Dummy{}
472     import std.traits;
473     static import qt.core.objectdefs;
474     void*[std.traits.Parameters!(__traits(parent, Dummy)).length + 1] _a = mixin((){
475         string r = "[null";
476         static foreach(i; 0..std.traits.Parameters!(__traits(parent, Dummy)).length)
477             r ~= " , cast(void*)&" ~ std.traits.ParameterIdentifierTuple!(__traits(parent, Dummy))[i];
478         r ~= "]";
479         return r;
480         }());
481     qt.core.objectdefs.QMetaObject.activate(this, &staticMetaObject, dqtimported!q{qt.core.metamacros}.MetaObjectImpl!(typeof(this)).signalIndex!(__traits(parent, Dummy)), _a.ptr);
482 };
483 
484 /+ #define Q_OBJECT_FAKE Q_OBJECT QT_ANNOTATE_CLASS(qt_fake, "") +/
485 /+ #define Q_GADGET \
486 public: \
487     static const QMetaObject staticMetaObject; \
488     void qt_check_for_QGADGET_macro(); \
489     typedef void QtGadgetHelper; \
490 private: \
491     QT_WARNING_PUSH \
492     Q_OBJECT_NO_ATTRIBUTES_WARNING \
493     Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
494     QT_WARNING_POP \
495     QT_ANNOTATE_CLASS(qt_qgadget, "") \
496     /*end*/ +/
497 enum Q_GADGET =
498 q{    public:
499         static import qt.core.objectdefs;
500         extern(C++) extern } ~ exportOnWindows ~ q{static __gshared const(qt.core.objectdefs.QMetaObject) staticMetaObject;
501         /+ void qt_check_for_QGADGET_macro(); +/
502         alias QtGadgetHelper = void;
503     private:
504         /+ QT_WARNING_PUSH
505         Q_OBJECT_NO_ATTRIBUTES_WARNING +/
506         /+ Q_DECL_HIDDEN_STATIC_METACALL +/ static void qt_static_metacall(dqtimported!q{qt.core.object}.QObject , qt.core.objectdefs.QMetaObject.Call, int, void** );};
507         /+ QT_WARNING_POP
508         QT_ANNOTATE_CLASS(qt_qgadget, "") +/
509         /*end*/
510 /+ #define Q_NAMESPACE_EXPORT(...) \
511     extern __VA_ARGS__ const QMetaObject staticMetaObject; \
512     QT_ANNOTATE_CLASS(qt_qnamespace, "") \
513     /*end*/
514 #define Q_NAMESPACE Q_NAMESPACE_EXPORT() \
515     /*end*/ +/
516 static if(false)
517 {
518 /+ #define slots slots
519 #define signals signals
520 #define Q_SLOTS Q_SLOTS
521 #define Q_SIGNALS Q_SIGNALS
522 #define Q_CLASSINFO(name, value) Q_CLASSINFO(name, value)
523 #define Q_INTERFACES(x) Q_INTERFACES(x)
524 #define Q_PROPERTY(text) Q_PROPERTY(text)
525 #define Q_PRIVATE_PROPERTY(d, text) Q_PRIVATE_PROPERTY(d, text)
526 #define Q_PRIVATE_QPROPERTY(accessor, type, name, setter, ...) Q_PRIVATE_QPROPERTY(accessor, type, name, setter, __VA_ARGS__)
527 #define Q_PRIVATE_QPROPERTIES_BEGIN
528 #define Q_PRIVATE_QPROPERTY_IMPL(name)
529 #define Q_PRIVATE_QPROPERTIES_END
530 #define Q_REVISION(...) Q_REVISION(__VA_ARGS__)
531 #define Q_OVERRIDE(text) Q_OVERRIDE(text)
532 #define Q_ENUMS(x) Q_ENUMS(x)
533 #define Q_FLAGS(x) Q_FLAGS(x)
534 #define Q_ENUM(x) Q_ENUM(x)
535 #define Q_FLAGS(x) Q_FLAGS(x)
536 #define Q_OBJECT Q_OBJECT
537 #define Q_OBJECT_FAKE Q_OBJECT_FAKE
538 #define Q_GADGET Q_GADGET
539 #define Q_SCRIPTABLE Q_SCRIPTABLE
540 #define Q_INVOKABLE Q_INVOKABLE
541 #define Q_SIGNAL Q_SIGNAL
542 #define Q_SLOT Q_SLOT +/
543 }
544