summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-02-06 15:47:46 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-02-07 10:49:03 +0100
commit7b913f7fa2e1a372177fe6ddff05d90b8b6827b8 (patch)
tree92275b1eed5fd5d357472b4279b13ce80ae4bb03 /src/shared/cplusplus
parent21488e8898b1aaf5d33b3a33b488e2e280219f06 (diff)
downloadqt-creator-7b913f7fa2e1a372177fe6ddff05d90b8b6827b8.tar.gz
Changed Q_PROPERTY parsing and AST storage.
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp82
-rw-r--r--src/shared/cplusplus/AST.h97
-rw-r--r--src/shared/cplusplus/ASTClone.cpp51
-rw-r--r--src/shared/cplusplus/ASTMatch0.cpp24
-rw-r--r--src/shared/cplusplus/ASTMatcher.cpp93
-rw-r--r--src/shared/cplusplus/ASTMatcher.h3
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp32
-rw-r--r--src/shared/cplusplus/ASTVisitor.h8
-rw-r--r--src/shared/cplusplus/ASTfwd.h7
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp19
-rw-r--r--src/shared/cplusplus/Parser.cpp85
-rw-r--r--src/shared/cplusplus/Parser.h1
12 files changed, 310 insertions, 192 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index e37a1b34b7..348f9cddd7 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 e7824f9393..eef6ec7528 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 68b907cdcf..183cce037a 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 6a49dba34a..74d0aa6e5e 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 0ec34db474..6992a1d1cc 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 df097eec30..f024f82ff8 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 430f60679c..22d9bd20de 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 92cd08f392..343e3a6331 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 9890143e41..77864ca457 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 b5c402e314..faeac37e10 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 9c504f0f54..60828aa6fe 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 dddf081dd9..07f80cdc33 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);