diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-03-16 17:29:40 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-03-17 10:30:17 +0100 |
commit | b4d72a78dbe365a0b5578e453bb9daaeb0260996 (patch) | |
tree | 5e4de55006cc0276cce7942a9aa33d2f78ea92b4 /src/shared/cplusplus/Parser.cpp | |
parent | 61132f260c029c868e1971771424c62f36cef638 (diff) | |
download | qt-creator-b4d72a78dbe365a0b5578e453bb9daaeb0260996.tar.gz |
Added parser support for Q_INTERFACES.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 93b30251c7..95372cbad5 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -293,6 +293,7 @@ void Parser::skipUntilDeclaration() case T_Q_PROPERTY: case T_Q_ENUMS: case T_Q_FLAGS: + case T_Q_INTERFACES: // Qt function specifiers case T_Q_SIGNAL: @@ -1942,6 +1943,78 @@ bool Parser::parseQtFlags(DeclarationAST *&node) return true; } +// class-specifier ::= +// c++-class-specifier +// q-tag +// q-enums-of-flags +// q-class-info +// q-interfaces +// q-private-slot +// +// declaration ::= +// c++-declaration +// q-declare-interface +// q-declare-metatype +// +// q-tag ::= +// Q_OBJECT +// Q_GADGET +// +// q-enums-or-flags ::= +// (Q_ENUMS | Q_FLAGS) LPAREN name+ RPAREN +// +// q-class-info ::= +// Q_CLASS_INFO LPAREN string-literal COMMA STRING_LITERAL RPAREN +// Q_CLASS_INFO LPAREN string-literal COMMA IDENTIFIER LPAREN STRING_LITERAL RPAREN RPAREN + +// q-interfaces ::= +// Q_INTERFACES LPAREN (name q-constraints)* RPAREN +// +// q-constraints ::= +// (COLON name)* +bool Parser::parseQtInterfaces(DeclarationAST *&node) +{ + DEBUG_THIS_RULE(); + if (LA() != T_Q_INTERFACES) + return false; + + QtInterfacesDeclarationAST *ast = new (_pool) QtInterfacesDeclarationAST; + ast->interfaces_token = consumeToken(); + match(T_LPAREN, &ast->lparen_token); + for (QtInterfaceNameListAST **iter = &ast->interface_name_list; LA() && LA() != T_RPAREN; iter = &(*iter)->next) { + NameAST *name_ast = 0; + if (!parseName(name_ast)) + break; + *iter = new (_pool) QtInterfaceNameListAST; + (*iter)->value = new (_pool) QtInterfaceNameAST; + (*iter)->value->interface_name = name_ast; + for (NameListAST **iter2 = &(*iter)->value->constraint_list; LA() && LA() == T_COLON; iter2 = &(*iter2)->next) { + /*unsigned colon_token =*/ consumeToken(); + NameAST *name_ast2 = 0; + if (!parseName(name_ast2)) + break; + *iter2 = new (_pool) NameListAST; + (*iter2)->value = name_ast2; + } + } + + match(T_RPAREN, &ast->rparen_token); + node = ast; + return true; +} + +// q-private-slot ::= +// Q_PRIVATE_SLOT LPAREN IDENTIFIER (LPAREN RPAREN)? COMMA q-function-declaration RPAREN +// +// q-function-declaration ::= +// decl-specifier-list declarator [+ check for the function-declarator] +// +// q-declare-interface ::= +// Q_DECLARE_INTERFACE LPAREN name COMMA (STRING_LITERAL | IDENTIFIER) RPAREN +// +// q-declare-metatype ::= +// Q_DECLARE_METATYPE LPAREN name RPAREN SEMICOLON? [warning] + bool Parser::parseMemberSpecification(DeclarationAST *&node) { DEBUG_THIS_RULE(); @@ -1971,6 +2044,9 @@ bool Parser::parseMemberSpecification(DeclarationAST *&node) case T_Q_FLAGS: return parseQtFlags(node); + case T_Q_INTERFACES: + return parseQtInterfaces(node); + default: return parseSimpleDeclaration(node, /*acceptStructDeclarator=*/true); } // switch |