diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-02-15 16:24:10 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-02-15 17:13:30 +0100 |
commit | 618173e0674977d6bd18504b4b3c8cc7b496c4e6 (patch) | |
tree | 10b6230f42d9f0104c59efa59d7ff8a2fcfdc229 /src/shared/cplusplus/Parser.cpp | |
parent | 070d06c163a72cf1584ab5677ce652d930b90c66 (diff) | |
download | qt-creator-618173e0674977d6bd18504b4b3c8cc7b496c4e6.tar.gz |
Fixed Q_ENUMS/Q_FLAGS parsing to handle namespaces.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 49 |
1 files changed, 41 insertions, 8 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 7bc832ffa6..fd2efcf978 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1882,17 +1882,49 @@ bool Parser::parseQtEnumDeclaration(DeclarationAST *&node) QtEnumDeclarationAST *ast = new (_pool) QtEnumDeclarationAST; ast->enum_specifier_token = consumeToken(); match(T_LPAREN, &ast->lparen_token); - for (NameListAST **iter = &ast->enumerator_list; LA() == T_IDENTIFIER; iter = &(*iter)->next) { + for (NameListAST **iter = &ast->enumerator_list; LA() && LA() != T_RPAREN; iter = &(*iter)->next) { + NameAST *name_ast = 0; + if (!parseEnumName(name_ast)) + break; *iter = new (_pool) NameListAST; - SimpleNameAST *name = new (_pool) SimpleNameAST; - name->identifier_token = consumeToken(); - (*iter)->value = name; + (*iter)->value = name_ast; } match(T_RPAREN, &ast->rparen_token); node = ast; return true; } +bool Parser::parseEnumName(NameAST *&node) +{ + DEBUG_THIS_RULE(); + + unsigned global_scope_token = 0; + if (LA() == T_COLON_COLON) + global_scope_token = consumeToken(); + + NestedNameSpecifierListAST *nested_name_specifier = 0; + parseNestedNameSpecifierOpt(nested_name_specifier, + /*acceptTemplateId=*/ true); + + unsigned identifier_token = 0; + match(T_IDENTIFIER, &identifier_token); + if (global_scope_token == 0 && nested_name_specifier == 0 + && identifier_token == 0) + return false; + + SimpleNameAST *name_ast = new (_pool) SimpleNameAST; + name_ast->identifier_token = identifier_token; + if (nested_name_specifier || global_scope_token) { + QualifiedNameAST *q_name_ast = new (_pool) QualifiedNameAST; + q_name_ast->nested_name_specifier_list = nested_name_specifier; + q_name_ast->unqualified_name = name_ast; + q_name_ast->global_scope_token = global_scope_token; + } else { + node = name_ast; + } + return true; +} + // q-flags-decl ::= 'Q_FLAGS' '(' q-flags-list? ')' // q-flags-list ::= identifier // q-flags-list ::= q-flags-list identifier @@ -1914,11 +1946,12 @@ bool Parser::parseQtFlags(DeclarationAST *&node) QtFlagsDeclarationAST *ast = new (_pool) QtFlagsDeclarationAST; ast->flags_specifier_token = consumeToken(); match(T_LPAREN, &ast->lparen_token); - for (NameListAST **iter = &ast->flag_enums_list; LA() == T_IDENTIFIER; iter = &(*iter)->next) { + for (NameListAST **iter = &ast->flag_enums_list; LA() && LA() != T_RPAREN; iter = &(*iter)->next) { + NameAST *name_ast = 0; + if (!parseEnumName(name_ast)) + break; *iter = new (_pool) NameListAST; - SimpleNameAST *name = new (_pool) SimpleNameAST; - name->identifier_token = consumeToken(); - (*iter)->value = name; + (*iter)->value = name_ast; } match(T_RPAREN, &ast->rparen_token); node = ast; |