summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-02-15 16:24:10 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-02-15 17:13:30 +0100
commit618173e0674977d6bd18504b4b3c8cc7b496c4e6 (patch)
tree10b6230f42d9f0104c59efa59d7ff8a2fcfdc229 /src/shared/cplusplus/Parser.cpp
parent070d06c163a72cf1584ab5677ce652d930b90c66 (diff)
downloadqt-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.cpp49
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;