diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp index e37a1b34b7f34623e75fca526251997158a429fa..348f9cddd72deb1362d6d72fd5c57c46d7b944ca 100644 --- a/src/shared/cplusplus/AST.cpp +++ b/src/shared/cplusplus/AST.cpp @@ -144,6 +144,42 @@ unsigned AccessDeclarationAST::lastToken() const return access_specifier_token + 1; } +unsigned QtPropertyDeclarationNamingItemAST::firstToken() const +{ + return item_name_token; +} + +unsigned QtPropertyDeclarationNamingItemAST::lastToken() const +{ + if (name_value) + return name_value->lastToken(); + else + return item_name_token + 1; +} + +unsigned QtPropertyDeclarationBoolItemAST::firstToken() const +{ + return item_name_token; +} + +unsigned QtPropertyDeclarationBoolItemAST::lastToken() const +{ + if (bool_value) + return bool_value->lastToken(); + else + return item_name_token + 1; +} + +unsigned QtPropertyDeclarationFlaggingItemAST::firstToken() const +{ + return item_name_token; +} + +unsigned QtPropertyDeclarationFlaggingItemAST::lastToken() const +{ + return item_name_token + 1; +} + unsigned QtPropertyDeclarationAST::firstToken() const { return property_specifier_token; @@ -151,7 +187,18 @@ unsigned QtPropertyDeclarationAST::firstToken() const unsigned QtPropertyDeclarationAST::lastToken() const { - return rparen_token; + if (rparen_token) + return rparen_token + 1; + else if (property_declaration_items) + return property_declaration_items->lastToken(); + else if (property_name) + return property_name->lastToken(); + else if (type_id) + return type_id->lastToken(); + else if (lparen_token) + return lparen_token + 1; + else + return property_specifier_token + 1; } unsigned QtEnumDeclarationAST::firstToken() const @@ -161,17 +208,31 @@ unsigned QtEnumDeclarationAST::firstToken() const unsigned QtEnumDeclarationAST::lastToken() const { - return rparen_token; + if (rparen_token) + return rparen_token + 1; + else if (enumerator_list) + return enumerator_list->lastToken(); + else if (lparen_token) + return lparen_token + 1; + else + return enum_specifier_token + 1; } unsigned QtFlagsDeclarationAST::firstToken() const { - return this->flags_specifier_token; + return flags_specifier_token + 1; } unsigned QtFlagsDeclarationAST::lastToken() const { - return rparen_token; + if (rparen_token) + return rparen_token + 1; + else if (flag_enums_list) + return flag_enums_list->lastToken(); + else if (lparen_token) + return lparen_token + 1; + else + return flags_specifier_token + 1; } unsigned QtDeclareFlagsDeclarationAST::firstToken() const @@ -181,7 +242,18 @@ unsigned QtDeclareFlagsDeclarationAST::firstToken() const unsigned QtDeclareFlagsDeclarationAST::lastToken() const { - return rparen_token; + if (rparen_token) + return rparen_token + 1; + else if (flags_name) + return flags_name->lastToken(); + else if (comma_token) + return comma_token + 1; + else if (enum_name) + return enum_name->lastToken(); + else if (lparen_token) + return lparen_token + 1; + else + return declareflags_specifier_token + 1; } unsigned ArrayAccessAST::firstToken() const diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index e7824f9393ff3f5fdb48b4e78054445bc8eef599..eef6ec7528bc83b3d31d67299156d2ee408eee0f 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -262,6 +262,10 @@ public: virtual QtMemberDeclarationAST *asQtMemberDeclaration() { return 0; } virtual QtMethodAST *asQtMethod() { return 0; } virtual QtPropertyDeclarationAST *asQtPropertyDeclaration() { return 0; } + virtual QtPropertyDeclarationBoolItemAST *asQtPropertyDeclarationBoolItem() { return 0; } + virtual QtPropertyDeclarationFlaggingItemAST *asQtPropertyDeclarationFlaggingItem() { return 0; } + virtual QtPropertyDeclarationItemAST *asQtPropertyDeclarationItem() { return 0; } + virtual QtPropertyDeclarationNamingItemAST *asQtPropertyDeclarationNamingItem() { return 0; } virtual QualifiedNameAST *asQualifiedName() { return 0; } virtual ReferenceAST *asReference() { return 0; } virtual ReturnStatementAST *asReturnStatement() { return 0; } @@ -552,43 +556,76 @@ protected: virtual bool match0(AST *, ASTMatcher *); }; +class QtPropertyDeclarationItemAST: public AST +{ +public: + unsigned item_name_token; + +public: + virtual QtPropertyDeclarationItemAST *asQtPropertyDeclarationItem() { return this; } + + virtual QtPropertyDeclarationItemAST *clone(MemoryPool *pool) const = 0; +}; + +class QtPropertyDeclarationNamingItemAST: public QtPropertyDeclarationItemAST +{ +public: + SimpleNameAST *name_value; + +public: + virtual QtPropertyDeclarationNamingItemAST *asQtPropertyDeclarationNamingItem() { return this; } + + virtual unsigned firstToken() const; + virtual unsigned lastToken() const; + + virtual QtPropertyDeclarationNamingItemAST *clone(MemoryPool *pool) const; + +protected: + virtual void accept0(ASTVisitor *visitor); + virtual bool match0(AST *, ASTMatcher *); +}; + +class QtPropertyDeclarationBoolItemAST: public QtPropertyDeclarationItemAST +{ +public: + BoolLiteralAST *bool_value; + +public: + virtual QtPropertyDeclarationBoolItemAST *asQtPropertyDeclarationBoolItem() { return this; } + + virtual unsigned firstToken() const; + virtual unsigned lastToken() const; + + virtual QtPropertyDeclarationBoolItemAST *clone(MemoryPool *pool) const; + +protected: + virtual void accept0(ASTVisitor *visitor); + virtual bool match0(AST *, ASTMatcher *); +}; + +class QtPropertyDeclarationFlaggingItemAST: public QtPropertyDeclarationItemAST +{ +public: + virtual QtPropertyDeclarationFlaggingItemAST *asQtPropertyDeclarationFlaggingItem() { return this; } + + virtual unsigned firstToken() const; + virtual unsigned lastToken() const; + + virtual QtPropertyDeclarationFlaggingItemAST *clone(MemoryPool *pool) const; + +protected: + virtual void accept0(ASTVisitor *visitor); + virtual bool match0(AST *, ASTMatcher *); +}; + class CPLUSPLUS_EXPORT QtPropertyDeclarationAST: public DeclarationAST { - /* - Q_PROPERTY(type name - READ getFunction - [WRITE setFunction] - [RESET resetFunction] - [NOTIFY notifySignal] - [DESIGNABLE bool] - [SCRIPTABLE bool] - [STORED bool] - [USER bool] - [CONSTANT] - [FINAL])*/ public: unsigned property_specifier_token; unsigned lparen_token; ExpressionAST *type_id; SimpleNameAST *property_name; - unsigned read_token; - SimpleNameAST *read_function; - unsigned write_token; - SimpleNameAST *write_function; - unsigned reset_token; - SimpleNameAST *reset_function; - unsigned notify_token; - SimpleNameAST *notify_function; - unsigned designable_token; - BoolLiteralAST *designable_value; - unsigned scriptable_token; - BoolLiteralAST *scriptable_value; - unsigned stored_token; - BoolLiteralAST *stored_value; - unsigned user_token; - BoolLiteralAST *user_value; - unsigned constant_token; - unsigned final_token; + QtPropertyDeclarationItemListAST *property_declaration_items; unsigned rparen_token; public: diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index 68b907cdcfcb68b973cfe34748e8d13bdf0a6caf..183cce037a6bb5b6a50a99f050debcb90eeaa80b 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -138,6 +138,28 @@ AccessDeclarationAST *AccessDeclarationAST::clone(MemoryPool *pool) const return ast; } +QtPropertyDeclarationNamingItemAST *QtPropertyDeclarationNamingItemAST::clone(MemoryPool *pool) const +{ + QtPropertyDeclarationNamingItemAST *ast = new (pool) QtPropertyDeclarationNamingItemAST; + if (name_value) + ast->name_value = name_value->clone(pool); + return ast; +} + +QtPropertyDeclarationBoolItemAST *QtPropertyDeclarationBoolItemAST::clone(MemoryPool *pool) const +{ + QtPropertyDeclarationBoolItemAST *ast = new (pool) QtPropertyDeclarationBoolItemAST; + if (bool_value) + ast->bool_value = bool_value->clone(pool); + return ast; +} + +QtPropertyDeclarationFlaggingItemAST *QtPropertyDeclarationFlaggingItemAST::clone(MemoryPool *pool) const +{ + QtPropertyDeclarationFlaggingItemAST *ast = new (pool) QtPropertyDeclarationFlaggingItemAST; + return ast; +} + QtPropertyDeclarationAST *QtPropertyDeclarationAST::clone(MemoryPool *pool) const { QtPropertyDeclarationAST *ast = new (pool) QtPropertyDeclarationAST; @@ -147,32 +169,9 @@ QtPropertyDeclarationAST *QtPropertyDeclarationAST::clone(MemoryPool *pool) cons ast->type_id = type_id->clone(pool); if (property_name) ast->property_name = property_name->clone(pool); - ast->read_token = read_token; - if (read_function) - ast->read_function = read_function->clone(pool); - ast->write_token = write_token; - if (write_function) - ast->write_function = write_function->clone(pool); - ast->reset_token = reset_token; - if (reset_function) - ast->reset_function = reset_function->clone(pool); - ast->notify_token = notify_token; - if (notify_function) - ast->notify_function = notify_function->clone(pool); - ast->designable_token = designable_token; - if (designable_value) - ast->designable_value = designable_value->clone(pool); - ast->scriptable_token = scriptable_token; - if (scriptable_value) - ast->scriptable_value = scriptable_value->clone(pool); - ast->stored_token = stored_token; - if (stored_value) - ast->stored_value = stored_value->clone(pool); - ast->user_token = user_token; - if (user_value) - ast->user_value = user_value->clone(pool); - ast->constant_token = constant_token; - ast->final_token = final_token; + for (QtPropertyDeclarationItemListAST *iter = property_declaration_items, **ast_iter = &ast->property_declaration_items; + iter; iter = iter->next, ast_iter = &(*ast_iter)->next) + *ast_iter = new (pool) QtPropertyDeclarationItemListAST((iter->value) ? iter->value->clone(pool) : 0); ast->rparen_token = rparen_token; return ast; } diff --git a/src/shared/cplusplus/ASTMatch0.cpp b/src/shared/cplusplus/ASTMatch0.cpp index 6a49dba34a952630b62d650fbbc5c5f0748b19f2..74d0aa6e5eb6fe4113c8d936312e0f7cb58ebd29 100644 --- a/src/shared/cplusplus/ASTMatch0.cpp +++ b/src/shared/cplusplus/ASTMatch0.cpp @@ -105,6 +105,30 @@ bool AccessDeclarationAST::match0(AST *pattern, ASTMatcher *matcher) return false; } +bool QtPropertyDeclarationNamingItemAST::match0(AST *pattern, ASTMatcher *matcher) +{ + if (QtPropertyDeclarationNamingItemAST *_other = pattern->asQtPropertyDeclarationNamingItem()) + return matcher->match(this, _other); + + return false; +} + +bool QtPropertyDeclarationBoolItemAST::match0(AST *pattern, ASTMatcher *matcher) +{ + if (QtPropertyDeclarationBoolItemAST *_other = pattern->asQtPropertyDeclarationBoolItem()) + return matcher->match(this, _other); + + return false; +} + +bool QtPropertyDeclarationFlaggingItemAST::match0(AST *pattern, ASTMatcher *matcher) +{ + if (QtPropertyDeclarationFlaggingItemAST *_other = pattern->asQtPropertyDeclarationFlaggingItem()) + return matcher->match(this, _other); + + return false; +} + bool QtPropertyDeclarationAST::match0(AST *pattern, ASTMatcher *matcher) { if (QtPropertyDeclarationAST *_other = pattern->asQtPropertyDeclaration()) diff --git a/src/shared/cplusplus/ASTMatcher.cpp b/src/shared/cplusplus/ASTMatcher.cpp index 0ec34db4747406c56331bf07047f71844517f402..6992a1d1cc2f488a2dbc9459da6c2db778867e9e 100644 --- a/src/shared/cplusplus/ASTMatcher.cpp +++ b/src/shared/cplusplus/ASTMatcher.cpp @@ -206,85 +206,64 @@ bool ASTMatcher::match(AccessDeclarationAST *node, AccessDeclarationAST *pattern return true; } -bool ASTMatcher::match(QtPropertyDeclarationAST *node, QtPropertyDeclarationAST *pattern) +bool ASTMatcher::match(QtPropertyDeclarationNamingItemAST *node, QtPropertyDeclarationNamingItemAST *pattern) { (void) node; (void) pattern; - pattern->property_specifier_token = node->property_specifier_token; - - pattern->lparen_token = node->lparen_token; - - if (! pattern->type_id) - pattern->type_id = node->type_id; - else if (! AST::match(node->type_id, pattern->type_id, this)) - return false; - - if (! pattern->property_name) - pattern->property_name = node->property_name; - else if (! AST::match(node->property_name, pattern->property_name, this)) + if (! pattern->name_value) + pattern->name_value = node->name_value; + else if (! AST::match(node->name_value, pattern->name_value, this)) return false; - pattern->read_token = node->read_token; - - if (! pattern->read_function) - pattern->read_function = node->read_function; - else if (! AST::match(node->read_function, pattern->read_function, this)) - return false; + return true; +} - pattern->write_token = node->write_token; +bool ASTMatcher::match(QtPropertyDeclarationBoolItemAST *node, QtPropertyDeclarationBoolItemAST *pattern) +{ + (void) node; + (void) pattern; - if (! pattern->write_function) - pattern->write_function = node->write_function; - else if (! AST::match(node->write_function, pattern->write_function, this)) + if (! pattern->bool_value) + pattern->bool_value = node->bool_value; + else if (! AST::match(node->bool_value, pattern->bool_value, this)) return false; - pattern->reset_token = node->reset_token; - - if (! pattern->reset_function) - pattern->reset_function = node->reset_function; - else if (! AST::match(node->reset_function, pattern->reset_function, this)) - return false; + return true; +} - pattern->notify_token = node->notify_token; +bool ASTMatcher::match(QtPropertyDeclarationFlaggingItemAST *node, QtPropertyDeclarationFlaggingItemAST *pattern) +{ + (void) node; + (void) pattern; - if (! pattern->notify_function) - pattern->notify_function = node->notify_function; - else if (! AST::match(node->notify_function, pattern->notify_function, this)) - return false; + return true; +} - pattern->designable_token = node->designable_token; +bool ASTMatcher::match(QtPropertyDeclarationAST *node, QtPropertyDeclarationAST *pattern) +{ + (void) node; + (void) pattern; - if (! pattern->designable_value) - pattern->designable_value = node->designable_value; - else if (! AST::match(node->designable_value, pattern->designable_value, this)) - return false; + pattern->property_specifier_token = node->property_specifier_token; - pattern->scriptable_token = node->scriptable_token; + pattern->lparen_token = node->lparen_token; - if (! pattern->scriptable_value) - pattern->scriptable_value = node->scriptable_value; - else if (! AST::match(node->scriptable_value, pattern->scriptable_value, this)) + if (! pattern->type_id) + pattern->type_id = node->type_id; + else if (! AST::match(node->type_id, pattern->type_id, this)) return false; - pattern->stored_token = node->stored_token; - - if (! pattern->stored_value) - pattern->stored_value = node->stored_value; - else if (! AST::match(node->stored_value, pattern->stored_value, this)) + if (! pattern->property_name) + pattern->property_name = node->property_name; + else if (! AST::match(node->property_name, pattern->property_name, this)) return false; - pattern->user_token = node->user_token; - - if (! pattern->user_value) - pattern->user_value = node->user_value; - else if (! AST::match(node->user_value, pattern->user_value, this)) + if (! pattern->property_declaration_items) + pattern->property_declaration_items = node->property_declaration_items; + else if (! AST::match(node->property_declaration_items, pattern->property_declaration_items, this)) return false; - pattern->constant_token = node->constant_token; - - pattern->final_token = node->final_token; - pattern->rparen_token = node->rparen_token; return true; diff --git a/src/shared/cplusplus/ASTMatcher.h b/src/shared/cplusplus/ASTMatcher.h index df097eec3016f474529f651044b0c07a26a95f19..f024f82ff8ae0f9a1ca1a589970afac58ea0f8db 100644 --- a/src/shared/cplusplus/ASTMatcher.h +++ b/src/shared/cplusplus/ASTMatcher.h @@ -142,6 +142,9 @@ public: virtual bool match(QtMethodAST *node, QtMethodAST *pattern); virtual bool match(QtMemberDeclarationAST *node, QtMemberDeclarationAST *pattern); virtual bool match(ObjCClassDeclarationAST *node, ObjCClassDeclarationAST *pattern); + virtual bool match(QtPropertyDeclarationBoolItemAST *node, QtPropertyDeclarationBoolItemAST *pattern); + virtual bool match(QtPropertyDeclarationFlaggingItemAST *node, QtPropertyDeclarationFlaggingItemAST *pattern); + virtual bool match(QtPropertyDeclarationNamingItemAST *node, QtPropertyDeclarationNamingItemAST *pattern); virtual bool match(ObjCClassForwardDeclarationAST *node, ObjCClassForwardDeclarationAST *pattern); virtual bool match(ObjCProtocolDeclarationAST *node, ObjCProtocolDeclarationAST *pattern); virtual bool match(ObjCProtocolForwardDeclarationAST *node, ObjCProtocolForwardDeclarationAST *pattern); diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp index 430f60679c8f896ec8b31c4e97917aaf8d8b9a43..22d9bd20ded0af877a04a0e5c82f30fc1b793a64 100644 --- a/src/shared/cplusplus/ASTVisit.cpp +++ b/src/shared/cplusplus/ASTVisit.cpp @@ -108,19 +108,35 @@ void AccessDeclarationAST::accept0(ASTVisitor *visitor) visitor->endVisit(this); } +void QtPropertyDeclarationNamingItemAST::accept0(ASTVisitor *visitor) +{ + if (visitor->visit(this)) { + accept(name_value, visitor); + } + visitor->endVisit(this); +} + +void QtPropertyDeclarationBoolItemAST::accept0(ASTVisitor *visitor) +{ + if (visitor->visit(this)) { + accept(bool_value, visitor); + } + visitor->endVisit(this); +} + +void QtPropertyDeclarationFlaggingItemAST::accept0(ASTVisitor *visitor) +{ + if (visitor->visit(this)) { + } + visitor->endVisit(this); +} + void QtPropertyDeclarationAST::accept0(ASTVisitor *visitor) { if (visitor->visit(this)) { accept(type_id, visitor); accept(property_name, visitor); - accept(read_function, visitor); - accept(write_function, visitor); - accept(reset_function, visitor); - accept(notify_function, visitor); - accept(designable_value, visitor); - accept(scriptable_value, visitor); - accept(stored_value, visitor); - accept(user_value, visitor); + accept(property_declaration_items, visitor); } visitor->endVisit(this); } diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h index 92cd08f3924e2a148c61cabbe44aa80cbc2d61a1..343e3a6331c3804ef6a9194315be867c8f53400d 100644 --- a/src/shared/cplusplus/ASTVisitor.h +++ b/src/shared/cplusplus/ASTVisitor.h @@ -205,6 +205,10 @@ public: virtual bool visit(QtMethodAST *) { return true; } virtual bool visit(QtMemberDeclarationAST *) { return true; } + virtual bool visit(QtPropertyDeclarationBoolItemAST *) { return true; } + virtual bool visit(QtPropertyDeclarationFlaggingItemAST *) { return true; } + virtual bool visit(QtPropertyDeclarationNamingItemAST *) { return true; } + // ObjC++ virtual bool visit(ObjCClassDeclarationAST *) { return true; } virtual bool visit(ObjCClassForwardDeclarationAST *) { return true; } @@ -336,6 +340,10 @@ public: virtual void endVisit(QtMethodAST *) { } virtual void endVisit(QtMemberDeclarationAST *) { } + virtual void endVisit(QtPropertyDeclarationBoolItemAST *) { } + virtual void endVisit(QtPropertyDeclarationFlaggingItemAST *) { } + virtual void endVisit(QtPropertyDeclarationNamingItemAST *) { } + // ObjC++ virtual void endVisit(ObjCClassDeclarationAST *) { } virtual void endVisit(ObjCClassForwardDeclarationAST *) { } diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h index 9890143e41e95850399ac7ea02aa343fcc03d361..77864ca4575db5837f73c6cfac9d8bd51f5e59a2 100644 --- a/src/shared/cplusplus/ASTfwd.h +++ b/src/shared/cplusplus/ASTfwd.h @@ -169,6 +169,10 @@ class QtFlagsDeclarationAST; class QtMemberDeclarationAST; class QtMethodAST; class QtPropertyDeclarationAST; +class QtPropertyDeclarationBoolItemAST; +class QtPropertyDeclarationFlaggingItemAST; +class QtPropertyDeclarationItemAST; +class QtPropertyDeclarationNamingItemAST; class QualifiedNameAST; class ReferenceAST; class ReturnStatementAST; @@ -213,8 +217,9 @@ typedef List<NestedNameSpecifierAST *> NestedNameSpecifierListAST; typedef List<CatchClauseAST *> CatchClauseListAST; typedef List<PtrOperatorAST *> PtrOperatorListAST; typedef List<SpecifierAST *> SpecifierListAST; - +typedef List<QtPropertyDeclarationItemAST *> QtPropertyDeclarationItemListAST; typedef List<NameAST *> NameListAST; + typedef List<ObjCMessageArgumentAST *> ObjCMessageArgumentListAST; typedef List<ObjCSelectorArgumentAST *> ObjCSelectorArgumentListAST; typedef List<ObjCPropertyAttributeAST *> ObjCPropertyAttributeListAST; diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp index b5c402e31426b8f35b1f72aed447d883f3db4986..faeac37e106dff9d837479a9473d67888f31b5be 100644 --- a/src/shared/cplusplus/CheckDeclaration.cpp +++ b/src/shared/cplusplus/CheckDeclaration.cpp @@ -831,13 +831,16 @@ bool CheckDeclaration::visit(QtPropertyDeclarationAST *ast) semantic()->check(ast->type_id, _scope); if (ast->property_name) semantic()->check(ast->property_name, _scope); - if (ast->read_function) - semantic()->check(ast->read_function, _scope); - if (ast->write_function) - semantic()->check(ast->write_function, _scope); - if (ast->reset_function) - semantic()->check(ast->reset_function, _scope); - if (ast->notify_function) - semantic()->check(ast->notify_function, _scope); + + for (QtPropertyDeclarationItemListAST *iter = ast->property_declaration_items; + iter; iter = iter->next) { + if (! iter->value) + continue; + + if (QtPropertyDeclarationNamingItemAST *namedItem = iter->value->asQtPropertyDeclarationNamingItem()) + if (namedItem->name_value) + semantic()->check(namedItem->name_value, _scope); + } + return false; } diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 9c504f0f546553c319174b83213e2e6c37f17923..60828aa6fe5640d651493a6916cbbc7794e7d1ea 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1794,74 +1794,59 @@ bool Parser::parseQtPropertyDeclaration(DeclarationAST *&node) parseTypeId(ast->type_id); ast->property_name = new (_pool) SimpleNameAST; match(T_IDENTIFIER, &ast->property_name->identifier_token); - + QtPropertyDeclarationItemListAST **iter = &ast->property_declaration_items; while (true) { if (LA() == T_RPAREN) { ast->rparen_token = consumeToken(); node = ast; break; } else if (LA() == T_IDENTIFIER) { + QtPropertyDeclarationItemAST *item = 0; switch (peekAtQtContextKeyword()) { case Token_READ: - ast->read_token = consumeToken(); - ast->read_function = new (_pool) SimpleNameAST; - match(T_IDENTIFIER, &ast->read_function->identifier_token); - break; - case Token_WRITE: - ast->write_token = consumeToken(); - ast->write_function = new (_pool) SimpleNameAST; - match(T_IDENTIFIER, &ast->write_function->identifier_token); - break; - case Token_RESET: - ast->reset_token = consumeToken(); - ast->reset_function = new (_pool) SimpleNameAST; - match(T_IDENTIFIER, &ast->reset_function->identifier_token); - break; - - case Token_NOTIFY: - ast->notify_token = consumeToken(); - ast->notify_function = new (_pool) SimpleNameAST; - match(T_IDENTIFIER, &ast->notify_function->identifier_token); + case Token_NOTIFY: { + QtPropertyDeclarationNamingItemAST *nItem = new (_pool) QtPropertyDeclarationNamingItemAST; + nItem->item_name_token = consumeToken(); + nItem->name_value = new (_pool) SimpleNameAST; + match(T_IDENTIFIER, &nItem->name_value->identifier_token); + item = nItem; break; + } case Token_DESIGNABLE: - ast->designable_token = consumeToken(); - if (!matchBoolean(ast->designable_value)) - break; - break; - case Token_SCRIPTABLE: - ast->scriptable_token = consumeToken(); - if (!matchBoolean(ast->scriptable_value)) - break; - break; - case Token_STORED: - ast->stored_token = consumeToken(); - if (!matchBoolean(ast->stored_value)) - break; - break; - - case Token_USER: - ast->user_token = consumeToken(); - if (!matchBoolean(ast->user_value)) - break; + case Token_USER: { + QtPropertyDeclarationBoolItemAST *bItem = new (_pool) QtPropertyDeclarationBoolItemAST; + bItem->item_name_token = consumeToken(); + ExpressionAST *expr = 0; + if (parseBoolLiteral(expr)) + bItem->bool_value = expr->asBoolLiteral(); + else + _translationUnit->error(cursor(), "expected `true' or `false' before `%s'", tok().spell()); + item = bItem; break; + } case Token_CONSTANT: - ast->constant_token = consumeToken(); - break; - - case Token_FINAL: - ast->final_token = consumeToken(); + case Token_FINAL: { + QtPropertyDeclarationFlaggingItemAST *fItem = new (_pool) QtPropertyDeclarationFlaggingItemAST; + fItem->item_name_token = consumeToken(); + item = fItem; break; + } default: _translationUnit->error(cursor(), "expected `)' before `%s'", tok().spell()); return true; } + if (item) { + *iter = new (_pool) QtPropertyDeclarationItemListAST; + (*iter)->value = item; + iter = &(*iter)->next; + } } else { _translationUnit->error(cursor(), "expected `)' before `%s'", tok().spell()); break; @@ -1871,18 +1856,6 @@ bool Parser::parseQtPropertyDeclaration(DeclarationAST *&node) return true; } -bool Parser::matchBoolean(BoolLiteralAST *&node) -{ - ExpressionAST *expr = 0; - if (parseBoolLiteral(expr)) { - node = expr->asBoolLiteral(); - return true; - } else { - _translationUnit->error(cursor(), "expected `true' or `false' before `%s'", tok().spell()); - return false; - } -} - // q-enums-decl ::= 'Q_ENUMS' '(' q-enums-list? ')' // q-enums-list ::= identifier // q-enums-list ::= q-enums-list identifier diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index dddf081dd918371d27a25ddc648232f5d05e8060..07f80cdc335b5cc4f1b473b61b995be715a1a7cb 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -79,7 +79,6 @@ public: bool parseEmptyDeclaration(DeclarationAST *&node); bool parseAccessDeclaration(DeclarationAST *&node); bool parseQtPropertyDeclaration(DeclarationAST *&node); - bool matchBoolean(BoolLiteralAST *&node); bool parseQtEnumDeclaration(DeclarationAST *&node); bool parseQtFlags(DeclarationAST *&node); bool parseQtDeclareFlags(DeclarationAST *&node);