diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-03-16 16:38:02 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-03-17 10:30:17 +0100 |
commit | 61132f260c029c868e1971771424c62f36cef638 (patch) | |
tree | a59169e2f032b9c9436ae1b75d5410becbace007 /src/shared/cplusplus/CheckDeclaration.cpp | |
parent | fd81a276ca5b400d33f8f9749d9fca04a78debb3 (diff) | |
download | qt-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.cpp | 41 |
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); + } + } + } + } +} |