diff options
Diffstat (limited to 'src/tools/moc')
-rw-r--r-- | src/tools/moc/generator.cpp | 7 | ||||
-rw-r--r-- | src/tools/moc/keywords.cpp | 375 | ||||
-rw-r--r-- | src/tools/moc/main.cpp | 70 | ||||
-rw-r--r-- | src/tools/moc/moc.cpp | 105 | ||||
-rw-r--r-- | src/tools/moc/moc.h | 42 | ||||
-rw-r--r-- | src/tools/moc/preprocessor.cpp | 77 | ||||
-rw-r--r-- | src/tools/moc/preprocessor.h | 1 | ||||
-rw-r--r-- | src/tools/moc/token.h | 3 | ||||
-rw-r--r-- | src/tools/moc/util/generate_keywords.cpp | 3 |
9 files changed, 443 insertions, 240 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 7de6fe632f..ccc6d795d7 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -878,9 +878,14 @@ void Generator::generateEnums(int index) int i; for (i = 0; i < cdef->enumList.count(); ++i) { const EnumDef &e = cdef->enumList.at(i); + int flags = 0; + if (cdef->enumDeclarations.value(e.name)) + flags |= EnumIsFlag; + if (e.isEnumClass) + flags |= EnumIsScoped; fprintf(out, " %4d, 0x%.1x, %4d, %4d,\n", stridx(e.name), - cdef->enumDeclarations.value(e.name) ? 1 : 0, + flags, e.values.count(), index); index += e.values.count() * 2; diff --git a/src/tools/moc/keywords.cpp b/src/tools/moc/keywords.cpp index 4f1d16d2c5..07c59d155f 100644 --- a/src/tools/moc/keywords.cpp +++ b/src/tools/moc/keywords.cpp @@ -30,12 +30,12 @@ // DO NOT EDIT. static const short keyword_trans[][128] = { - {0,0,0,0,0,0,0,0,0,546,543,0,0,0,0,0, + {0,0,0,0,0,0,0,0,0,561,558,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 546,252,544,547,8,38,239,545,25,26,236,234,30,235,27,237, + 561,252,559,562,8,38,239,560,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,549,32,238,8, + 8,21,8,8,8,8,8,8,8,8,8,31,564,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, @@ -116,7 +116,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,475,0,0,0, + 0,0,0,0,0,0,0,0,290,222,0,0,490,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, @@ -155,7 +155,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,499,0,0,0,0,0,0,0,0,0,0,357, + 0,0,0,0,514,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, @@ -177,7 +177,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, - 552,552,552,552,552,552,552,552,552,552,0,0,0,0,0,0, + 567,567,567,567,567,567,567,567,567,567,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -336,7 +336,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,551,0,0,0,0,550, + 0,0,0,0,0,0,0,0,0,0,566,0,0,0,0,565, 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, @@ -372,29 +372,29 @@ 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,472,0,0,0,300,0,0,0,0,0,0,0,0,0,0, + 0,487,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,453,402,392,397,364,0,462,0,0,0,0,0,358, - 370,0,535,450,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,468,417,401,409,373,0,477,0,0,0,0,364,358, + 379,0,550,465,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,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,0,0,0, - 0,0,371,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,387,0,0,0, + 0,0,380,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,489,0,0,0,0,0,372, + 0,0,0,0,0,0,0,0,0,504,0,0,0,0,0,381, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, @@ -402,32 +402,48 @@ 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,432,410,0,0,415,0,0,0,424,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,405,0,0,0,0,0,0,0,0,0,0,0,406, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,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,451,0,0,0,479,0,0,485,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,413,0,0,0,0,0,0,0,0,0,0,0,414, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,447,425,0,0,430,0,0,0,439,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,464,0,511,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,533,0,466,0,0,0,494,0,0,500,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 527,0,0,495,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,479,0,526,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 542,0,0,510,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} }; @@ -805,189 +821,204 @@ static const struct {CHARACTER, 0, 84, 363, CHARACTER}, {Q_OBJECT_TOKEN, 0, 0, 0, CHARACTER}, {CHARACTER, 0, 65, 365, CHARACTER}, - {CHARACTER, 0, 68, 366, CHARACTER}, - {CHARACTER, 0, 71, 367, CHARACTER}, - {CHARACTER, 0, 69, 368, CHARACTER}, - {CHARACTER, 0, 84, 369, CHARACTER}, + {CHARACTER, 0, 77, 366, CHARACTER}, + {CHARACTER, 0, 69, 367, CHARACTER}, + {CHARACTER, 0, 83, 368, CHARACTER}, + {CHARACTER, 0, 80, 369, CHARACTER}, + {CHARACTER, 0, 65, 370, CHARACTER}, + {CHARACTER, 0, 67, 371, CHARACTER}, + {CHARACTER, 0, 69, 372, CHARACTER}, + {Q_NAMESPACE_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 65, 374, CHARACTER}, + {CHARACTER, 0, 68, 375, CHARACTER}, + {CHARACTER, 0, 71, 376, CHARACTER}, + {CHARACTER, 0, 69, 377, CHARACTER}, + {CHARACTER, 0, 84, 378, CHARACTER}, {Q_GADGET_TOKEN, 0, 0, 0, CHARACTER}, {CHARACTER, 44, 0, 0, CHARACTER}, {CHARACTER, 45, 0, 0, CHARACTER}, - {CHARACTER, 0, 80, 373, CHARACTER}, - {CHARACTER, 0, 69, 374, CHARACTER}, - {CHARACTER, 0, 82, 375, CHARACTER}, - {CHARACTER, 0, 84, 376, CHARACTER}, - {CHARACTER, 0, 89, 377, CHARACTER}, + {CHARACTER, 0, 80, 382, CHARACTER}, + {CHARACTER, 0, 69, 383, CHARACTER}, + {CHARACTER, 0, 82, 384, CHARACTER}, + {CHARACTER, 0, 84, 385, CHARACTER}, + {CHARACTER, 0, 89, 386, CHARACTER}, {Q_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 85, 379, CHARACTER}, - {CHARACTER, 0, 71, 380, CHARACTER}, - {CHARACTER, 0, 73, 381, CHARACTER}, - {CHARACTER, 0, 78, 382, CHARACTER}, - {CHARACTER, 0, 95, 383, CHARACTER}, - {CHARACTER, 0, 77, 384, CHARACTER}, - {CHARACTER, 0, 69, 385, CHARACTER}, - {CHARACTER, 0, 84, 386, CHARACTER}, - {CHARACTER, 0, 65, 387, CHARACTER}, - {CHARACTER, 0, 68, 388, CHARACTER}, - {CHARACTER, 0, 65, 389, CHARACTER}, - {CHARACTER, 0, 84, 390, CHARACTER}, - {CHARACTER, 0, 65, 391, CHARACTER}, + {CHARACTER, 0, 85, 388, CHARACTER}, + {CHARACTER, 0, 71, 389, CHARACTER}, + {CHARACTER, 0, 73, 390, CHARACTER}, + {CHARACTER, 0, 78, 391, CHARACTER}, + {CHARACTER, 0, 95, 392, CHARACTER}, + {CHARACTER, 0, 77, 393, CHARACTER}, + {CHARACTER, 0, 69, 394, CHARACTER}, + {CHARACTER, 0, 84, 395, CHARACTER}, + {CHARACTER, 0, 65, 396, CHARACTER}, + {CHARACTER, 0, 68, 397, CHARACTER}, + {CHARACTER, 0, 65, 398, CHARACTER}, + {CHARACTER, 0, 84, 399, CHARACTER}, + {CHARACTER, 0, 65, 400, CHARACTER}, {Q_PLUGIN_METADATA_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 78, 393, CHARACTER}, - {CHARACTER, 0, 85, 394, CHARACTER}, - {CHARACTER, 0, 77, 395, CHARACTER}, - {Q_ENUM_TOKEN, 0, 83, 396, CHARACTER}, + {CHARACTER, 0, 78, 402, CHARACTER}, + {CHARACTER, 0, 85, 403, CHARACTER}, + {CHARACTER, 0, 77, 404, CHARACTER}, + {Q_ENUM_TOKEN, 46, 0, 0, CHARACTER}, {Q_ENUMS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 76, 398, CHARACTER}, - {CHARACTER, 0, 65, 399, CHARACTER}, - {CHARACTER, 0, 71, 400, CHARACTER}, - {Q_FLAG_TOKEN, 0, 83, 401, CHARACTER}, + {CHARACTER, 0, 78, 407, CHARACTER}, + {CHARACTER, 0, 83, 408, CHARACTER}, + {Q_ENUM_NS_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 76, 410, CHARACTER}, + {CHARACTER, 0, 65, 411, CHARACTER}, + {CHARACTER, 0, 71, 412, CHARACTER}, + {Q_FLAG_TOKEN, 47, 0, 0, CHARACTER}, {Q_FLAGS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 69, 403, CHARACTER}, - {CHARACTER, 0, 67, 404, CHARACTER}, - {CHARACTER, 0, 76, 405, CHARACTER}, - {CHARACTER, 0, 65, 406, CHARACTER}, - {CHARACTER, 0, 82, 407, CHARACTER}, - {CHARACTER, 0, 69, 408, CHARACTER}, - {CHARACTER, 0, 95, 409, CHARACTER}, - {CHARACTER, 46, 0, 0, CHARACTER}, - {CHARACTER, 0, 76, 411, CHARACTER}, - {CHARACTER, 0, 65, 412, CHARACTER}, - {CHARACTER, 0, 71, 413, CHARACTER}, - {CHARACTER, 0, 83, 414, CHARACTER}, - {Q_DECLARE_FLAGS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 78, 416, CHARACTER}, - {CHARACTER, 0, 84, 417, CHARACTER}, + {CHARACTER, 0, 78, 415, CHARACTER}, + {CHARACTER, 0, 83, 416, CHARACTER}, + {Q_FLAG_NS_TOKEN, 0, 0, 0, CHARACTER}, {CHARACTER, 0, 69, 418, CHARACTER}, - {CHARACTER, 0, 82, 419, CHARACTER}, - {CHARACTER, 0, 70, 420, CHARACTER}, + {CHARACTER, 0, 67, 419, CHARACTER}, + {CHARACTER, 0, 76, 420, CHARACTER}, {CHARACTER, 0, 65, 421, CHARACTER}, - {CHARACTER, 0, 67, 422, CHARACTER}, + {CHARACTER, 0, 82, 422, CHARACTER}, {CHARACTER, 0, 69, 423, CHARACTER}, - {Q_DECLARE_INTERFACE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 69, 425, CHARACTER}, - {CHARACTER, 0, 84, 426, CHARACTER}, + {CHARACTER, 0, 95, 424, CHARACTER}, + {CHARACTER, 48, 0, 0, CHARACTER}, + {CHARACTER, 0, 76, 426, CHARACTER}, {CHARACTER, 0, 65, 427, CHARACTER}, - {CHARACTER, 0, 84, 428, CHARACTER}, - {CHARACTER, 0, 89, 429, CHARACTER}, - {CHARACTER, 0, 80, 430, CHARACTER}, - {CHARACTER, 0, 69, 431, CHARACTER}, + {CHARACTER, 0, 71, 428, CHARACTER}, + {CHARACTER, 0, 83, 429, CHARACTER}, + {Q_DECLARE_FLAGS_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 78, 431, CHARACTER}, + {CHARACTER, 0, 84, 432, CHARACTER}, + {CHARACTER, 0, 69, 433, CHARACTER}, + {CHARACTER, 0, 82, 434, CHARACTER}, + {CHARACTER, 0, 70, 435, CHARACTER}, + {CHARACTER, 0, 65, 436, CHARACTER}, + {CHARACTER, 0, 67, 437, CHARACTER}, + {CHARACTER, 0, 69, 438, CHARACTER}, + {Q_DECLARE_INTERFACE_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 69, 440, CHARACTER}, + {CHARACTER, 0, 84, 441, CHARACTER}, + {CHARACTER, 0, 65, 442, CHARACTER}, + {CHARACTER, 0, 84, 443, CHARACTER}, + {CHARACTER, 0, 89, 444, CHARACTER}, + {CHARACTER, 0, 80, 445, CHARACTER}, + {CHARACTER, 0, 69, 446, CHARACTER}, {Q_DECLARE_METATYPE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 88, 433, CHARACTER}, - {CHARACTER, 0, 84, 434, CHARACTER}, - {CHARACTER, 0, 69, 435, CHARACTER}, - {CHARACTER, 0, 78, 436, CHARACTER}, - {CHARACTER, 0, 83, 437, CHARACTER}, - {CHARACTER, 0, 73, 438, CHARACTER}, - {CHARACTER, 0, 79, 439, CHARACTER}, - {CHARACTER, 0, 78, 440, CHARACTER}, - {CHARACTER, 0, 95, 441, CHARACTER}, - {CHARACTER, 0, 73, 442, CHARACTER}, - {CHARACTER, 0, 78, 443, CHARACTER}, - {CHARACTER, 0, 84, 444, CHARACTER}, - {CHARACTER, 0, 69, 445, CHARACTER}, - {CHARACTER, 0, 82, 446, CHARACTER}, - {CHARACTER, 0, 70, 447, CHARACTER}, - {CHARACTER, 0, 65, 448, CHARACTER}, - {CHARACTER, 0, 67, 449, CHARACTER}, - {CHARACTER, 0, 69, 423, CHARACTER}, - {CHARACTER, 47, 0, 0, CHARACTER}, - {CHARACTER, 0, 84, 452, CHARACTER}, - {CHARACTER, 0, 83, 401, CHARACTER}, - {CHARACTER, 0, 76, 454, CHARACTER}, - {CHARACTER, 0, 65, 455, CHARACTER}, - {CHARACTER, 0, 83, 456, CHARACTER}, - {CHARACTER, 0, 83, 457, CHARACTER}, - {CHARACTER, 0, 73, 458, CHARACTER}, - {CHARACTER, 0, 78, 459, CHARACTER}, - {CHARACTER, 0, 70, 460, CHARACTER}, - {CHARACTER, 0, 79, 461, CHARACTER}, - {Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 78, 463, CHARACTER}, - {CHARACTER, 48, 0, 0, CHARACTER}, - {CHARACTER, 0, 69, 465, CHARACTER}, - {CHARACTER, 0, 82, 466, CHARACTER}, - {CHARACTER, 0, 70, 467, CHARACTER}, - {CHARACTER, 0, 65, 468, CHARACTER}, - {CHARACTER, 0, 67, 469, CHARACTER}, - {CHARACTER, 0, 69, 470, CHARACTER}, + {CHARACTER, 0, 88, 448, CHARACTER}, + {CHARACTER, 0, 84, 449, CHARACTER}, + {CHARACTER, 0, 69, 450, CHARACTER}, + {CHARACTER, 0, 78, 451, CHARACTER}, + {CHARACTER, 0, 83, 452, CHARACTER}, + {CHARACTER, 0, 73, 453, CHARACTER}, + {CHARACTER, 0, 79, 454, CHARACTER}, + {CHARACTER, 0, 78, 455, CHARACTER}, + {CHARACTER, 0, 95, 456, CHARACTER}, + {CHARACTER, 0, 73, 457, CHARACTER}, + {CHARACTER, 0, 78, 458, CHARACTER}, + {CHARACTER, 0, 84, 459, CHARACTER}, + {CHARACTER, 0, 69, 460, CHARACTER}, + {CHARACTER, 0, 82, 461, CHARACTER}, + {CHARACTER, 0, 70, 462, CHARACTER}, + {CHARACTER, 0, 65, 463, CHARACTER}, + {CHARACTER, 0, 67, 464, CHARACTER}, + {CHARACTER, 0, 69, 438, CHARACTER}, + {CHARACTER, 49, 0, 0, CHARACTER}, + {CHARACTER, 0, 84, 467, CHARACTER}, + {CHARACTER, 0, 83, 413, CHARACTER}, + {CHARACTER, 0, 76, 469, CHARACTER}, + {CHARACTER, 0, 65, 470, CHARACTER}, {CHARACTER, 0, 83, 471, CHARACTER}, + {CHARACTER, 0, 83, 472, CHARACTER}, + {CHARACTER, 0, 73, 473, CHARACTER}, + {CHARACTER, 0, 78, 474, CHARACTER}, + {CHARACTER, 0, 70, 475, CHARACTER}, + {CHARACTER, 0, 79, 476, CHARACTER}, + {Q_CLASSINFO_TOKEN, 0, 0, 0, CHARACTER}, + {CHARACTER, 0, 78, 478, CHARACTER}, + {CHARACTER, 50, 0, 0, CHARACTER}, + {CHARACTER, 0, 69, 480, CHARACTER}, + {CHARACTER, 0, 82, 481, CHARACTER}, + {CHARACTER, 0, 70, 482, CHARACTER}, + {CHARACTER, 0, 65, 483, CHARACTER}, + {CHARACTER, 0, 67, 484, CHARACTER}, + {CHARACTER, 0, 69, 485, CHARACTER}, + {CHARACTER, 0, 83, 486, CHARACTER}, {Q_INTERFACES_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 108, 473, CHARACTER}, - {CHARACTER, 0, 115, 474, CHARACTER}, + {CHARACTER, 0, 108, 488, CHARACTER}, + {CHARACTER, 0, 115, 489, CHARACTER}, {SIGNALS, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 111, 476, CHARACTER}, - {CHARACTER, 0, 116, 477, CHARACTER}, - {CHARACTER, 0, 115, 478, CHARACTER}, + {CHARACTER, 0, 111, 491, CHARACTER}, + {CHARACTER, 0, 116, 492, CHARACTER}, + {CHARACTER, 0, 115, 493, CHARACTER}, {SLOTS, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 71, 480, CHARACTER}, - {CHARACTER, 0, 78, 481, CHARACTER}, - {CHARACTER, 0, 65, 482, CHARACTER}, - {CHARACTER, 0, 76, 483, CHARACTER}, - {Q_SIGNAL_TOKEN, 0, 83, 484, CHARACTER}, + {CHARACTER, 0, 71, 495, CHARACTER}, + {CHARACTER, 0, 78, 496, CHARACTER}, + {CHARACTER, 0, 65, 497, CHARACTER}, + {CHARACTER, 0, 76, 498, CHARACTER}, + {Q_SIGNAL_TOKEN, 0, 83, 499, CHARACTER}, {Q_SIGNALS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 79, 486, CHARACTER}, - {CHARACTER, 0, 84, 487, CHARACTER}, - {Q_SLOT_TOKEN, 0, 83, 488, CHARACTER}, + {CHARACTER, 0, 79, 501, CHARACTER}, + {CHARACTER, 0, 84, 502, CHARACTER}, + {Q_SLOT_TOKEN, 0, 83, 503, CHARACTER}, {Q_SLOTS_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 86, 490, CHARACTER}, - {CHARACTER, 0, 65, 491, CHARACTER}, - {CHARACTER, 0, 84, 492, CHARACTER}, - {CHARACTER, 0, 69, 493, CHARACTER}, - {CHARACTER, 0, 95, 494, CHARACTER}, - {CHARACTER, 49, 0, 0, CHARACTER}, - {CHARACTER, 0, 76, 496, CHARACTER}, - {CHARACTER, 0, 79, 497, CHARACTER}, - {CHARACTER, 0, 84, 498, CHARACTER}, + {CHARACTER, 0, 86, 505, CHARACTER}, + {CHARACTER, 0, 65, 506, CHARACTER}, + {CHARACTER, 0, 84, 507, CHARACTER}, + {CHARACTER, 0, 69, 508, CHARACTER}, + {CHARACTER, 0, 95, 509, CHARACTER}, + {CHARACTER, 51, 0, 0, CHARACTER}, + {CHARACTER, 0, 76, 511, CHARACTER}, + {CHARACTER, 0, 79, 512, CHARACTER}, + {CHARACTER, 0, 84, 513, CHARACTER}, {Q_PRIVATE_SLOT_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 95, 500, CHARACTER}, - {CHARACTER, 0, 77, 501, CHARACTER}, - {CHARACTER, 0, 79, 502, CHARACTER}, - {CHARACTER, 0, 67, 503, CHARACTER}, - {CHARACTER, 0, 95, 504, CHARACTER}, - {CHARACTER, 0, 67, 505, CHARACTER}, - {CHARACTER, 0, 79, 506, CHARACTER}, - {CHARACTER, 0, 77, 507, CHARACTER}, - {CHARACTER, 0, 80, 508, CHARACTER}, - {CHARACTER, 0, 65, 509, CHARACTER}, - {CHARACTER, 0, 84, 510, CHARACTER}, + {CHARACTER, 0, 95, 515, CHARACTER}, + {CHARACTER, 0, 77, 516, CHARACTER}, + {CHARACTER, 0, 79, 517, CHARACTER}, + {CHARACTER, 0, 67, 518, CHARACTER}, + {CHARACTER, 0, 95, 519, CHARACTER}, + {CHARACTER, 0, 67, 520, CHARACTER}, + {CHARACTER, 0, 79, 521, CHARACTER}, + {CHARACTER, 0, 77, 522, CHARACTER}, + {CHARACTER, 0, 80, 523, CHARACTER}, + {CHARACTER, 0, 65, 524, CHARACTER}, + {CHARACTER, 0, 84, 525, CHARACTER}, {Q_MOC_COMPAT_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 79, 512, CHARACTER}, - {CHARACTER, 0, 75, 513, CHARACTER}, - {CHARACTER, 0, 65, 514, CHARACTER}, - {CHARACTER, 0, 66, 515, CHARACTER}, - {CHARACTER, 0, 76, 516, CHARACTER}, - {CHARACTER, 0, 69, 517, CHARACTER}, + {CHARACTER, 0, 79, 527, CHARACTER}, + {CHARACTER, 0, 75, 528, CHARACTER}, + {CHARACTER, 0, 65, 529, CHARACTER}, + {CHARACTER, 0, 66, 530, CHARACTER}, + {CHARACTER, 0, 76, 531, CHARACTER}, + {CHARACTER, 0, 69, 532, CHARACTER}, {Q_INVOKABLE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 82, 519, CHARACTER}, - {CHARACTER, 0, 73, 520, CHARACTER}, - {CHARACTER, 0, 80, 521, CHARACTER}, - {CHARACTER, 0, 84, 522, CHARACTER}, - {CHARACTER, 0, 65, 523, CHARACTER}, - {CHARACTER, 0, 66, 524, CHARACTER}, - {CHARACTER, 0, 76, 525, CHARACTER}, - {CHARACTER, 0, 69, 526, CHARACTER}, + {CHARACTER, 0, 82, 534, CHARACTER}, + {CHARACTER, 0, 73, 535, CHARACTER}, + {CHARACTER, 0, 80, 536, CHARACTER}, + {CHARACTER, 0, 84, 537, CHARACTER}, + {CHARACTER, 0, 65, 538, CHARACTER}, + {CHARACTER, 0, 66, 539, CHARACTER}, + {CHARACTER, 0, 76, 540, CHARACTER}, + {CHARACTER, 0, 69, 541, CHARACTER}, {Q_SCRIPTABLE_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 82, 528, CHARACTER}, - {CHARACTER, 0, 79, 529, CHARACTER}, - {CHARACTER, 0, 80, 530, CHARACTER}, - {CHARACTER, 0, 69, 531, CHARACTER}, - {CHARACTER, 0, 82, 532, CHARACTER}, - {CHARACTER, 0, 84, 533, CHARACTER}, - {CHARACTER, 0, 89, 534, CHARACTER}, + {CHARACTER, 0, 82, 543, CHARACTER}, + {CHARACTER, 0, 79, 544, CHARACTER}, + {CHARACTER, 0, 80, 545, CHARACTER}, + {CHARACTER, 0, 69, 546, CHARACTER}, + {CHARACTER, 0, 82, 547, CHARACTER}, + {CHARACTER, 0, 84, 548, CHARACTER}, + {CHARACTER, 0, 89, 549, CHARACTER}, {Q_PRIVATE_PROPERTY_TOKEN, 0, 0, 0, CHARACTER}, - {CHARACTER, 0, 69, 536, CHARACTER}, - {CHARACTER, 0, 86, 537, CHARACTER}, - {CHARACTER, 0, 73, 538, CHARACTER}, - {CHARACTER, 0, 83, 539, CHARACTER}, - {CHARACTER, 0, 73, 540, CHARACTER}, - {CHARACTER, 0, 79, 541, CHARACTER}, - {CHARACTER, 0, 78, 542, CHARACTER}, + {CHARACTER, 0, 69, 551, CHARACTER}, + {CHARACTER, 0, 86, 552, CHARACTER}, + {CHARACTER, 0, 73, 553, CHARACTER}, + {CHARACTER, 0, 83, 554, CHARACTER}, + {CHARACTER, 0, 73, 555, CHARACTER}, + {CHARACTER, 0, 79, 556, CHARACTER}, + {CHARACTER, 0, 78, 557, CHARACTER}, {Q_REVISION_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, 548, HASH}, + {HASH, 0, 35, 563, HASH}, {PP_HASHHASH, 0, 0, 0, NOTOKEN}, {BACKSLASH, 0, 0, 0, NOTOKEN}, {CPP_COMMENT, 0, 0, 0, NOTOKEN}, diff --git a/src/tools/moc/main.cpp b/src/tools/moc/main.cpp index 0734a92d5a..55cf7ed872 100644 --- a/src/tools/moc/main.cpp +++ b/src/tools/moc/main.cpp @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2016 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. @@ -200,20 +201,24 @@ int runMoc(int argc, char **argv) .arg(mocOutputRevision).arg(QString::fromLatin1(QT_VERSION_STR))); parser.addHelpOption(); parser.addVersionOption(); + parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions); QCommandLineOption outputOption(QStringLiteral("o")); outputOption.setDescription(QStringLiteral("Write output to file rather than stdout.")); outputOption.setValueName(QStringLiteral("file")); + outputOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(outputOption); QCommandLineOption includePathOption(QStringLiteral("I")); includePathOption.setDescription(QStringLiteral("Add dir to the include path for header files.")); includePathOption.setValueName(QStringLiteral("dir")); + includePathOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(includePathOption); QCommandLineOption macFrameworkOption(QStringLiteral("F")); macFrameworkOption.setDescription(QStringLiteral("Add Mac framework to the include path for header files.")); macFrameworkOption.setValueName(QStringLiteral("framework")); + macFrameworkOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(macFrameworkOption); QCommandLineOption preprocessOption(QStringLiteral("E")); @@ -223,18 +228,26 @@ int runMoc(int argc, char **argv) QCommandLineOption defineOption(QStringLiteral("D")); defineOption.setDescription(QStringLiteral("Define macro, with optional definition.")); defineOption.setValueName(QStringLiteral("macro[=def]")); + defineOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(defineOption); QCommandLineOption undefineOption(QStringLiteral("U")); undefineOption.setDescription(QStringLiteral("Undefine macro.")); undefineOption.setValueName(QStringLiteral("macro")); + undefineOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(undefineOption); QCommandLineOption metadataOption(QStringLiteral("M")); metadataOption.setDescription(QStringLiteral("Add key/value pair to plugin meta data")); metadataOption.setValueName(QStringLiteral("key=value")); + metadataOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(metadataOption); + QCommandLineOption compilerFlavorOption(QStringLiteral("compiler-flavor")); + compilerFlavorOption.setDescription(QStringLiteral("Set the compiler flavor: either \"msvc\" or \"unix\".")); + compilerFlavorOption.setValueName(QStringLiteral("flavor")); + parser.addOption(compilerFlavorOption); + QCommandLineOption noIncludeOption(QStringLiteral("i")); noIncludeOption.setDescription(QStringLiteral("Do not generate an #include statement.")); parser.addOption(noIncludeOption); @@ -242,11 +255,13 @@ int runMoc(int argc, char **argv) QCommandLineOption pathPrefixOption(QStringLiteral("p")); pathPrefixOption.setDescription(QStringLiteral("Path prefix for included file.")); pathPrefixOption.setValueName(QStringLiteral("path")); + pathPrefixOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(pathPrefixOption); QCommandLineOption forceIncludeOption(QStringLiteral("f")); forceIncludeOption.setDescription(QStringLiteral("Force #include <file> (overwrite default).")); forceIncludeOption.setValueName(QStringLiteral("file")); + forceIncludeOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(forceIncludeOption); QCommandLineOption prependIncludeOption(QStringLiteral("b")); @@ -254,9 +269,15 @@ int runMoc(int argc, char **argv) prependIncludeOption.setValueName(QStringLiteral("file")); parser.addOption(prependIncludeOption); + QCommandLineOption includeOption(QStringLiteral("include")); + includeOption.setDescription(QStringLiteral("Parse <file> as an #include before the main source(s).")); + includeOption.setValueName(QStringLiteral("file")); + parser.addOption(includeOption); + QCommandLineOption noNotesWarningsCompatOption(QStringLiteral("n")); noNotesWarningsCompatOption.setDescription(QStringLiteral("Do not display notes (-nn) or warnings (-nw). Compatibility option.")); noNotesWarningsCompatOption.setValueName(QStringLiteral("which")); + noNotesWarningsCompatOption.setFlags(QCommandLineOption::ShortOptionStyle); parser.addOption(noNotesWarningsCompatOption); QCommandLineOption noNotesOption(QStringLiteral("no-notes")); @@ -313,9 +334,32 @@ int runMoc(int argc, char **argv) if (parser.isSet(pathPrefixOption)) moc.includePath = QFile::encodeName(parser.value(pathPrefixOption)); } + const auto includePaths = parser.values(includePathOption); for (const QString &path : includePaths) pp.includes += Preprocessor::IncludePath(QFile::encodeName(path)); + QString compilerFlavor = parser.value(compilerFlavorOption); + if (compilerFlavor.isEmpty() || compilerFlavor == QLatin1String("unix")) { + // traditional Unix compilers use both CPATH and CPLUS_INCLUDE_PATH + // $CPATH feeds to #include <...> and #include "...", whereas + // CPLUS_INCLUDE_PATH is equivalent to GCC's -isystem, so we parse later + const auto cpath = qgetenv("CPATH").split(QDir::listSeparator().toLatin1()); + for (const QByteArray &p : cpath) + pp.includes += Preprocessor::IncludePath(p); + const auto cplus_include_path = qgetenv("CPLUS_INCLUDE_PATH").split(QDir::listSeparator().toLatin1()); + for (const QByteArray &p : cplus_include_path) + pp.includes += Preprocessor::IncludePath(p); + } else if (compilerFlavor == QLatin1String("msvc")) { + // MSVC uses one environment variable: INCLUDE + const auto include = qgetenv("INCLUDE").split(QDir::listSeparator().toLatin1()); + for (const QByteArray &p : include) + pp.includes += Preprocessor::IncludePath(p); + } else { + error(qPrintable(QLatin1String("Unknown compiler flavor '") + compilerFlavor + + QLatin1String("'; valid values are: msvc, unix."))); + parser.showHelp(1); + } + const auto macFrameworks = parser.values(macFrameworkOption); for (const QString &path : macFrameworks) { // minimalistic framework support for the mac @@ -410,7 +454,31 @@ int runMoc(int argc, char **argv) moc.includes = pp.includes; // 1. preprocess - moc.symbols = pp.preprocessed(moc.filename, &in); + const auto includeFiles = parser.values(includeOption); + for (const QString &includeName : includeFiles) { + QByteArray rawName = pp.resolveInclude(QFile::encodeName(includeName), moc.filename); + if (rawName.isEmpty()) { + fprintf(stderr, "Warning: Failed to resolve include \"%s\" for moc file %s\n", + includeName.toLocal8Bit().constData(), + moc.filename.isEmpty() ? "<standard input>" : moc.filename.constData()); + } else { + QFile f(QFile::decodeName(rawName)); + if (f.open(QIODevice::ReadOnly)) { + moc.symbols += Symbol(0, MOC_INCLUDE_BEGIN, rawName); + moc.symbols += pp.preprocessed(rawName, &f); + moc.symbols += Symbol(0, MOC_INCLUDE_END, rawName); + } else { + fprintf(stderr, "Warning: Cannot open %s included by moc file %s: %s\n", + rawName.constData(), + moc.filename.isEmpty() ? "<standard input>" : moc.filename.constData(), + f.errorString().toLocal8Bit().constData()); + } + } + } + moc.symbols += pp.preprocessed(moc.filename, &in); + + // We obviously do not support MS extensions + pp.macros.remove("_MSC_EXTENSIONS"); if (!pp.preprocessOnly) { // 2. parse diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 87fb1318f9..3bd87e1f01 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -163,7 +163,7 @@ Type Moc::parseType() case SIGNED: case UNSIGNED: hasSignedOrUnsigned = true; - // fall through + Q_FALLTHROUGH(); case CONST: case VOLATILE: type.name += lexem(); @@ -538,7 +538,6 @@ bool Moc::parseMaybeFunction(const ClassDef *cdef, FunctionDef *def) return true; } - void Moc::parse() { QVector<NamespaceDef> namespaceList; @@ -554,14 +553,76 @@ void Moc::parse() until(SEMIC); } else if (!test(SEMIC)) { NamespaceDef def; - def.name = lexem(); + def.classname = lexem(); next(LBRACE); def.begin = index - 1; until(RBRACE); def.end = index; index = def.begin + 1; + + const bool parseNamespace = currentFilenames.size() <= 1; + if (parseNamespace) { + for (int i = namespaceList.size() - 1; i >= 0; --i) { + if (inNamespace(&namespaceList.at(i))) { + def.qualified.prepend(namespaceList.at(i).classname + "::"); + } + } + } + while (parseNamespace && inNamespace(&def) && hasNext()) { + switch (next()) { + case NAMESPACE: + if (test(IDENTIFIER)) { + if (test(EQ)) { + // namespace Foo = Bar::Baz; + until(SEMIC); + } else if (!test(SEMIC)) { + until(RBRACE); + } + } + break; + case Q_NAMESPACE_TOKEN: + def.hasQNamespace = true; + break; + case Q_ENUMS_TOKEN: + case Q_ENUM_NS_TOKEN: + parseEnumOrFlag(&def, false); + break; + case Q_ENUM_TOKEN: + error("Q_ENUM can't be used in a Q_NAMESPACE, use Q_ENUM_NS instead"); + break; + case Q_FLAGS_TOKEN: + case Q_FLAG_NS_TOKEN: + parseEnumOrFlag(&def, true); + break; + case Q_FLAG_TOKEN: + error("Q_FLAG can't be used in a Q_NAMESPACE, use Q_FLAG_NS instead"); + break; + case Q_DECLARE_FLAGS_TOKEN: + parseFlag(&def); + break; + case Q_CLASSINFO_TOKEN: + parseClassInfo(&def); + break; + case ENUM: { + EnumDef enumDef; + if (parseEnum(&enumDef)) + def.enumList += enumDef; + } break; + case CLASS: + case STRUCT: { + ClassDef classdef; + if (!parseClassHead(&classdef)) + continue; + while (inClass(&classdef) && hasNext()) + next(); // consume all Q_XXXX macros from this class + } break; + default: break; + } + } namespaceList += def; index = rewind; + if (!def.hasQNamespace && (!def.classInfoList.isEmpty() || !def.enumDeclarations.isEmpty())) + error("Namespace declaration lacks Q_NAMESPACE macro."); } } break; @@ -618,7 +679,7 @@ void Moc::parse() for (int i = namespaceList.size() - 1; i >= 0; --i) if (inNamespace(&namespaceList.at(i))) - def.qualified.prepend(namespaceList.at(i).name + "::"); + def.qualified.prepend(namespaceList.at(i).classname + "::"); QHash<QByteArray, QByteArray> &classHash = def.hasQObject ? knownQObjectClasses : knownGadgets; classHash.insert(def.classname, def.qualified); @@ -634,7 +695,7 @@ void Moc::parse() FunctionDef::Access access = FunctionDef::Private; for (int i = namespaceList.size() - 1; i >= 0; --i) if (inNamespace(&namespaceList.at(i))) - def.qualified.prepend(namespaceList.at(i).name + "::"); + def.qualified.prepend(namespaceList.at(i).classname + "::"); while (inClass(&def) && hasNext()) { switch ((t = next())) { case PRIVATE: @@ -698,10 +759,16 @@ void Moc::parse() case Q_ENUM_TOKEN: parseEnumOrFlag(&def, false); break; + case Q_ENUM_NS_TOKEN: + error("Q_ENUM_NS can't be used in a Q_OBJECT/Q_GADGET, use Q_ENUM instead"); + break; case Q_FLAGS_TOKEN: case Q_FLAG_TOKEN: parseEnumOrFlag(&def, true); break; + case Q_FLAG_NS_TOKEN: + error("Q_FLAG_NS can't be used in a Q_OBJECT/Q_GADGET, use Q_FLAG instead"); + break; case Q_DECLARE_FLAGS_TOKEN: parseFlag(&def); break; @@ -802,6 +869,28 @@ void Moc::parse() classHash.insert(def.qualified, def.qualified); } } + for (const auto &n : qAsConst(namespaceList)) { + if (!n.hasQNamespace) + continue; + ClassDef def; + static_cast<BaseDef &>(def) = static_cast<BaseDef>(n); + def.qualified += def.classname; + def.hasQGadget = true; + auto it = std::find_if(classList.begin(), classList.end(), [&def](const ClassDef &val) { + return def.classname == val.classname && def.qualified == val.qualified; + }); + + if (it != classList.end()) { + it->classInfoList += def.classInfoList; + it->enumDeclarations.unite(def.enumDeclarations); + it->enumList += def.enumList; + it->flagAliases.unite(def.flagAliases); + } else { + knownGadgets.insert(def.classname, def.qualified); + knownGadgets.insert(def.qualified, def.qualified); + classList += def; + } + } } static bool any_type_contains(const QVector<PropertyDef> &properties, const QByteArray &pattern) @@ -1248,7 +1337,7 @@ void Moc::parsePrivateProperty(ClassDef *def) def->propertyList += propDef; } -void Moc::parseEnumOrFlag(ClassDef *def, bool isFlag) +void Moc::parseEnumOrFlag(BaseDef *def, bool isFlag) { next(LPAREN); QByteArray identifier; @@ -1263,7 +1352,7 @@ void Moc::parseEnumOrFlag(ClassDef *def, bool isFlag) next(RPAREN); } -void Moc::parseFlag(ClassDef *def) +void Moc::parseFlag(BaseDef *def) { next(LPAREN); QByteArray flagName, enumName; @@ -1287,7 +1376,7 @@ void Moc::parseFlag(ClassDef *def) next(RPAREN); } -void Moc::parseClassInfo(ClassDef *def) +void Moc::parseClassInfo(BaseDef *def) { next(LPAREN); ClassInfoDef infoDef; diff --git a/src/tools/moc/moc.h b/src/tools/moc/moc.h index 843bdeb794..6040f944f3 100644 --- a/src/tools/moc/moc.h +++ b/src/tools/moc/moc.h @@ -144,12 +144,18 @@ struct ClassInfoDef }; Q_DECLARE_TYPEINFO(ClassInfoDef, Q_MOVABLE_TYPE); -struct ClassDef { - ClassDef(): - hasQObject(false), hasQGadget(false), notifyableProperties(0) - , revisionedMethods(0), revisionedProperties(0), begin(0), end(0){} +struct BaseDef { QByteArray classname; QByteArray qualified; + QVector<ClassInfoDef> classInfoList; + QMap<QByteArray, bool> enumDeclarations; + QVector<EnumDef> enumList; + QMap<QByteArray, QByteArray> flagAliases; + int begin = 0; + int end = 0; +}; + +struct ClassDef : BaseDef { QVector<QPair<QByteArray, FunctionDef::Access> > superclassList; struct Interface @@ -162,8 +168,8 @@ struct ClassDef { }; QVector<QVector<Interface> >interfaceList; - bool hasQObject; - bool hasQGadget; + bool hasQObject = false; + bool hasQGadget = false; struct PluginData { QByteArray iid; @@ -173,25 +179,17 @@ struct ClassDef { QVector<FunctionDef> constructorList; QVector<FunctionDef> signalList, slotList, methodList, publicList; - int notifyableProperties; + int notifyableProperties = 0; QVector<PropertyDef> propertyList; - QVector<ClassInfoDef> classInfoList; - QMap<QByteArray, bool> enumDeclarations; - QVector<EnumDef> enumList; - QMap<QByteArray, QByteArray> flagAliases; - int revisionedMethods; - int revisionedProperties; + int revisionedMethods = 0; + int revisionedProperties = 0; - int begin; - int end; }; Q_DECLARE_TYPEINFO(ClassDef, Q_MOVABLE_TYPE); Q_DECLARE_TYPEINFO(ClassDef::Interface, Q_MOVABLE_TYPE); -struct NamespaceDef { - QByteArray name; - int begin; - int end; +struct NamespaceDef : BaseDef { + bool hasQNamespace = false; }; Q_DECLARE_TYPEINFO(NamespaceDef, Q_MOVABLE_TYPE); @@ -240,9 +238,9 @@ public: void parseProperty(ClassDef *def); void parsePluginData(ClassDef *def); void createPropertyDef(PropertyDef &def); - void parseEnumOrFlag(ClassDef *def, bool isFlag); - void parseFlag(ClassDef *def); - void parseClassInfo(ClassDef *def); + void parseEnumOrFlag(BaseDef *def, bool isFlag); + void parseFlag(BaseDef *def); + void parseClassInfo(BaseDef *def); void parseInterfaces(ClassDef *def); void parseDeclareInterface(); void parseDeclareMetatype(); diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp index 74c75eda5b..11bf8d7937 100644 --- a/src/tools/moc/preprocessor.cpp +++ b/src/tools/moc/preprocessor.cpp @@ -251,7 +251,7 @@ Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocesso } token = FLOATING_LITERAL; ++data; - // fall through + Q_FALLTHROUGH(); case FLOATING_LITERAL: while (is_digit_char(*data)) ++data; @@ -321,7 +321,7 @@ Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocesso ++data; } token = WHITESPACE; // one comment, one whitespace - // fall through; + Q_FALLTHROUGH(); case WHITESPACE: if (column == 1) column = 0; @@ -428,7 +428,7 @@ Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocesso } token = PP_FLOATING_LITERAL; ++data; - // fall through + Q_FALLTHROUGH(); case PP_FLOATING_LITERAL: while (is_digit_char(*data)) ++data; @@ -482,7 +482,7 @@ Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocesso ++data; } token = PP_WHITESPACE; // one comment, one whitespace - // fall through; + Q_FALLTHROUGH(); case PP_WHITESPACE: while (*data && (*data == ' ' || *data == '\t')) ++data; @@ -696,12 +696,9 @@ Symbols Preprocessor::macroExpandIdentifier(Preprocessor *that, SymbolStack &sym next = arg.at(0); } - if (!expansion.isEmpty() && expansion.constLast().token == s.token) { - Symbol last = expansion.constLast(); - expansion.pop_back(); - - if (last.token == STRING_LITERAL || s.token == STRING_LITERAL) - that->error("Can't concatenate non identifier tokens"); + if (!expansion.isEmpty() && expansion.constLast().token == s.token + && expansion.constLast().token != STRING_LITERAL) { + Symbol last = expansion.takeLast(); QByteArray lexem = last.lexem() + next.lexem(); expansion += Symbol(lineNum, last.token, lexem); @@ -1008,6 +1005,36 @@ static void mergeStringLiterals(Symbols *_symbols) } } +QByteArray Preprocessor::resolveInclude(const QByteArray &include, const QByteArray &relativeTo) +{ + // #### stringery + QFileInfo fi; + if (!relativeTo.isEmpty()) + fi.setFile(QFileInfo(QString::fromLocal8Bit(relativeTo.constData())).dir(), QString::fromLocal8Bit(include.constData())); + for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) { + const IncludePath &p = Preprocessor::includes.at(j); + if (p.isFrameworkPath) { + const int slashPos = include.indexOf('/'); + if (slashPos == -1) + continue; + fi.setFile(QString::fromLocal8Bit(p.path + '/' + include.left(slashPos) + ".framework/Headers/"), + QString::fromLocal8Bit(include.mid(slashPos + 1).constData())); + } else { + fi.setFile(QString::fromLocal8Bit(p.path.constData()), QString::fromLocal8Bit(include.constData())); + } + // try again, maybe there's a file later in the include paths with the same name + // (186067) + if (fi.isDir()) { + fi = QFileInfo(); + continue; + } + } + + if (!fi.exists() || fi.isDir()) + return QByteArray(); + return fi.canonicalFilePath().toLocal8Bit(); +} + void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) { currentFilenames.push(filename); @@ -1028,32 +1055,9 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) continue; until(PP_NEWLINE); - // #### stringery - QFileInfo fi; - if (local) - fi.setFile(QFileInfo(QString::fromLocal8Bit(filename.constData())).dir(), QString::fromLocal8Bit(include.constData())); - for (int j = 0; j < Preprocessor::includes.size() && !fi.exists(); ++j) { - const IncludePath &p = Preprocessor::includes.at(j); - if (p.isFrameworkPath) { - const int slashPos = include.indexOf('/'); - if (slashPos == -1) - continue; - fi.setFile(QString::fromLocal8Bit(p.path + '/' + include.left(slashPos) + ".framework/Headers/"), - QString::fromLocal8Bit(include.mid(slashPos + 1).constData())); - } else { - fi.setFile(QString::fromLocal8Bit(p.path.constData()), QString::fromLocal8Bit(include.constData())); - } - // try again, maybe there's a file later in the include paths with the same name - // (186067) - if (fi.isDir()) { - fi = QFileInfo(); - continue; - } - } - - if (!fi.exists() || fi.isDir()) + include = resolveInclude(include, local ? filename : QByteArray()); + if (include.isNull()) continue; - include = fi.canonicalFilePath().toLocal8Bit(); if (Preprocessor::preprocessedIncludes.contains(include)) continue; @@ -1173,7 +1177,7 @@ void Preprocessor::preprocess(const QByteArray &filename, Symbols &preprocessed) case PP_ELIF: case PP_ELSE: skipUntilEndif(); - // fall through + Q_FALLTHROUGH(); case PP_ENDIF: until(PP_NEWLINE); continue; @@ -1208,6 +1212,7 @@ Symbols Preprocessor::preprocessed(const QByteArray &filename, QFile *file) input = cleaned(input); // phase 2: tokenize for the preprocessor + index = 0; symbols = tokenize(input); #if 0 diff --git a/src/tools/moc/preprocessor.h b/src/tools/moc/preprocessor.h index 9a49751eb0..a7eb1a19e1 100644 --- a/src/tools/moc/preprocessor.h +++ b/src/tools/moc/preprocessor.h @@ -62,6 +62,7 @@ public: QList<QByteArray> frameworks; QSet<QByteArray> preprocessedIncludes; Macros macros; + QByteArray resolveInclude(const QByteArray &filename, const QByteArray &relativeTo); Symbols preprocessed(const QByteArray &filename, QFile *device); void parseDefineArguments(Macro *m); diff --git a/src/tools/moc/token.h b/src/tools/moc/token.h index 3557da8aa8..db9d319b78 100644 --- a/src/tools/moc/token.h +++ b/src/tools/moc/token.h @@ -154,12 +154,15 @@ QT_BEGIN_NAMESPACE F(RETURN) \ F(Q_OBJECT_TOKEN) \ F(Q_GADGET_TOKEN) \ + F(Q_NAMESPACE_TOKEN) \ F(Q_PROPERTY_TOKEN) \ F(Q_PLUGIN_METADATA_TOKEN) \ F(Q_ENUMS_TOKEN) \ F(Q_ENUM_TOKEN) \ + F(Q_ENUM_NS_TOKEN) \ F(Q_FLAGS_TOKEN) \ F(Q_FLAG_TOKEN) \ + F(Q_FLAG_NS_TOKEN) \ F(Q_DECLARE_FLAGS_TOKEN) \ F(Q_DECLARE_INTERFACE_TOKEN) \ F(Q_DECLARE_METATYPE_TOKEN) \ diff --git a/src/tools/moc/util/generate_keywords.cpp b/src/tools/moc/util/generate_keywords.cpp index d0f76a4c45..df850c1bdc 100644 --- a/src/tools/moc/util/generate_keywords.cpp +++ b/src/tools/moc/util/generate_keywords.cpp @@ -213,13 +213,16 @@ static const Keyword keywords[] = { { "goto", "GOTO" }, { "return", "RETURN" }, { "Q_OBJECT", "Q_OBJECT_TOKEN" }, + { "Q_NAMESPACE", "Q_NAMESPACE_TOKEN" }, { "Q_GADGET", "Q_GADGET_TOKEN" }, { "Q_PROPERTY", "Q_PROPERTY_TOKEN" }, { "Q_PLUGIN_METADATA", "Q_PLUGIN_METADATA_TOKEN" }, { "Q_ENUMS", "Q_ENUMS_TOKEN" }, { "Q_ENUM", "Q_ENUM_TOKEN" }, + { "Q_ENUM_NS", "Q_ENUM_NS_TOKEN" }, { "Q_FLAGS", "Q_FLAGS_TOKEN" }, { "Q_FLAG", "Q_FLAG_TOKEN" }, + { "Q_FLAG_NS", "Q_FLAG_NS_TOKEN" }, { "Q_DECLARE_FLAGS", "Q_DECLARE_FLAGS_TOKEN" }, { "Q_DECLARE_INTERFACE", "Q_DECLARE_INTERFACE_TOKEN" }, { "Q_DECLARE_METATYPE", "Q_DECLARE_METATYPE_TOKEN" }, |