summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/CheckDeclaration.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-03-16 16:38:02 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-03-17 10:30:17 +0100
commit61132f260c029c868e1971771424c62f36cef638 (patch)
treea59169e2f032b9c9436ae1b75d5410becbace007 /src/shared/cplusplus/CheckDeclaration.cpp
parentfd81a276ca5b400d33f8f9749d9fca04a78debb3 (diff)
downloadqt-creator-61132f260c029c868e1971771424c62f36cef638.tar.gz
Fixed Q_ENUMS/Q_FLAGS parsing of enum names.
Diffstat (limited to 'src/shared/cplusplus/CheckDeclaration.cpp')
-rw-r--r--src/shared/cplusplus/CheckDeclaration.cpp41
1 files changed, 37 insertions, 4 deletions
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index efd87f7cc0..828ec6d381 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -805,15 +805,13 @@ bool CheckDeclaration::visit(ObjCPropertyDeclarationAST *ast)
bool CheckDeclaration::visit(QtEnumDeclarationAST *ast)
{
- for (NameListAST *iter = ast->enumerator_list; iter; iter = iter->next)
- semantic()->check(iter->value, _scope);
+ checkQEnumsQFlagsNames(ast->enumerator_list, "Q_ENUMS");
return false;
}
bool CheckDeclaration::visit(QtFlagsDeclarationAST *ast)
{
- for (NameListAST *iter = ast->flag_enums_list; iter; iter = iter->next)
- semantic()->check(iter->value, _scope);
+ checkQEnumsQFlagsNames(ast->flag_enums_list, "Q_FLAGS");
return false;
}
@@ -830,3 +828,38 @@ bool CheckDeclaration::visit(QtPropertyDeclarationAST *ast)
}
return false;
}
+
+void CheckDeclaration::checkQEnumsQFlagsNames(NameListAST *nameListAst,
+ const char *declName)
+{
+ for (NameListAST *iter = nameListAst; iter; iter = iter->next) {
+ if (!iter)
+ continue;
+
+ const Name *name = semantic()->check(iter->value, _scope);
+ if (!name)
+ continue;
+
+ if (name->isNameId())
+ continue;
+
+ const QualifiedNameId *qName = name->asQualifiedNameId();
+ if (!qName)
+ translationUnit()->error(iter->firstToken(), "invalid name in %s",
+ declName);
+ else if (qName->isGlobal())
+ translationUnit()->error(iter->firstToken(),
+ "invalid name '%s' in %s",
+ qName->identifier()->chars(), declName);
+ else {
+ for (unsigned i = 0; i < qName->nameCount(); ++i) {
+ const Name *namePart = qName->nameAt(i);
+ if (!namePart || !namePart->isNameId()) {
+ translationUnit()->error(iter->firstToken(),
+ "invalid name '%s' in %s",
+ qName->identifier()->chars(), declName);
+ }
+ }
+ }
+ }
+}