From 566e5e1acf22ca566e9a256cab04acd1f7d06ce2 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 6 Mar 2023 12:04:15 +0100 Subject: [PATCH] moc: Allow anonymous properties This is private for now. It's very handy to have anonymous properties for the QML model/delegate adaptors. There are models with only "singular" model data that doesn't have any sub-properties. Such model data should be available from the model object via an empty string as role. This way we can get rid of a lot of special casing. Task-number: QTBUG-104752 Change-Id: I229e355a7cab064ee1c9f89557bc0244a5d0c90a Reviewed-by: Fabian Kosmale --- src/corelib/kernel/qobject_p.h | 8 + src/tools/moc/keywords.cpp | 404 +++++++++++++---------- src/tools/moc/moc.cpp | 26 +- src/tools/moc/moc.h | 12 +- src/tools/moc/token.h | 2 + src/tools/moc/util/generate_keywords.cpp | 2 + tests/auto/tools/moc/tst_moc.cpp | 51 +++ 7 files changed, 315 insertions(+), 190 deletions(-) diff --git a/src/corelib/kernel/qobject_p.h b/src/corelib/kernel/qobject_p.h index 650717219c..8d382c78ba 100644 --- a/src/corelib/kernel/qobject_p.h +++ b/src/corelib/kernel/qobject_p.h @@ -30,6 +30,14 @@ QT_BEGIN_NAMESPACE +#ifdef Q_MOC_RUN +#define QT_ANONYMOUS_PROPERTY(text) QT_ANONYMOUS_PROPERTY(text) +#define QT_ANONYMOUS_PRIVATE_PROPERTY(d, text) QT_ANONYMOUS_PRIVATE_PROPERTY(d, text) +#elif !defined QT_NO_META_MACROS +#define QT_ANONYMOUS_PROPERTY(...) QT_ANNOTATE_CLASS(qt_anonymous_property, __VA_ARGS__) +#define QT_ANONYMOUS_PRIVATE_PROPERTY(d, text) QT_ANNOTATE_CLASS2(qt_anonymous_private_property, d, text) +#endif + class QVariant; class QThreadData; class QObjectConnectionListVector; diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp index 9d82da7a26..6a1f58490f 100644 --- a/src/tools/moc/keywords.cpp +++ b/src/tools/moc/keywords.cpp @@ -5,12 +5,12 @@ // DO NOT EDIT. static const short keyword_trans[][128] = { - {0,0,0,0,0,0,0,0,0,586,583,0,0,0,0,0, + {0,0,0,0,0,0,0,0,0,618,615,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 586,252,584,587,8,38,239,585,25,26,236,234,30,235,27,237, + 618,252,616,619,8,38,239,617,25,26,236,234,30,235,27,237, 22,22,22,22,22,22,22,22,22,22,34,41,23,39,24,43, 0,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, - 8,21,8,8,8,8,8,8,8,8,8,31,589,32,238,8, + 8,21,8,8,8,8,8,8,8,8,8,31,621,32,238,8, 0,1,2,3,4,5,6,7,8,9,8,8,10,11,12,13, 14,8,15,16,17,18,19,20,8,8,8,36,245,37,248,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -91,7 +91,7 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,290,222,0,0,504,0,0,0, + 0,0,0,0,0,0,0,0,290,222,0,0,524,0,0,0, 0,0,0,0,55,0,0,330,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -130,7 +130,7 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,528,0,0,0,0,0,0,0,0,0,0,357, + 0,0,0,0,401,0,0,0,0,0,0,0,0,0,0,357, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -152,7 +152,7 @@ static const short keyword_trans[][128] = { {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,42,0,0,0,28,0, - 592,592,592,592,592,592,592,592,592,592,0,0,0,0,0,0, + 624,624,624,624,624,624,624,624,624,624,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -311,7 +311,7 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,591,0,0,0,0,590, + 0,0,0,0,0,0,0,0,0,0,623,0,0,0,0,622, 0,0,0,0,0,0,0,0,0,0,0,0,0,258,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -347,21 +347,21 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,501,0,0,0,300,0,0,0,0,0,0,0,0,0,0, + 0,521,0,0,0,300,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,482,431,415,423,380,0,491,0,0,0,572,364,358, - 393,0,564,479,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,502,451,435,443,380,0,511,0,0,0,604,364,358, + 393,0,596,499,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,401,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,421,0,0,0, 0,0,394,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, @@ -369,7 +369,23 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,518,0,0,0,0,0,395, + 0,0,0,0,0,0,0,0,0,538,0,0,0,0,0,395, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,403,0,0,0,0,0,0,0,0,0,0,0,548,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,582,0,0,0,0,0,415, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, @@ -378,7 +394,7 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,419,0,0,0,0,0,0,0,0,0,0,0,420, + 0,0,0,439,0,0,0,0,0,0,0,0,0,0,0,440, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -386,14 +402,14 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,427,0,0,0,0,0,0,0,0,0,0,0,428, + 0,0,0,447,0,0,0,0,0,0,0,0,0,0,0,448, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,461,439,0,0,444,0,0,0,453,0,0, + 0,0,0,0,0,481,459,0,0,464,0,0,0,473,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, @@ -401,7 +417,7 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,547,0,480,0,0,0,508,0,0,514,0,0,0, + 0,0,0,565,0,500,0,0,0,528,0,0,534,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, @@ -410,7 +426,7 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,493,0,540,0,0,0,0,0,0,0,0,0, + 0,0,0,0,513,0,558,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -418,7 +434,7 @@ static const short keyword_trans[][128] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 556,0,0,524,0,0,0,0,0,0,0,0,0,0,0,0, + 574,0,0,544,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; @@ -832,193 +848,225 @@ static const struct {CHARACTER, 0, 84, 399, CHARACTER}, {CHARACTER, 0, 89, 400, CHARACTER}, {Q_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 85, 402, CHARACTER}, - {CHARACTER, 0, 71, 403, CHARACTER}, - {CHARACTER, 0, 73, 404, CHARACTER}, - {CHARACTER, 0, 78, 405, CHARACTER}, - {CHARACTER, 0, 95, 406, CHARACTER}, - {CHARACTER, 0, 77, 407, CHARACTER}, - {CHARACTER, 0, 69, 408, CHARACTER}, - {CHARACTER, 0, 84, 409, CHARACTER}, - {CHARACTER, 0, 65, 410, CHARACTER}, - {CHARACTER, 0, 68, 411, CHARACTER}, - {CHARACTER, 0, 65, 412, CHARACTER}, - {CHARACTER, 0, 84, 413, CHARACTER}, - {CHARACTER, 0, 65, 414, CHARACTER}, + {CHARACTER, 0, 95, 402, CHARACTER}, + {CHARACTER, 46, 0, 0, CHARACTER}, + {CHARACTER, 0, 78, 404, CHARACTER}, + {CHARACTER, 0, 79, 405, CHARACTER}, + {CHARACTER, 0, 78, 406, CHARACTER}, + {CHARACTER, 0, 89, 407, CHARACTER}, + {CHARACTER, 0, 77, 408, CHARACTER}, + {CHARACTER, 0, 79, 409, CHARACTER}, + {CHARACTER, 0, 85, 410, CHARACTER}, + {CHARACTER, 0, 83, 411, CHARACTER}, + {CHARACTER, 0, 95, 412, CHARACTER}, + {CHARACTER, 0, 80, 413, CHARACTER}, + {CHARACTER, 0, 82, 414, CHARACTER}, + {CHARACTER, 47, 0, 0, CHARACTER}, + {CHARACTER, 0, 80, 416, CHARACTER}, + {CHARACTER, 0, 69, 417, CHARACTER}, + {CHARACTER, 0, 82, 418, CHARACTER}, + {CHARACTER, 0, 84, 419, CHARACTER}, + {CHARACTER, 0, 89, 420, CHARACTER}, + {QT_ANONYMOUS_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 85, 422, CHARACTER}, + {CHARACTER, 0, 71, 423, CHARACTER}, + {CHARACTER, 0, 73, 424, CHARACTER}, + {CHARACTER, 0, 78, 425, CHARACTER}, + {CHARACTER, 0, 95, 426, CHARACTER}, + {CHARACTER, 0, 77, 427, CHARACTER}, + {CHARACTER, 0, 69, 428, CHARACTER}, + {CHARACTER, 0, 84, 429, CHARACTER}, + {CHARACTER, 0, 65, 430, CHARACTER}, + {CHARACTER, 0, 68, 431, CHARACTER}, + {CHARACTER, 0, 65, 432, CHARACTER}, + {CHARACTER, 0, 84, 433, CHARACTER}, + {CHARACTER, 0, 65, 434, CHARACTER}, {Q_PLUGIN_METADATA_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 78, 416, CHARACTER}, - {CHARACTER, 0, 85, 417, CHARACTER}, - {CHARACTER, 0, 77, 418, CHARACTER}, - {Q_ENUM_TOKEN, 46, 0, 0, CHARACTER}, + {CHARACTER, 0, 78, 436, CHARACTER}, + {CHARACTER, 0, 85, 437, CHARACTER}, + {CHARACTER, 0, 77, 438, CHARACTER}, + {Q_ENUM_TOKEN, 48, 0, 0, CHARACTER}, {Q_ENUMS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 78, 421, CHARACTER}, - {CHARACTER, 0, 83, 422, CHARACTER}, + {CHARACTER, 0, 78, 441, CHARACTER}, + {CHARACTER, 0, 83, 442, CHARACTER}, {Q_ENUM_NS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 76, 424, CHARACTER}, - {CHARACTER, 0, 65, 425, CHARACTER}, - {CHARACTER, 0, 71, 426, CHARACTER}, - {Q_FLAG_TOKEN, 47, 0, 0, CHARACTER}, + {CHARACTER, 0, 76, 444, CHARACTER}, + {CHARACTER, 0, 65, 445, CHARACTER}, + {CHARACTER, 0, 71, 446, CHARACTER}, + {Q_FLAG_TOKEN, 49, 0, 0, CHARACTER}, {Q_FLAGS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 78, 429, CHARACTER}, - {CHARACTER, 0, 83, 430, CHARACTER}, + {CHARACTER, 0, 78, 449, CHARACTER}, + {CHARACTER, 0, 83, 450, CHARACTER}, {Q_FLAG_NS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 69, 432, CHARACTER}, - {CHARACTER, 0, 67, 433, CHARACTER}, - {CHARACTER, 0, 76, 434, CHARACTER}, - {CHARACTER, 0, 65, 435, CHARACTER}, - {CHARACTER, 0, 82, 436, CHARACTER}, - {CHARACTER, 0, 69, 437, CHARACTER}, - {CHARACTER, 0, 95, 438, CHARACTER}, - {CHARACTER, 48, 0, 0, CHARACTER}, - {CHARACTER, 0, 76, 440, CHARACTER}, - {CHARACTER, 0, 65, 441, CHARACTER}, - {CHARACTER, 0, 71, 442, CHARACTER}, - {CHARACTER, 0, 83, 443, CHARACTER}, + {CHARACTER, 0, 69, 452, CHARACTER}, + {CHARACTER, 0, 67, 453, CHARACTER}, + {CHARACTER, 0, 76, 454, CHARACTER}, + {CHARACTER, 0, 65, 455, CHARACTER}, + {CHARACTER, 0, 82, 456, CHARACTER}, + {CHARACTER, 0, 69, 457, CHARACTER}, + {CHARACTER, 0, 95, 458, CHARACTER}, + {CHARACTER, 50, 0, 0, CHARACTER}, + {CHARACTER, 0, 76, 460, CHARACTER}, + {CHARACTER, 0, 65, 461, CHARACTER}, + {CHARACTER, 0, 71, 462, CHARACTER}, + {CHARACTER, 0, 83, 463, CHARACTER}, {Q_DECLARE_FLAGS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 78, 445, CHARACTER}, - {CHARACTER, 0, 84, 446, CHARACTER}, - {CHARACTER, 0, 69, 447, CHARACTER}, - {CHARACTER, 0, 82, 448, CHARACTER}, - {CHARACTER, 0, 70, 449, CHARACTER}, - {CHARACTER, 0, 65, 450, CHARACTER}, - {CHARACTER, 0, 67, 451, CHARACTER}, - {CHARACTER, 0, 69, 452, CHARACTER}, - {Q_DECLARE_INTERFACE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 69, 454, CHARACTER}, - {CHARACTER, 0, 84, 455, CHARACTER}, - {CHARACTER, 0, 65, 456, CHARACTER}, - {CHARACTER, 0, 84, 457, CHARACTER}, - {CHARACTER, 0, 89, 458, CHARACTER}, - {CHARACTER, 0, 80, 459, CHARACTER}, - {CHARACTER, 0, 69, 460, CHARACTER}, - {Q_DECLARE_METATYPE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 88, 462, CHARACTER}, - {CHARACTER, 0, 84, 463, CHARACTER}, - {CHARACTER, 0, 69, 464, CHARACTER}, {CHARACTER, 0, 78, 465, CHARACTER}, - {CHARACTER, 0, 83, 466, CHARACTER}, - {CHARACTER, 0, 73, 467, CHARACTER}, - {CHARACTER, 0, 79, 468, CHARACTER}, - {CHARACTER, 0, 78, 469, CHARACTER}, - {CHARACTER, 0, 95, 470, CHARACTER}, - {CHARACTER, 0, 73, 471, CHARACTER}, - {CHARACTER, 0, 78, 472, CHARACTER}, - {CHARACTER, 0, 84, 473, CHARACTER}, + {CHARACTER, 0, 84, 466, CHARACTER}, + {CHARACTER, 0, 69, 467, CHARACTER}, + {CHARACTER, 0, 82, 468, CHARACTER}, + {CHARACTER, 0, 70, 469, CHARACTER}, + {CHARACTER, 0, 65, 470, CHARACTER}, + {CHARACTER, 0, 67, 471, CHARACTER}, + {CHARACTER, 0, 69, 472, CHARACTER}, + {Q_DECLARE_INTERFACE_TOKEN, 0, 0, 0, CHARACTER}, {CHARACTER, 0, 69, 474, CHARACTER}, - {CHARACTER, 0, 82, 475, CHARACTER}, - {CHARACTER, 0, 70, 476, CHARACTER}, - {CHARACTER, 0, 65, 477, CHARACTER}, - {CHARACTER, 0, 67, 478, CHARACTER}, - {CHARACTER, 0, 69, 452, CHARACTER}, - {CHARACTER, 49, 0, 0, CHARACTER}, - {CHARACTER, 0, 84, 481, CHARACTER}, - {CHARACTER, 0, 83, 427, CHARACTER}, - {CHARACTER, 0, 76, 483, CHARACTER}, - {CHARACTER, 0, 65, 484, CHARACTER}, - {CHARACTER, 0, 83, 485, CHARACTER}, + {CHARACTER, 0, 84, 475, CHARACTER}, + {CHARACTER, 0, 65, 476, CHARACTER}, + {CHARACTER, 0, 84, 477, CHARACTER}, + {CHARACTER, 0, 89, 478, CHARACTER}, + {CHARACTER, 0, 80, 479, CHARACTER}, + {CHARACTER, 0, 69, 480, CHARACTER}, + {Q_DECLARE_METATYPE_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 88, 482, CHARACTER}, + {CHARACTER, 0, 84, 483, CHARACTER}, + {CHARACTER, 0, 69, 484, CHARACTER}, + {CHARACTER, 0, 78, 485, CHARACTER}, {CHARACTER, 0, 83, 486, CHARACTER}, {CHARACTER, 0, 73, 487, CHARACTER}, - {CHARACTER, 0, 78, 488, CHARACTER}, - {CHARACTER, 0, 70, 489, CHARACTER}, - {CHARACTER, 0, 79, 490, CHARACTER}, - {Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 79, 488, CHARACTER}, + {CHARACTER, 0, 78, 489, CHARACTER}, + {CHARACTER, 0, 95, 490, CHARACTER}, + {CHARACTER, 0, 73, 491, CHARACTER}, {CHARACTER, 0, 78, 492, CHARACTER}, - {CHARACTER, 50, 0, 0, CHARACTER}, + {CHARACTER, 0, 84, 493, CHARACTER}, {CHARACTER, 0, 69, 494, CHARACTER}, {CHARACTER, 0, 82, 495, CHARACTER}, {CHARACTER, 0, 70, 496, CHARACTER}, {CHARACTER, 0, 65, 497, CHARACTER}, {CHARACTER, 0, 67, 498, CHARACTER}, - {CHARACTER, 0, 69, 499, CHARACTER}, - {CHARACTER, 0, 83, 500, CHARACTER}, - {Q_INTERFACES_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 108, 502, CHARACTER}, - {CHARACTER, 0, 115, 503, CHARACTER}, - {SIGNALS, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 111, 505, CHARACTER}, - {CHARACTER, 0, 116, 506, CHARACTER}, - {CHARACTER, 0, 115, 507, CHARACTER}, - {SLOTS, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 71, 509, CHARACTER}, - {CHARACTER, 0, 78, 510, CHARACTER}, - {CHARACTER, 0, 65, 511, CHARACTER}, - {CHARACTER, 0, 76, 512, CHARACTER}, - {Q_SIGNAL_TOKEN, 0, 83, 513, CHARACTER}, - {Q_SIGNALS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 79, 515, CHARACTER}, - {CHARACTER, 0, 84, 516, CHARACTER}, - {Q_SLOT_TOKEN, 0, 83, 517, CHARACTER}, - {Q_SLOTS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 86, 519, CHARACTER}, - {CHARACTER, 0, 65, 520, CHARACTER}, - {CHARACTER, 0, 84, 521, CHARACTER}, - {CHARACTER, 0, 69, 522, CHARACTER}, - {CHARACTER, 0, 95, 523, CHARACTER}, + {CHARACTER, 0, 69, 472, CHARACTER}, {CHARACTER, 51, 0, 0, CHARACTER}, - {CHARACTER, 0, 76, 525, CHARACTER}, - {CHARACTER, 0, 79, 526, CHARACTER}, - {CHARACTER, 0, 84, 527, CHARACTER}, - {Q_PRIVATE_SLOT_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 95, 529, CHARACTER}, - {CHARACTER, 0, 77, 530, CHARACTER}, - {CHARACTER, 0, 79, 531, CHARACTER}, - {CHARACTER, 0, 67, 532, CHARACTER}, - {CHARACTER, 0, 95, 533, CHARACTER}, - {CHARACTER, 0, 67, 534, CHARACTER}, + {CHARACTER, 0, 84, 501, CHARACTER}, + {CHARACTER, 0, 83, 447, CHARACTER}, + {CHARACTER, 0, 76, 503, CHARACTER}, + {CHARACTER, 0, 65, 504, CHARACTER}, + {CHARACTER, 0, 83, 505, CHARACTER}, + {CHARACTER, 0, 83, 506, CHARACTER}, + {CHARACTER, 0, 73, 507, CHARACTER}, + {CHARACTER, 0, 78, 508, CHARACTER}, + {CHARACTER, 0, 70, 509, CHARACTER}, + {CHARACTER, 0, 79, 510, CHARACTER}, + {Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 78, 512, CHARACTER}, + {CHARACTER, 52, 0, 0, CHARACTER}, + {CHARACTER, 0, 69, 514, CHARACTER}, + {CHARACTER, 0, 82, 515, CHARACTER}, + {CHARACTER, 0, 70, 516, CHARACTER}, + {CHARACTER, 0, 65, 517, CHARACTER}, + {CHARACTER, 0, 67, 518, CHARACTER}, + {CHARACTER, 0, 69, 519, CHARACTER}, + {CHARACTER, 0, 83, 520, CHARACTER}, + {Q_INTERFACES_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 108, 522, CHARACTER}, + {CHARACTER, 0, 115, 523, CHARACTER}, + {SIGNALS, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 111, 525, CHARACTER}, + {CHARACTER, 0, 116, 526, CHARACTER}, + {CHARACTER, 0, 115, 527, CHARACTER}, + {SLOTS, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 71, 529, CHARACTER}, + {CHARACTER, 0, 78, 530, CHARACTER}, + {CHARACTER, 0, 65, 531, CHARACTER}, + {CHARACTER, 0, 76, 532, CHARACTER}, + {Q_SIGNAL_TOKEN, 0, 83, 533, CHARACTER}, + {Q_SIGNALS_TOKEN, 0, 0, 0, CHARACTER}, {CHARACTER, 0, 79, 535, CHARACTER}, - {CHARACTER, 0, 77, 536, CHARACTER}, - {CHARACTER, 0, 80, 537, CHARACTER}, - {CHARACTER, 0, 65, 538, CHARACTER}, - {CHARACTER, 0, 84, 539, CHARACTER}, - {Q_MOC_COMPAT_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 79, 541, CHARACTER}, - {CHARACTER, 0, 75, 542, CHARACTER}, - {CHARACTER, 0, 65, 543, CHARACTER}, - {CHARACTER, 0, 66, 544, CHARACTER}, + {CHARACTER, 0, 84, 536, CHARACTER}, + {Q_SLOT_TOKEN, 0, 83, 537, CHARACTER}, + {Q_SLOTS_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 86, 539, CHARACTER}, + {CHARACTER, 0, 65, 540, CHARACTER}, + {CHARACTER, 0, 84, 541, CHARACTER}, + {CHARACTER, 0, 69, 542, CHARACTER}, + {CHARACTER, 0, 95, 543, CHARACTER}, + {CHARACTER, 53, 0, 0, CHARACTER}, {CHARACTER, 0, 76, 545, CHARACTER}, - {CHARACTER, 0, 69, 546, CHARACTER}, + {CHARACTER, 0, 79, 546, CHARACTER}, + {CHARACTER, 0, 84, 547, CHARACTER}, + {Q_PRIVATE_SLOT_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 79, 549, CHARACTER}, + {CHARACTER, 0, 67, 550, CHARACTER}, + {CHARACTER, 0, 95, 551, CHARACTER}, + {CHARACTER, 0, 67, 552, CHARACTER}, + {CHARACTER, 0, 79, 553, CHARACTER}, + {CHARACTER, 0, 77, 554, CHARACTER}, + {CHARACTER, 0, 80, 555, CHARACTER}, + {CHARACTER, 0, 65, 556, CHARACTER}, + {CHARACTER, 0, 84, 557, CHARACTER}, + {Q_MOC_COMPAT_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 79, 559, CHARACTER}, + {CHARACTER, 0, 75, 560, CHARACTER}, + {CHARACTER, 0, 65, 561, CHARACTER}, + {CHARACTER, 0, 66, 562, CHARACTER}, + {CHARACTER, 0, 76, 563, CHARACTER}, + {CHARACTER, 0, 69, 564, CHARACTER}, {Q_INVOKABLE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 82, 548, CHARACTER}, - {CHARACTER, 0, 73, 549, CHARACTER}, - {CHARACTER, 0, 80, 550, CHARACTER}, - {CHARACTER, 0, 84, 551, CHARACTER}, - {CHARACTER, 0, 65, 552, CHARACTER}, - {CHARACTER, 0, 66, 553, CHARACTER}, - {CHARACTER, 0, 76, 554, CHARACTER}, - {CHARACTER, 0, 69, 555, CHARACTER}, - {Q_SCRIPTABLE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 82, 557, CHARACTER}, - {CHARACTER, 0, 79, 558, CHARACTER}, - {CHARACTER, 0, 80, 559, CHARACTER}, - {CHARACTER, 0, 69, 560, CHARACTER}, - {CHARACTER, 0, 82, 561, CHARACTER}, - {CHARACTER, 0, 84, 562, CHARACTER}, - {CHARACTER, 0, 89, 563, CHARACTER}, - {Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 69, 565, CHARACTER}, - {CHARACTER, 0, 86, 566, CHARACTER}, + {CHARACTER, 0, 82, 566, CHARACTER}, {CHARACTER, 0, 73, 567, CHARACTER}, - {CHARACTER, 0, 83, 568, CHARACTER}, - {CHARACTER, 0, 73, 569, CHARACTER}, - {CHARACTER, 0, 79, 570, CHARACTER}, - {CHARACTER, 0, 78, 571, CHARACTER}, + {CHARACTER, 0, 80, 568, CHARACTER}, + {CHARACTER, 0, 84, 569, CHARACTER}, + {CHARACTER, 0, 65, 570, CHARACTER}, + {CHARACTER, 0, 66, 571, CHARACTER}, + {CHARACTER, 0, 76, 572, CHARACTER}, + {CHARACTER, 0, 69, 573, CHARACTER}, + {Q_SCRIPTABLE_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 82, 575, CHARACTER}, + {CHARACTER, 0, 79, 576, CHARACTER}, + {CHARACTER, 0, 80, 577, CHARACTER}, + {CHARACTER, 0, 69, 578, CHARACTER}, + {CHARACTER, 0, 82, 579, CHARACTER}, + {CHARACTER, 0, 84, 580, CHARACTER}, + {CHARACTER, 0, 89, 581, CHARACTER}, + {Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 86, 583, CHARACTER}, + {CHARACTER, 0, 65, 584, CHARACTER}, + {CHARACTER, 0, 84, 585, CHARACTER}, + {CHARACTER, 0, 69, 586, CHARACTER}, + {CHARACTER, 0, 95, 587, CHARACTER}, + {CHARACTER, 0, 80, 588, CHARACTER}, + {CHARACTER, 0, 82, 589, CHARACTER}, + {CHARACTER, 0, 79, 590, CHARACTER}, + {CHARACTER, 0, 80, 591, CHARACTER}, + {CHARACTER, 0, 69, 592, CHARACTER}, + {CHARACTER, 0, 82, 593, CHARACTER}, + {CHARACTER, 0, 84, 594, CHARACTER}, + {CHARACTER, 0, 89, 595, CHARACTER}, + {QT_ANONYMOUS_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 69, 597, CHARACTER}, + {CHARACTER, 0, 86, 598, CHARACTER}, + {CHARACTER, 0, 73, 599, CHARACTER}, + {CHARACTER, 0, 83, 600, CHARACTER}, + {CHARACTER, 0, 73, 601, CHARACTER}, + {CHARACTER, 0, 79, 602, CHARACTER}, + {CHARACTER, 0, 78, 603, CHARACTER}, {Q_REVISION_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 79, 573, CHARACTER}, - {CHARACTER, 0, 67, 574, CHARACTER}, - {CHARACTER, 0, 95, 575, CHARACTER}, - {CHARACTER, 0, 73, 576, CHARACTER}, - {CHARACTER, 0, 78, 577, CHARACTER}, - {CHARACTER, 0, 67, 578, CHARACTER}, - {CHARACTER, 0, 76, 579, CHARACTER}, - {CHARACTER, 0, 85, 580, CHARACTER}, - {CHARACTER, 0, 68, 581, CHARACTER}, - {CHARACTER, 0, 69, 582, CHARACTER}, + {CHARACTER, 0, 79, 605, CHARACTER}, + {CHARACTER, 0, 67, 606, CHARACTER}, + {CHARACTER, 0, 95, 607, CHARACTER}, + {CHARACTER, 0, 73, 608, CHARACTER}, + {CHARACTER, 0, 78, 609, CHARACTER}, + {CHARACTER, 0, 67, 610, CHARACTER}, + {CHARACTER, 0, 76, 611, CHARACTER}, + {CHARACTER, 0, 85, 612, CHARACTER}, + {CHARACTER, 0, 68, 613, CHARACTER}, + {CHARACTER, 0, 69, 614, CHARACTER}, {Q_MOC_INCLUDE_TOKEN, 0, 0, 0, CHARACTER}, {NEWLINE, 0, 0, 0, NOTOKEN}, {QUOTE, 0, 0, 0, NOTOKEN}, {SINGLEQUOTE, 0, 0, 0, NOTOKEN}, {WHITESPACE, 0, 0, 0, NOTOKEN}, - {HASH, 0, 35, 588, HASH}, + {HASH, 0, 35, 620, HASH}, {PP_HASHHASH, 0, 0, 0, NOTOKEN}, {BACKSLASH, 0, 0, 0, NOTOKEN}, {CPP_COMMENT, 0, 0, 0, NOTOKEN}, diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index cc6e1b59e5..64e98ae63b 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -862,7 +862,10 @@ void Moc::parse() error("Template classes not supported by Q_GADGET"); break; case Q_PROPERTY_TOKEN: - parseProperty(&def); + parseProperty(&def, Named); + break; + case QT_ANONYMOUS_PROPERTY_TOKEN: + parseProperty(&def, Anonymous); break; case Q_PLUGIN_METADATA_TOKEN: parsePluginData(&def); @@ -897,7 +900,10 @@ void Moc::parse() parseSlotInPrivate(&def, access); break; case Q_PRIVATE_PROPERTY_TOKEN: - parsePrivateProperty(&def); + parsePrivateProperty(&def, Named); + break; + case QT_ANONYMOUS_PRIVATE_PROPERTY_TOKEN: + parsePrivateProperty(&def, Anonymous); break; case ENUM: { EnumDef enumDef; @@ -1244,7 +1250,7 @@ void Moc::parseSignals(ClassDef *def) } } -void Moc::createPropertyDef(PropertyDef &propDef, int propertyIndex) +void Moc::createPropertyDef(PropertyDef &propDef, int propertyIndex, Moc::PropertyMode mode) { propDef.location = index; propDef.relativeIndex = propertyIndex; @@ -1274,8 +1280,10 @@ void Moc::createPropertyDef(PropertyDef &propDef, int propertyIndex) propDef.type = type; - next(); - propDef.name = lexem(); + if (mode == Moc::Named) { + next(); + propDef.name = lexem(); + } parsePropertyAttributes(propDef); } @@ -1416,11 +1424,11 @@ void Moc::parsePropertyAttributes(PropertyDef &propDef) } } -void Moc::parseProperty(ClassDef *def) +void Moc::parseProperty(ClassDef *def, Moc::PropertyMode mode) { next(LPAREN); PropertyDef propDef; - createPropertyDef(propDef, int(def->propertyList.size())); + createPropertyDef(propDef, int(def->propertyList.size()), mode); next(RPAREN); def->propertyList += propDef; @@ -1506,7 +1514,7 @@ QByteArray Moc::parsePropertyAccessor() return accessor; } -void Moc::parsePrivateProperty(ClassDef *def) +void Moc::parsePrivateProperty(ClassDef *def, Moc::PropertyMode mode) { next(LPAREN); PropertyDef propDef; @@ -1514,7 +1522,7 @@ void Moc::parsePrivateProperty(ClassDef *def) next(COMMA); - createPropertyDef(propDef, int(def->propertyList.size())); + createPropertyDef(propDef, int(def->propertyList.size()), mode); def->propertyList += propDef; } diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index af2a95c391..edeac03b82 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -102,6 +102,8 @@ Q_DECLARE_TYPEINFO(FunctionDef, Q_RELOCATABLE_TYPE); struct PropertyDef { bool stdCppSet() const { + if (name.isEmpty()) + return false; QByteArray s("set"); s += QtMiscUtils::toAsciiUpper(name[0]); s += name.mid(1); @@ -197,6 +199,8 @@ Q_DECLARE_TYPEINFO(NamespaceDef, Q_RELOCATABLE_TYPE); class Moc : public Parser { public: + enum PropertyMode { Named, Anonymous }; + Moc() : noInclude(false), mustIncludeQPluginH(false), requireCompleteTypes(false) {} @@ -238,9 +242,11 @@ public: void parseSlots(ClassDef *def, FunctionDef::Access access); void parseSignals(ClassDef *def); - void parseProperty(ClassDef *def); + void parseProperty(ClassDef *def, PropertyMode mode); void parsePluginData(ClassDef *def); - void createPropertyDef(PropertyDef &def, int propertyIndex); + + void createPropertyDef(PropertyDef &def, int propertyIndex, PropertyMode mode); + void parsePropertyAttributes(PropertyDef &propDef); void parseEnumOrFlag(BaseDef *def, bool isFlag); void parseFlag(BaseDef *def); @@ -253,7 +259,7 @@ public: void parseMocInclude(); void parseSlotInPrivate(ClassDef *def, FunctionDef::Access access); QByteArray parsePropertyAccessor(); - void parsePrivateProperty(ClassDef *def); + void parsePrivateProperty(ClassDef *def, PropertyMode mode); void parseFunctionArguments(FunctionDef *def); diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h index a58b2e9f9f..a70808370d 100644 --- a/src/tools/moc/token.h +++ b/src/tools/moc/token.h @@ -133,6 +133,7 @@ QT_BEGIN_NAMESPACE F(Q_NAMESPACE_TOKEN) \ F(Q_NAMESPACE_EXPORT_TOKEN) \ F(Q_PROPERTY_TOKEN) \ + F(QT_ANONYMOUS_PROPERTY_TOKEN) \ F(Q_PLUGIN_METADATA_TOKEN) \ F(Q_ENUMS_TOKEN) \ F(Q_ENUM_TOKEN) \ @@ -154,6 +155,7 @@ QT_BEGIN_NAMESPACE F(Q_INVOKABLE_TOKEN) \ F(Q_SCRIPTABLE_TOKEN) \ F(Q_PRIVATE_PROPERTY_TOKEN) \ + F(QT_ANONYMOUS_PRIVATE_PROPERTY_TOKEN) \ F(Q_REVISION_TOKEN) \ F(Q_MOC_INCLUDE_TOKEN) \ F(SPECIAL_TREATMENT_MARK) \ diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp index fb78ae87d0..a6c85af9f1 100644 --- a/src/tools/moc/util/generate_keywords.cpp +++ b/src/tools/moc/util/generate_keywords.cpp @@ -193,6 +193,7 @@ static const Keyword keywords[] = { { "Q_GADGET", "Q_GADGET_TOKEN" }, { "Q_GADGET_EXPORT", "Q_GADGET_EXPORT_TOKEN" }, { "Q_PROPERTY", "Q_PROPERTY_TOKEN" }, + { "QT_ANONYMOUS_PROPERTY", "QT_ANONYMOUS_PROPERTY_TOKEN" }, { "Q_PLUGIN_METADATA", "Q_PLUGIN_METADATA_TOKEN" }, { "Q_ENUMS", "Q_ENUMS_TOKEN" }, { "Q_ENUM", "Q_ENUM_TOKEN" }, @@ -218,6 +219,7 @@ static const Keyword keywords[] = { { "Q_SLOT", "Q_SLOT_TOKEN" }, { "Q_SCRIPTABLE", "Q_SCRIPTABLE_TOKEN" }, { "Q_PRIVATE_PROPERTY", "Q_PRIVATE_PROPERTY_TOKEN" }, + { "QT_ANONYMOUS_PRIVATE_PROPERTY", "QT_ANONYMOUS_PRIVATE_PROPERTY_TOKEN" }, { "Q_REVISION", "Q_REVISION_TOKEN" }, { "Q_MOC_INCLUDE", "Q_MOC_INCLUDE_TOKEN" }, { "\n", "NEWLINE" }, diff --git a/tests/auto/tools/moc/tst_moc.cpp b/tests/auto/tools/moc/tst_moc.cpp index f832612d04..e2844e29d1 100644 --- a/tests/auto/tools/moc/tst_moc.cpp +++ b/tests/auto/tools/moc/tst_moc.cpp @@ -11,6 +11,8 @@ #include #include +#include + #include "using-namespaces.h" #include "assign-namespace.h" #include "no-keywords.h" @@ -704,6 +706,7 @@ private slots: void templateGtGt(); void qprivateslots(); void qprivateproperties(); + void anonymousProperties(); void warnOnPropertyWithoutREAD(); void constructors(); void typenameWithUnsigned(); @@ -1642,6 +1645,54 @@ void tst_Moc::qprivateproperties() QVERIFY(zapBindable.isBindable()); } + +class AnonymousPropertyTest1 : public QObject +{ + Q_OBJECT + QT_ANONYMOUS_PROPERTY(int READ foo WRITE setFoo) +public: + int foo() { return mFoo ; } + void setFoo(int value) { mFoo = value; } + +private: + int mFoo = 0; +}; + +class AnonymousPropertyTest2 : public QObject +{ + Q_OBJECT + QT_ANONYMOUS_PRIVATE_PROPERTY(d, int READ bar WRITE setBar) + + class MyDPointer { + public: + int bar() { return mBar ; } + void setBar(int value) { mBar = value; } + private: + int mBar = 0; + }; + +public: + AnonymousPropertyTest2(QObject *parent = nullptr) : QObject(parent), d (new MyDPointer) {} + MyDPointer *d_func() {return d.data();} + const MyDPointer *d_func() const {return d.data();} + +private: + QScopedPointer d; +}; + +void tst_Moc::anonymousProperties() +{ + AnonymousPropertyTest1 test1; + + test1.setProperty("", 17); + QCOMPARE(test1.property(""), QVariant::fromValue(17)); + + AnonymousPropertyTest2 test2; + + test2.setProperty("", 27); + QCOMPARE(test2.property(""), QVariant::fromValue(27)); +} + void tst_Moc::warnOnPropertyWithoutREAD() { #ifdef MOC_CROSS_COMPILED