From e134e249196fdc86eb7a87a109e9772c9fed82a8 Mon Sep 17 00:00:00 2001 From: Wolfgang Beck <wolfgang.beck@nokia.com> Date: Wed, 3 Feb 2010 13:21:08 +1000 Subject: [PATCH] Source update. --- src/plugins/cpptools/cppmodelmanager.cpp | 49 +- src/plugins/cpptools/cppmodelmanager.h | 23 +- src/shared/cplusplus/AST.h | 8 + src/shared/cplusplus/ASTClone.cpp | 61 +++ src/shared/cplusplus/CheckDeclarator.cpp | 2 +- src/shared/cplusplus/Control.cpp | 11 + src/shared/cplusplus/Parser.cpp | 7 +- src/shared/cplusplus/Symbols.cpp | 6 +- tests/auto/icheckbuild/icheckbuild.pro | 4 +- tests/auto/icheckbuild/ichecklib.cpp | 72 ++- tests/auto/icheckbuild/ichecklib.h | 43 +- tests/auto/icheckbuild/ichecklib.pri | 4 +- tests/auto/icheckbuild/ichecklib_global.h | 41 ++ .../{ParseManager.cpp => parsemanager.cpp} | 458 ++++++++++++------ .../{ParseManager.h => parsemanager.h} | 29 +- 15 files changed, 616 insertions(+), 202 deletions(-) rename tests/auto/icheckbuild/{ParseManager.cpp => parsemanager.cpp} (76%) rename tests/auto/icheckbuild/{ParseManager.h => parsemanager.h} (92%) diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 5e691d5efd7..ffd8fdb0790 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -33,30 +33,32 @@ #include <cplusplus/CheckUndefinedSymbols.h> #include "cppmodelmanager.h" -#include "cpptoolsconstants.h" -#include "cpptoolseditorsupport.h" -#include "cppfindreferences.h" +#ifndef ICHECK_BUILD +# include "cpptoolsconstants.h" +# include "cpptoolseditorsupport.h" +# include "cppfindreferences.h" +#endif #include <functional> #include <QtConcurrentRun> -#include <QFutureSynchronizer> -#include <qtconcurrent/runextensions.h> - -#include <texteditor/itexteditor.h> -#include <texteditor/basetexteditor.h> - -#include <projectexplorer/project.h> -#include <projectexplorer/projectexplorer.h> -#include <projectexplorer/projectexplorerconstants.h> -#include <projectexplorer/session.h> - -#include <coreplugin/icore.h> -#include <coreplugin/uniqueidmanager.h> -#include <coreplugin/mimedatabase.h> -#include <coreplugin/editormanager/editormanager.h> -#include <coreplugin/progressmanager/progressmanager.h> - -#include <extensionsystem/pluginmanager.h> +#ifndef ICHECK_BUILD +# include <QFutureSynchronizer> +# include <qtconcurrent/runextensions.h> +# include <texteditor/itexteditor.h> +# include <texteditor/basetexteditor.h> +# include <projectexplorer/project.h> +# include <projectexplorer/projectexplorer.h> +# include <projectexplorer/projectexplorerconstants.h> +# include <projectexplorer/session.h> +# include <coreplugin/icore.h> +# include <coreplugin/uniqueidmanager.h> +# include <coreplugin/mimedatabase.h> +# include <coreplugin/editormanager/editormanager.h> +# include <coreplugin/progressmanager/progressmanager.h> +# include <extensionsystem/pluginmanager.h> +#else +# include <QDir> +#endif #include <utils/qtcassert.h> @@ -199,9 +201,8 @@ void CppPreprocessor::setProjectFiles(const QStringList &files) void CppPreprocessor::setTodo(const QStringList &files) { m_todo = QSet<QString>::fromList(files); } - -namespace { #ifndef ICHECK_BUILD +namespace { class Process: public std::unary_function<Document::Ptr, void> { QPointer<CppModelManager> _modelManager; @@ -256,8 +257,8 @@ public: _modelManager->emitDocumentUpdated(doc); // ### TODO: compress } }; -#endif } // end of anonymous namespace +#endif void CppPreprocessor::run(const QString &fileName) { diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 1ebac420beb..ca9ca683f7f 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -31,21 +31,26 @@ #define CPPMODELMANAGER_H #include <cpptools/cppmodelmanagerinterface.h> -#include <projectexplorer/project.h> +#ifndef ICHECK_BUILD +# include <projectexplorer/project.h> +#endif #include <cplusplus/CppDocument.h> #include <cplusplus/PreprocessorClient.h> -#include <texteditor/basetexteditor.h> +#ifndef ICHECK_BUILD +# include <texteditor/basetexteditor.h> +#endif #include <cplusplus/PreprocessorEnvironment.h> #include <cplusplus/pp-engine.h> #ifdef ICHECK_BUILD -# include "ParseManager.h" +# include "parsemanager.h" +#else +# include <QtCore/QHash> +# include <QtCore/QFutureInterface> +# include <QtCore/QFutureSynchronizer> +# include <QtCore/QMutex> +# include <QtCore/QTimer> +# include <QtGui/QTextEdit> // for QTextEdit::ExtraSelection #endif -#include <QtCore/QHash> -#include <QtCore/QFutureInterface> -#include <QtCore/QFutureSynchronizer> -#include <QtCore/QMutex> -#include <QtCore/QTimer> -#include <QtGui/QTextEdit> // for QTextEdit::ExtraSelection namespace Core { class ICore; diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h index 4d20094e9c3..dcdeeafff16 100644 --- a/src/shared/cplusplus/AST.h +++ b/src/shared/cplusplus/AST.h @@ -586,6 +586,8 @@ public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; + virtual QPropertyDeclarationAST *clone(MemoryPool *pool) const; + protected: virtual void accept0(ASTVisitor *visitor); virtual bool match0(AST *, ASTMatcher *); @@ -606,6 +608,8 @@ public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; + virtual QEnumDeclarationAST *clone(MemoryPool *pool) const; + protected: virtual void accept0(ASTVisitor *visitor); virtual bool match0(AST *, ASTMatcher *); @@ -626,6 +630,8 @@ public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; + virtual QFlagsDeclarationAST *clone(MemoryPool *pool) const; + protected: virtual void accept0(ASTVisitor *visitor); virtual bool match0(AST *, ASTMatcher *); @@ -647,6 +653,8 @@ public: virtual unsigned firstToken() const; virtual unsigned lastToken() const; + virtual QDeclareFlagsDeclarationAST *clone(MemoryPool *pool) const; + protected: virtual void accept0(ASTVisitor *visitor); virtual bool match0(AST *, ASTMatcher *); diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp index c8ab87895a0..9dc85192a11 100644 --- a/src/shared/cplusplus/ASTClone.cpp +++ b/src/shared/cplusplus/ASTClone.cpp @@ -138,6 +138,67 @@ AccessDeclarationAST *AccessDeclarationAST::clone(MemoryPool *pool) const return ast; } +#ifdef ICHECK_BUILD +QPropertyDeclarationAST *QPropertyDeclarationAST::clone(MemoryPool *pool) const +{ + QPropertyDeclarationAST *ast = new (pool) QPropertyDeclarationAST; + ast->property_specifier_token = property_specifier_token; + ast->lparen_token = lparen_token; + ast->type_token = type_token; + ast->type_name_token = type_name_token; + ast->read_token = read_token; + ast->read_function_token = read_function_token; + ast->write_token = write_token; + ast->write_function_token = write_function_token; + ast->reset_token = reset_token; + ast->reset_function_token = reset_function_token; + ast->notify_token = notify_token; + ast->notify_function_token = notify_function_token; + ast->rparen_token = rparen_token; + return ast; +} + +QEnumDeclarationAST *QEnumDeclarationAST::clone(MemoryPool *pool) const +{ + QEnumDeclarationAST *ast = new (pool)QEnumDeclarationAST; + ast->enum_specifier_token = enum_specifier_token; + ast->lparen_token = lparen_token; + ast->rparen_token = rparen_token; + EnumeratorListAST *enumerator_list; + for (EnumeratorListAST *iter = enumerator_list, **ast_iter = &ast->enumerator_list; + iter; iter = iter->next, ast_iter = &(*ast_iter)->next) + *ast_iter = new (pool) EnumeratorListAST((iter->value) ? iter->value->clone(pool) : 0); + + return ast; +} + +QFlagsDeclarationAST *QFlagsDeclarationAST::clone(MemoryPool *pool) const +{ + QFlagsDeclarationAST *ast = new (pool) QFlagsDeclarationAST; + ast->flags_specifier_token = flags_specifier_token; + ast->lparen_token = lparen_token; + ast->rparen_token = rparen_token; + EnumeratorListAST *enumerator_list; + for (EnumeratorListAST *iter = enumerator_list, **ast_iter = &ast->enumerator_list; + iter; iter = iter->next, ast_iter = &(*ast_iter)->next) + *ast_iter = new (pool) EnumeratorListAST((iter->value) ? iter->value->clone(pool) : 0); + + return ast; +} + +QDeclareFlagsDeclarationAST *QDeclareFlagsDeclarationAST::clone(MemoryPool *pool) const +{ + QDeclareFlagsDeclarationAST *ast = new (pool) QDeclareFlagsDeclarationAST; + ast->declareflags_specifier_token = declareflags_specifier_token; + ast->lparen_token = lparen_token; + ast->flag_token = flag_token; + ast->enum_token = enum_token; + ast->rparen_token = rparen_token; + + return ast; +} +#endif + AsmDefinitionAST *AsmDefinitionAST::clone(MemoryPool *pool) const { AsmDefinitionAST *ast = new (pool) AsmDefinitionAST; diff --git a/src/shared/cplusplus/CheckDeclarator.cpp b/src/shared/cplusplus/CheckDeclarator.cpp index afee09023b4..d87b0997903 100644 --- a/src/shared/cplusplus/CheckDeclarator.cpp +++ b/src/shared/cplusplus/CheckDeclarator.cpp @@ -272,7 +272,7 @@ bool CheckDeclarator::visit(ObjCMethodPrototypeAST *ast) if (semantic()->isObjCClassMethod(tokenKind(ast->method_type_token))) method->setStorage(Symbol::Static); - if (ast->selector->asObjCSelectorWithArguments()) { + if (ast->selector && ast->selector->asObjCSelectorWithArguments()) { for (ObjCMessageArgumentDeclarationListAST *it = ast->argument_list; it; it = it->next) { ObjCMessageArgumentDeclarationAST *argDecl = it->value; diff --git a/src/shared/cplusplus/Control.cpp b/src/shared/cplusplus/Control.cpp index bc8cb2f877a..3c719bbf9aa 100644 --- a/src/shared/cplusplus/Control.cpp +++ b/src/shared/cplusplus/Control.cpp @@ -210,6 +210,16 @@ public: } // end of anonymous namespace +#ifdef ICHECK_BUILD +//Symbian compiler has some difficulties to understand the templates. +static void delete_array_entries(std::vector<Symbol *> vt) +{ + std::vector<Symbol *>::iterator it; + for (it = vt.begin(); it != vt.end(); ++it) { + delete *it; + } +} +#else template <typename _Iterator> static void delete_array_entries(_Iterator first, _Iterator last) { @@ -220,6 +230,7 @@ static void delete_array_entries(_Iterator first, _Iterator last) template <typename _Array> static void delete_array_entries(const _Array &a) { delete_array_entries(a.begin(), a.end()); } +#endif class Control::Data { diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 61efa2baa82..573ad6140ee 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -1748,11 +1748,12 @@ bool Parser::parseAccessSpecifier(SpecifierAST *&node) bool Parser::parseAccessDeclaration(DeclarationAST *&node) { DEBUG_THIS_RULE(); - if (LA() == T_PUBLIC || LA() == T_PROTECTED || LA() == T_PRIVATE || LA() == T_Q_SIGNALS) { + if (LA() == T_PUBLIC || LA() == T_PROTECTED || LA() == T_PRIVATE || LA() == T_Q_SIGNALS || LA() == T_Q_SLOTS) { bool isSignals = LA() == T_Q_SIGNALS; + bool isSlots = LA() == T_Q_SLOTS; AccessDeclarationAST *ast = new (_pool) AccessDeclarationAST; ast->access_specifier_token = consumeToken(); - if (! isSignals && LA() == T_Q_SLOTS) + if (! isSignals && (LA() == T_Q_SLOTS || isSlots)) ast->slots_token = consumeToken(); match(T_COLON, &ast->colon_token); node = ast; @@ -1930,6 +1931,7 @@ bool Parser::parseMemberSpecification(DeclarationAST *&node) case T_PUBLIC: case T_PROTECTED: case T_PRIVATE: + case T_Q_SLOTS: return parseAccessDeclaration(node); #ifdef ICHECK_BUILD @@ -2426,6 +2428,7 @@ bool Parser::parseStatement(StatementAST *&node) return parseExpressionOrDeclarationStatement(node); } // switch + return false; //Avoid compiler warning } bool Parser::parseBreakStatement(StatementAST *&node) diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp index 8b1a15e79db..ca20980d999 100644 --- a/src/shared/cplusplus/Symbols.cpp +++ b/src/shared/cplusplus/Symbols.cpp @@ -222,7 +222,9 @@ bool Function::isEqualTo(const Type *other) const else if (isVolatile() != o->isVolatile()) return false; #ifdef ICHECK_BUILD - else if (isInvokable() != o->isInvokable()) + else if (isInvokable() != o->isInvokable()) + return false; + else if (isSignal() != o->isSignal()) return false; #endif @@ -258,6 +260,8 @@ bool Function::isEqualTo(const Function* fct, bool ignoreName/* = false*/) const return false; else if (isInvokable() != fct->isInvokable()) return false; + else if (isSignal() != fct->isSignal()) + return false; if (_arguments->symbolCount() != fct->_arguments->symbolCount()) return false; diff --git a/tests/auto/icheckbuild/icheckbuild.pro b/tests/auto/icheckbuild/icheckbuild.pro index 532b63a19e8..28160f2ece4 100644 --- a/tests/auto/icheckbuild/icheckbuild.pro +++ b/tests/auto/icheckbuild/icheckbuild.pro @@ -20,6 +20,6 @@ TARGET=tst_$$TARGET include(./ichecklib.pri) HEADERS += ./ichecklib.h \ ./ichecklib_global.h \ - ./ParseManager.h + ./parsemanager.h SOURCES += ./ichecklib.cpp \ - ./ParseManager.cpp + ./parsemanager.cpp diff --git a/tests/auto/icheckbuild/ichecklib.cpp b/tests/auto/icheckbuild/ichecklib.cpp index 9a1a5bfcafb..d986479a4aa 100644 --- a/tests/auto/icheckbuild/ichecklib.cpp +++ b/tests/auto/icheckbuild/ichecklib.cpp @@ -1,5 +1,46 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #include "ichecklib.h" -#include "ParseManager.h" +#include "parsemanager.h" #include <QtCore/QCoreApplication> #include <QString> #include <QStringList> @@ -17,7 +58,32 @@ QStringList getQTIncludePath() foreach(QString item, processevironment){ if(item.indexOf("QTDIR=") == 0){ QString qtpath = item.remove("QTDIR="); + ret << qtpath + "/include"; + ret << qtpath + "/include/ActiveQt"; + ret << qtpath + "/include/phonon"; + ret << qtpath + "/include/phonon_compat"; + ret << qtpath + "/include/Qt"; + ret << qtpath + "/include/Qt3Support"; + ret << qtpath + "/include/QtAssistant"; ret << qtpath + "/include/QtCore"; + ret << qtpath + "/include/QtDBus"; + ret << qtpath + "/include/QtDeclarative"; + ret << qtpath + "/include/QtDesigner"; + ret << qtpath + "/include/QtGui"; + ret << qtpath + "/include/QtHelp"; + ret << qtpath + "/include/QtMultimedia"; + ret << qtpath + "/include/QtNetwork"; + ret << qtpath + "/include/QtOpenGL"; + ret << qtpath + "/include/QtOpenVG"; + ret << qtpath + "/include/QtScript"; + ret << qtpath + "/include/QtScriptTools"; + ret << qtpath + "/include/QtSql"; + ret << qtpath + "/include/QtSvg"; + ret << qtpath + "/include/QtTest"; + ret << qtpath + "/include/QtUiTools"; + ret << qtpath + "/include/QtWebKit"; + ret << qtpath + "/include/QtXml"; + ret << qtpath + "/include/QtXmlPatterns"; break; } } @@ -39,11 +105,11 @@ void ICheckLib::ParseHeader(const QStringList& includePath, const QStringList& f pParseManager->parse(filelist); } -bool ICheckLib::check(const ICheckLib& ichecklib /*ICheckLib from interface header*/) +bool ICheckLib::check(const ICheckLib& ichecklib /*ICheckLib from interface header*/, QString outputfile) { if(pParseManager){ CPlusPlus::ParseManager* cpparsemanager = ichecklib.pParseManager; - return pParseManager->checkAllMetadatas(cpparsemanager); + return pParseManager->checkAllMetadatas(cpparsemanager, outputfile); } return false; } diff --git a/tests/auto/icheckbuild/ichecklib.h b/tests/auto/icheckbuild/ichecklib.h index ed433fdc57b..c6faf684b8d 100644 --- a/tests/auto/icheckbuild/ichecklib.h +++ b/tests/auto/icheckbuild/ichecklib.h @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef ICHECKLIB_H #define ICHECKLIB_H @@ -11,7 +52,7 @@ class ICHECKLIBSHARED_EXPORT ICheckLib { public: ICheckLib(); void ParseHeader(const QStringList& includePath, const QStringList& filelist); - bool check(const ICheckLib& ichecklib /*ICheckLib from interface header*/); + bool check(const ICheckLib& ichecklib /*ICheckLib from interface header*/, QString outputfile); QStringList getErrorMsg(); private: CPlusPlus::ParseManager* pParseManager; diff --git a/tests/auto/icheckbuild/ichecklib.pri b/tests/auto/icheckbuild/ichecklib.pri index e20a2e04f3d..35c15d891f6 100644 --- a/tests/auto/icheckbuild/ichecklib.pri +++ b/tests/auto/icheckbuild/ichecklib.pri @@ -56,11 +56,13 @@ HEADERS += $$REL_PATH_TO_SRC/shared/cplusplus/Array.h \ $$REL_PATH_TO_SRC/shared/cplusplus/Type.h \ $$REL_PATH_TO_SRC/shared/cplusplus/TypeMatcher.h \ $$REL_PATH_TO_SRC/libs/cplusplus/TypePrettyPrinter.h \ - $$REL_PATH_TO_SRC/shared/cplusplus/TypeVisitor.h + $$REL_PATH_TO_SRC/shared/cplusplus/TypeVisitor.h \ + $$REL_PATH_TO_SRC/plugins/cpptools/cpptools_global.h SOURCES += $$REL_PATH_TO_SRC/shared/cplusplus/Array.cpp \ $$REL_PATH_TO_SRC/shared/cplusplus/AST.cpp \ $$REL_PATH_TO_SRC/shared/cplusplus/ASTMatch0.cpp \ $$REL_PATH_TO_SRC/shared/cplusplus/ASTMatcher.cpp \ + $$REL_PATH_TO_SRC/shared/cplusplus/ASTClone.cpp \ $$REL_PATH_TO_SRC/shared/cplusplus/ASTVisit.cpp \ $$REL_PATH_TO_SRC/shared/cplusplus/ASTVisitor.cpp \ $$REL_PATH_TO_SRC/shared/cplusplus/CheckDeclaration.cpp \ diff --git a/tests/auto/icheckbuild/ichecklib_global.h b/tests/auto/icheckbuild/ichecklib_global.h index cf2bbdc7f37..bf4238c04f2 100644 --- a/tests/auto/icheckbuild/ichecklib_global.h +++ b/tests/auto/icheckbuild/ichecklib_global.h @@ -1,3 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the Qt Mobility Components. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + #ifndef ICHECKLIB_GLOBAL_H #define ICHECKLIB_GLOBAL_H diff --git a/tests/auto/icheckbuild/ParseManager.cpp b/tests/auto/icheckbuild/parsemanager.cpp similarity index 76% rename from tests/auto/icheckbuild/ParseManager.cpp rename to tests/auto/icheckbuild/parsemanager.cpp index 8c9a3d76334..3e021c531c0 100644 --- a/tests/auto/icheckbuild/ParseManager.cpp +++ b/tests/auto/icheckbuild/parsemanager.cpp @@ -27,7 +27,7 @@ ** **************************************************************************/ -#include "ParseManager.h" +#include "parsemanager.h" #include "cplusplus/CppDocument.h" #include "Control.h" #include "TranslationUnit.h" @@ -36,6 +36,7 @@ #include <QDebug> #include "Name.h" #include "cpptools/cppmodelmanager.h" +#include <QTextStream> using namespace CppTools; using namespace CppTools::Internal; @@ -160,6 +161,11 @@ ParseManager::~ParseManager() { if(pCppPreprocessor) delete pCppPreprocessor; + if(::m_resultFile){ + ::m_resultFile->close(); + delete ::m_resultFile; + ::m_resultFile = 0; + } } /************************************** @@ -236,12 +242,13 @@ void ParseManager::parse(CppTools::Internal::CppPreprocessor *preproc, //==> list[0] = {Cl1, Cl11, Cl12} // list[1] = {Cl2, Cl21, Cl22} -QList<CLASSTREE*> ParseManager::CreateClassLists() +QList<CLASSTREE*> ParseManager::CreateClassLists(bool isInterfaceHeader) { QList<CLASSTREE*>ret; QList<CLASSLISTITEM*> classlist; QList<CLASSLISTITEM*> allclasslist; + Trace("Following classes scaned for header file: " + m_strHeaderFile); //Iteration over all parsed documents if(getPreProcessor()){ for (Snapshot::const_iterator it = getPreProcessor()->snapshot.begin() @@ -270,12 +277,14 @@ QList<CLASSTREE*> ParseManager::CreateClassLists() item->classspec = pclassspec; item->trlUnit = trlUnit; allclasslist.push_back(item); + QString classname = item->trlUnit->spell(item->classspec->name->firstToken()); + Trace("- " + classname + " class scaned"); + //We found a class that is defined in the header file that needs to be checked if(fileinf.fileName().toLower() == fileinf1.fileName().toLower()){ CLASSTREE* cltree = new CLASSTREE(); cltree->highestlevelclass = item; cltree->classlist.push_back(item); - //now add all baseclasses from this class ret.push_back(cltree); } } @@ -288,45 +297,70 @@ QList<CLASSTREE*> ParseManager::CreateClassLists() } } //after we search for the classes we need to search for the baseclasses + Trace("Following classes found in Header file: " + m_strHeaderFile); foreach(CLASSTREE *cltree, ret){ + QString classname = cltree->highestlevelclass->trlUnit->spell(cltree->highestlevelclass->classspec->name->firstToken()); + Trace("- " + classname + " class found"); QList<CLASSLISTITEM*> baseclasslist; - getBaseClasses(cltree->highestlevelclass, baseclasslist, allclasslist); + getBaseClasses(cltree->highestlevelclass, baseclasslist, allclasslist, 0, isInterfaceHeader); cltree->classlist.append(baseclasslist); } return ret; } /******************************************** -Gets all the baseclass from a class and +Gets all the baseclass from a class and add those base classes into the baseclasslist ********************************************/ -void ParseManager::getBaseClasses(const CLASSLISTITEM* pclass, QList<CLASSLISTITEM*> &baseclasslist, const QList<CLASSLISTITEM*> &allclasslist) +void ParseManager::getBaseClasses(const CLASSLISTITEM* pclass + , QList<CLASSLISTITEM*> &baseclasslist + , const QList<CLASSLISTITEM*> &allclasslist + , int level + , bool isInterfaceHeader) { //iteration over the base_clause_list of the current class + QString levelmarker = " "; + for(int i = 0; i < level; i++) + levelmarker += " "; + levelmarker += "|- "; QList<CLASSLISTITEM*>child; + for(BaseSpecifierListAST *pBaseSpecList = pclass->classspec->base_clause_list; pBaseSpecList; pBaseSpecList = pBaseSpecList->next) { BaseSpecifierAST *pBaseSpec = pBaseSpecList->value; + bool found = false; foreach(CLASSLISTITEM* pclspec, allclasslist) { - if(pclspec->classspec->symbol->name()->isEqualTo(pBaseSpec->symbol->name())) + if(pclspec->classspec->symbol->name() + && pBaseSpec->symbol->name() + && pclspec->classspec->symbol->name()->isEqualTo(pBaseSpec->symbol->name())) { child.push_back(pclspec); baseclasslist.push_back(pclspec); + QString classname = pclspec->trlUnit->spell(pclspec->classspec->name->firstToken()); + Trace(levelmarker + classname + " class found"); + found = true; break; } } + if(!found && pBaseSpec->name){ + QString classname = pclass->trlUnit->spell(pBaseSpec->name->firstToken()); + if(isInterfaceHeader) + Trace(levelmarker + classname + " class not found! Interface classes should not be inherited from Qt Objects!"); + else + Trace(levelmarker + classname + " class not found!"); + } } //call the function recursive because all the basclasses can have other base classes foreach(CLASSLISTITEM* pchclass, child){ - getBaseClasses(pchclass, baseclasslist, allclasslist); + getBaseClasses(pchclass, baseclasslist, allclasslist, ++level, isInterfaceHeader); } } /************************************************** This function finds and creates all Elements wich are significant for MetaDatas. -Those element will be added in the aparameter +Those element will be added in the aparameter lists. **************************************************/ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist @@ -339,6 +373,9 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist , const CLASSLISTITEM* highestlevelclass) { foreach(CLASSLISTITEM* classitem, classitems){ + QString classname = ""; + if(classitem->classspec->name) + classname = classitem->trlUnit->spell(classitem->classspec->name->firstToken()); for (DeclarationListAST *pmemberlist = classitem->classspec->member_specifier_list; pmemberlist; pmemberlist = pmemberlist->next) { /********** Functions @@ -348,10 +385,11 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist FUNCTIONITEM* item = new FUNCTIONITEM(); item->trlUnit = classitem->trlUnit; item->function = pfctdef->symbol; -// item->fctast = pfctdef; item->classAst = classitem->classspec; item->highestlevelclass = highestlevelclass; functionlist.push_back(item); + if(isMetaObjFunction(item)) + Trace(" - " + getTraceFuntionString(item, classname) + " found"); } SimpleDeclarationAST *pdecl = pmemberlist->value->asSimpleDeclaration(); @@ -363,10 +401,11 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist FUNCTIONITEM* item = new FUNCTIONITEM(); item->trlUnit = classitem->trlUnit; item->function = pfct; -// item->ast = pdecl; item->classAst = classitem->classspec; item->highestlevelclass = highestlevelclass; functionlist.push_back(item); + if(isMetaObjFunction(item)) + Trace(" - " + getTraceFuntionString(item, classname) + " found"); } } /****** @@ -399,6 +438,10 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist item->resetdefined = (ppdecl->reset_token > 0); item->notifydefined = (ppdecl->notify_token > 0); propertylist.push_back(item); + if(item->ast->type_name_token > 0){ + QString propertyname = item->trlUnit->spell(item->ast->type_name_token); + Trace(" - Q_PROPERTY: " + classname + "::" + propertyname + " found"); + } } else{ /********** @@ -406,11 +449,18 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist **********/ QEnumDeclarationAST *pqenum = pmemberlist->value->asQEnumDeclarationAST(); if(pqenum){ - QENUMITEM* item = new QENUMITEM(); - item->ast = pqenum; - item->highestlevelclass = highestlevelclass; - item->trlUnit = classitem->trlUnit; - qenumlist.push_back(item); + if(pqenum->enumerator_list){ + for (EnumeratorListAST *plist = pqenum->enumerator_list; plist; plist = plist->next) { + QENUMITEM* item = new QENUMITEM(); + item->ast = plist->value; + item->highestlevelclass = highestlevelclass; + item->trlUnit = classitem->trlUnit; + qenumlist.push_back(item); + QString enumname = item->trlUnit->spell(item->ast->firstToken()); + Trace(" - Q_ENUM: " + classname + "::" + enumname + " found"); + } + } + } else{ /********** @@ -418,11 +468,17 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist **********/ QFlagsDeclarationAST *pqflags = pmemberlist->value->asQFlagsDeclarationAST(); if(pqflags){ - QFLAGITEM* item = new QFLAGITEM(); - item->ast = pqflags; - item->highestlevelclass = highestlevelclass; - item->trlUnit = classitem->trlUnit; - qflaglist.push_back(item); + if(pqflags->enumerator_list){ + for (EnumeratorListAST *plist = pqflags->enumerator_list; plist; plist = plist->next) { + QFLAGITEM* item = new QFLAGITEM(); + item->ast = plist->value; + item->highestlevelclass = highestlevelclass; + item->trlUnit = classitem->trlUnit; + qflaglist.push_back(item); + QString enumname = item->trlUnit->spell(plist->firstToken()); + Trace(" - Q_FLAGS: " + classname + "::" + enumname + " found"); + } + } } else { /**************** @@ -445,23 +501,34 @@ void ParseManager::getElements(QList<FUNCTIONITEM*> &functionlist } /********************************************* -Function that starts the comare between the +Function that starts the comare between the parser result and their metadata content. *********************************************/ -bool ParseManager::checkAllMetadatas(ParseManager* pInterfaceParserManager) +bool ParseManager::checkAllMetadatas(ParseManager* pInterfaceParserManager, QString resultfile) { bool ret = true; + + //Create output file + if(resultfile != "" && ::m_resultFile == 0){ + ::m_resultFile = new QFile(resultfile); + if (!::m_resultFile->open(QFile::WriteOnly | QFile::Truncate)) { + delete ::m_resultFile; + ::m_resultFile = 0; + } + } /************************************************ Get all elements from the interface header file ************************************************/ - QList<CLASSTREE*> ilookuplist = pInterfaceParserManager->CreateClassLists(); + Trace("### Get all elements from the interface header file ###"); + QList<CLASSTREE*> ilookuplist = pInterfaceParserManager->CreateClassLists(true); QList<QList<FUNCTIONITEM*> > ifunctionslookuplist; QList<QList<PROPERTYITEM*> > ipropertieslookuplist; QList<QList<QENUMITEM*> > iqenumlookuplist; QList<QList<ENUMITEM*> > ienumlookuplist; QList<QList<QFLAGITEM*> > iqflaglookuplist; QList<QList<QDECLAREFLAGSITEM*> > iqdeclareflaglookuplist; + Trace("Following MetaData found:"); foreach(CLASSTREE* iclasstree, ilookuplist){ QList<FUNCTIONITEM*>functionlist; QList<PROPERTYITEM*>propertylist; @@ -494,13 +561,16 @@ bool ParseManager::checkAllMetadatas(ParseManager* pInterfaceParserManager) /************************************************ Get all elements from the compare header file ************************************************/ - QList<CLASSTREE*> lookuplist = CreateClassLists(); + Trace("\n"); + Trace("### Get all elements from the compare header file ###"); + QList<CLASSTREE*> lookuplist = CreateClassLists(false); QList<QList<FUNCTIONITEM*> > functionslookuplist; QList<QList<PROPERTYITEM*> > propertieslookuplist; QList<QList<QENUMITEM*> > qenumlookuplist; QList<QList<ENUMITEM*> > enumlookuplist; QList<QList<QFLAGITEM*> > qflaglookuplist; QList<QList<QDECLAREFLAGSITEM*> > qdeclareflaglookuplist; + Trace("Following MetaData found:"); foreach(CLASSTREE* classtree, lookuplist){ QList<FUNCTIONITEM*>functionlist; QList<PROPERTYITEM*>propertylist; @@ -530,50 +600,85 @@ bool ParseManager::checkAllMetadatas(ParseManager* pInterfaceParserManager) qdeclareflaglookuplist.append(qdeclareflag); } + Trace("\n"); + Trace("### Result: ###"); /****************************** Check for function ******************************/ + Trace("Compare all interface MetaData functions:"); QList<FUNCTIONITEM*> missingifcts = checkMetadataFunctions(functionslookuplist, ifunctionslookuplist); if(missingifcts.size() > 0){ foreach(FUNCTIONITEM* ifct, missingifcts){ - m_errormsgs.push_back(getErrorMessage(ifct)); + m_errormsgs.append(getErrorMessage(ifct)); } ret = false; + Trace("- Failed!"); + } + else{ + Trace("- OK"); } /****************************** Check for properies ******************************/ + Trace("Compare all interface MetaData properties:"); QList<PROPERTYITEM*> missingippts = checkMetadataProperties(propertieslookuplist, functionslookuplist, ipropertieslookuplist, ifunctionslookuplist); if(missingippts.size() > 0){ foreach(PROPERTYITEM* ippt, missingippts){ - m_errormsgs.push_back(getErrorMessage(ippt)); + m_errormsgs.append(getErrorMessage(ippt)); } ret = false; + Trace("- Failed!"); + } + else{ + Trace("- OK"); } /****************************** Check for enums ******************************/ + Trace("Compare all interface MetaData enums:"); QList<QENUMITEM*> missingiqenums = checkMetadataEnums(qenumlookuplist, enumlookuplist, iqenumlookuplist, ienumlookuplist); if(missingiqenums.size() > 0){ foreach(QENUMITEM* ienum, missingiqenums){ - m_errormsgs.push_back(getErrorMessage(ienum)); + m_errormsgs.append(getErrorMessage(ienum)); } ret = false; + Trace("- Failed!"); + } + else{ + Trace("- OK"); } /****************************** Check for flags ******************************/ + Trace("Compare all interface MetaData flags:"); QList<QFLAGITEM*> missingiqflags = checkMetadataFlags(qflaglookuplist, qdeclareflaglookuplist, enumlookuplist , iqflaglookuplist, iqdeclareflaglookuplist, ienumlookuplist); if(missingiqflags.size() > 0){ foreach(QFLAGITEM* iflags, missingiqflags){ - m_errormsgs.push_back(getErrorMessage(iflags)); + m_errormsgs.append(getErrorMessage(iflags)); } ret = false; + Trace("- Failed!"); } + else{ + Trace("- OK"); + } + + /****************************** + Add summary + ******************************/ + Trace("\n"); + Trace("### summary ###"); + if(m_errormsgs.size() > 0){ + Trace("- Folowing interface items are missing:"); + foreach(QString msg, m_errormsgs) + Trace(" - " + msg); + } + else + Trace("Interface is full defined."); //now delet all Classitems foreach(CLASSTREE* l, ilookuplist){ @@ -644,8 +749,10 @@ QList<FUNCTIONITEM*> ParseManager::checkMetadataFunctions(const QList<QList<FUNC if(classfctlist.count() > 0){ foreach(QList<FUNCTIONITEM*>functionlist, classfctlist){ QList<FUNCTIONITEM*> tmpl = containsAllMetadataFunction(functionlist, ifunctionlist); - if(tmpl.size() == 0) + if(tmpl.size() == 0){ ifcts.clear(); + break; + } else ifcts.append(tmpl); } @@ -661,7 +768,7 @@ QList<FUNCTIONITEM*> ParseManager::checkMetadataFunctions(const QList<QList<FUNC } /********************************************* -Helper function to check if a function will +Helper function to check if a function will occure in the MetaData. *********************************************/ bool ParseManager::isMetaObjFunction(FUNCTIONITEM* fct) @@ -674,7 +781,7 @@ bool ParseManager::isMetaObjFunction(FUNCTIONITEM* fct) } /**************************************************** -Check if all function from iclassfctlist are defined +Check if all function from iclassfctlist are defined in the classfctlist as well. It will return all the function they are missing. ****************************************************/ @@ -686,29 +793,28 @@ QList<FUNCTIONITEM*> ParseManager::containsAllMetadataFunction(const QList<FUNCT bool found = false; QStringList missingimplinclasses; ClassSpecifierAST* clspec = 0; + QString classname = ""; foreach(FUNCTIONITEM* fct, classfctlist){ if(clspec != fct->highestlevelclass->classspec){ clspec = fct->highestlevelclass->classspec; //get the classname - QString classname = ""; unsigned int firsttoken = clspec->name->firstToken(); classname += fct->trlUnit->spell(firsttoken); if(missingimplinclasses.indexOf(classname) < 0) missingimplinclasses.push_back(classname); } - //wb - //qDebug() << "---------------------------------"; - //qDebug() << getErrorMessage(ifct); - //qDebug() << getErrorMessage(fct); if(fct->isEqualTo(ifct, false)){ found = true; missingimplinclasses.clear(); + Trace("- " + getTraceFuntionString(fct, classname) + " implemented"); break; } } if(!found){ ifct->classWichIsNotFound.append(missingimplinclasses); ret.push_back(ifct); + QString classname = ifct->trlUnit->spell(ifct->highestlevelclass->classspec->name->firstToken()); + Trace("- " + getTraceFuntionString(ifct, classname) + " not implemented!"); } } } @@ -716,20 +822,19 @@ QList<FUNCTIONITEM*> ParseManager::containsAllMetadataFunction(const QList<FUNCT } /************************************ -Function that gives back an error +Function that gives back an error string for a MetaData function mismatch. ************************************/ -QString ParseManager::getErrorMessage(FUNCTIONITEM* fct) +QStringList ParseManager::getErrorMessage(FUNCTIONITEM* fct) { - QString ret = ""; - QTextStream out(&ret); + QStringList ret; QString fctstring = ""; QString fcttype = ""; foreach(QString classname, fct->classWichIsNotFound){ - if(ret.size() > 0) - out << endl; + QString tmp; + QTextStream out(&tmp); fcttype = ""; fctstring = classname; @@ -773,6 +878,7 @@ QString ParseManager::getErrorMessage(FUNCTIONITEM* fct) fcttype += "Invokable "; } out << fcttype << fctstring; + ret << tmp; } return ret; } @@ -788,7 +894,7 @@ QList<PROPERTYITEM*> ParseManager::checkMetadataProperties(const QList<QList<PRO , const QList<QList<PROPERTYITEM*> > &iclassproplist , const QList<QList<FUNCTIONITEM*> > &iclassfctlist) { - QList<PROPERTYITEM*> missingifcts; + QList<PROPERTYITEM*> missingiprops; //assign the property functions foreach(QList<PROPERTYITEM*>proplist, classproplist){ foreach(PROPERTYITEM* prop, proplist){ @@ -817,13 +923,16 @@ QList<PROPERTYITEM*> ParseManager::checkMetadataProperties(const QList<QList<PRO } } else { - foreach(PROPERTYITEM *pprop, ipropertylist) + foreach(PROPERTYITEM *pprop, ipropertylist){ pprop->classWichIsNotFound << "<all classes>"; + QString name = pprop->trlUnit->spell(pprop->ast->type_name_token); + Trace("- Property: <all classes>::" + name + " not found!"); + } ippts.append(ipropertylist); } - missingifcts.append(ippts); + missingiprops.append(ippts); } - return missingifcts; + return missingiprops; } /************************************** @@ -864,16 +973,6 @@ void ParseManager::assignPropertyFunctions(PROPERTYITEM* prop, const QList<QList prop->foundalldefinedfct = false; foreach(QList<FUNCTIONITEM*> fctlist, fctlookuplist){ foreach(FUNCTIONITEM* pfct, fctlist){ -/* - long start = pfct->ast->firstToken(); - long stop = pfct->ast->lastToken(); - QString val; - for(long i = start; i < stop; i++){ - val += pfct->trlUnit->spell(i); - val += " "; - } - qDebug() << val; -*/ QString fctname = pfct->trlUnit->spell(pfct->function->sourceLocation()); //check the function type against the property type QString fcttype =pfct->trlUnit->spell(pfct->function->sourceLocation() - 1); @@ -921,11 +1020,11 @@ QList<PROPERTYITEM*> ParseManager::containsAllPropertyFunction(const QList<PROPE bool found = false; QStringList missingimplinclasses; ClassSpecifierAST* clspec = 0; + QString classname = ""; foreach(PROPERTYITEM* propt, classproplist){ if(clspec != propt->highestlevelclass->classspec){ clspec = propt->highestlevelclass->classspec; //get the classname - QString classname = ""; unsigned int firsttoken = clspec->name->firstToken(); classname += propt->trlUnit->spell(firsttoken); if(missingimplinclasses.indexOf(classname) < 0) @@ -934,15 +1033,21 @@ QList<PROPERTYITEM*> ParseManager::containsAllPropertyFunction(const QList<PROPE if(propt->isEqualTo(ipropt)){ found = true; missingimplinclasses.clear(); + Trace("- Property: " + classname + "::" + propt->trlUnit->spell(propt->ast->type_name_token) + " found"); break; } } if(!found){ ipropt->classWichIsNotFound.append(missingimplinclasses); ret.push_back(ipropt); + QString classname = ipropt->trlUnit->spell(ipropt->highestlevelclass->classspec->name->firstToken()); + Trace("- Property: " + classname + "::" + ipropt->trlUnit->spell(ipropt->ast->type_name_token) + " not found!"); } } else{ + QString classname = ipropt->trlUnit->spell(ipropt->highestlevelclass->classspec->name->firstToken()); + QString proptype = ipropt->trlUnit->spell(ipropt->ast->type_name_token); + Trace("- Property: " + classname + "::" + proptype + " functions are missing!"); ret.push_back(ipropt); } } @@ -950,18 +1055,19 @@ QList<PROPERTYITEM*> ParseManager::containsAllPropertyFunction(const QList<PROPE } /************************************ -Function that gives back an error +Function that gives back an error string for a Q_PROPERTY mismatch. ************************************/ -QString ParseManager::getErrorMessage(PROPERTYITEM* ppt) +QStringList ParseManager::getErrorMessage(PROPERTYITEM* ppt) { - QString ret = ""; - QTextStream out(&ret); + QStringList ret; QString pptstring = ""; - QString ppttype = ""; if(!ppt->foundalldefinedfct) { + QString tmp; + QTextStream out(&tmp); + unsigned int firsttoken = ppt->highestlevelclass->classspec->name->firstToken(); unsigned int lasttoken = ppt->highestlevelclass->classspec->name->lastToken(); for(unsigned int i = firsttoken; i < lasttoken; i++){ @@ -983,10 +1089,11 @@ QString ParseManager::getErrorMessage(PROPERTYITEM* ppt) if(ppt->notifydefined && !ppt->notifyFct) out << "NOTIFY "; out << "functions missing." << endl; + ret << tmp; } for(int i = 0; i < ppt->classWichIsNotFound.size(); i++){ - if(ret.size() > 0) - out << endl; + QString tmp; + QTextStream out(&tmp); pptstring = ppt->classWichIsNotFound[i]; pptstring += "::"; @@ -998,7 +1105,8 @@ QString ParseManager::getErrorMessage(PROPERTYITEM* ppt) pptstring += " "; } - out << ppttype << pptstring; + out << pptstring; + ret << tmp; } return ret; } @@ -1044,8 +1152,11 @@ QList<QENUMITEM*> ParseManager::checkMetadataEnums(const QList<QList<QENUMITEM*> } } else { - foreach(QENUMITEM *qenum, iqenumlist) + foreach(QENUMITEM *qenum, iqenumlist){ qenum->classWichIsNotFound << "<all classes>"; + QString name= qenum->trlUnit->spell(qenum->ast->firstToken()); + Trace("- Enum: <all classes>::" + name + " not found!"); + } iqenums.append(iqenumlist); } missingiqenums.append(iqenums); @@ -1100,32 +1211,30 @@ between Q_ENUMS and enums. void ParseManager::assignEnumValues(QENUMITEM* qenum, const QList<QList<ENUMITEM*> > &enumlookuplist) { QString enumname; - for (EnumeratorListAST *plist = qenum->ast->enumerator_list; plist; plist = plist->next) { - EnumeratorAST *penum = plist->value->asEnumerator(); - if(penum){ - //get the name of the enum definition - enumname = qenum->trlUnit->spell(penum->firstToken()); - //iterate over all enums and find the one with the same name like enumname - bool found = false; - foreach (QList<ENUMITEM*> penumlist, enumlookuplist) { - foreach(ENUMITEM *penum, penumlist){ - EnumSpecifierAST *penumsec = penum->ast; - QString enumname1 = penum->trlUnit->spell(penumsec->name->firstToken()); - if(enumname == enumname1){ - qenum->values << getEnumValueStringList(penum); - found = true; - break; - } + EnumeratorAST *penum = qenum->ast->asEnumerator(); + if(penum){ + //get the name of the enum definition + enumname = qenum->trlUnit->spell(penum->firstToken()); + //iterate over all enums and find the one with the same name like enumname + bool found = false; + foreach (QList<ENUMITEM*> penumlist, enumlookuplist) { + foreach(ENUMITEM *penum, penumlist){ + EnumSpecifierAST *penumsec = penum->ast; + QString enumname1 = penum->trlUnit->spell(penumsec->name->firstToken()); + if(enumname == enumname1){ + qenum->values << getEnumValueStringList(penum); + found = true; + break; } - if(!found) - qenum->foundallenums = false; } + if(!found) + qenum->foundallenums = false; } } } /*********************************** -Function that checkt if the Q_ENUMS +Function that checkt if the Q_ENUMS are completed defined and if the Enum values are the same. ***********************************/ @@ -1136,11 +1245,11 @@ QList<QENUMITEM*> ParseManager::containsAllEnums(const QList<QENUMITEM*> &classq bool found = false; QStringList missingimplinclasses; ClassSpecifierAST* clspec = 0; + QString classname = ""; foreach(QENUMITEM* qenum, classqenumlist){ if(clspec != qenum->highestlevelclass->classspec){ clspec = qenum->highestlevelclass->classspec; //get the classname - QString classname = ""; unsigned int firsttoken = clspec->name->firstToken(); classname += qenum->trlUnit->spell(firsttoken); if(missingimplinclasses.indexOf(classname) < 0) @@ -1149,53 +1258,60 @@ QList<QENUMITEM*> ParseManager::containsAllEnums(const QList<QENUMITEM*> &classq if(qenum->isEqualTo(iqenum)){ found = true; missingimplinclasses.clear(); + Trace("- Enum: " + classname + "::" + qenum->trlUnit->spell(qenum->ast->firstToken()) + " found"); break; } } if(!found){ iqenum->classWichIsNotFound.append(missingimplinclasses); ret.push_back(iqenum); + QString classname = iqenum->trlUnit->spell(iqenum->highestlevelclass->classspec->name->firstToken()); + Trace("- Enum: " + classname + "::" + iqenum->trlUnit->spell(iqenum->ast->firstToken()) + " not found!"); } } return ret; } /************************************ -Function that gives back an error +Function that gives back an error string for a Q_ENUMS mismatch. ************************************/ -QString ParseManager::getErrorMessage(QENUMITEM* qenum) +QStringList ParseManager::getErrorMessage(QENUMITEM* qenum) { - QString ret = ""; - QTextStream out(&ret); + QStringList ret; if(!qenum->foundallenums) { + QString tmp; + QTextStream out(&tmp); + unsigned int firsttoken = qenum->highestlevelclass->classspec->name->firstToken(); unsigned int lasttoken = qenum->highestlevelclass->classspec->name->lastToken(); for(unsigned int i = firsttoken; i < lasttoken; i++){ out << qenum->trlUnit->spell(i); } - out << "::"; + out << "::Q_ENUMS ( "; firsttoken = qenum->ast->firstToken(); lasttoken = qenum->ast->lastToken(); - for(unsigned int i = firsttoken; i <= lasttoken; i++){ + for(unsigned int i = firsttoken; i < lasttoken; i++) out << qenum->trlUnit->spell(i) << " "; - } + out << ")"; out << endl << " - one or more Enums missing." << endl; + ret << tmp; } for(int i = 0; i < qenum->classWichIsNotFound.size(); i++){ - if(ret.size() > 0) - out << endl; + QString tmp; + QTextStream out(&tmp); - out << qenum->classWichIsNotFound[i] << "::"; + out << qenum->classWichIsNotFound[i] << "::Q_ENUMS ( "; unsigned int firsttoken = qenum->ast->firstToken(); unsigned int lasttoken = qenum->ast->lastToken(); - for(unsigned int i = firsttoken; i <= lasttoken; i++){ + for(unsigned int i = firsttoken; i < lasttoken; i++) out << qenum->trlUnit->spell(i) << " "; - } + out << ")"; + ret << tmp; } return ret; } @@ -1242,8 +1358,11 @@ QList<QFLAGITEM*> ParseManager::checkMetadataFlags(const QList<QList<QFLAGITEM*> } } else { - foreach(QFLAGITEM *pflag, iqflaglist) + foreach(QFLAGITEM *pflag, iqflaglist){ pflag->classWichIsNotFound << "<all classes>"; + QString name= pflag->trlUnit->spell(pflag->ast->firstToken()); + Trace("- Flag: <all classes>::" + name + " not found!"); + } iqflags.append(iqflaglist); } missingqflags.append(iqflags); @@ -1261,44 +1380,42 @@ void ParseManager::assignFlagValues(QFLAGITEM* qflags, const QList<QList<QDECLAR QString qflagname; QString enumname; //read the flag names - for (EnumeratorListAST *plist = qflags->ast->enumerator_list; plist; plist = plist->next) { - EnumeratorAST *pflags = plist->value->asEnumerator(); - if(pflags){ - qflagname = qflags->trlUnit->spell(pflags->firstToken()); - enumname = qflagname; - //try to find if there is a deflare flag macro with the same name as in qflagname - bool found = false; - foreach(QList<QDECLAREFLAGSITEM*> qdeclarelist, qdeclareflagslookuplist){ - foreach(QDECLAREFLAGSITEM* qdeclare, qdeclarelist){ - QString declarename = qdeclare->trlUnit->spell(qdeclare->ast->flag_token); - if(declarename == qflagname){ - //now map the right enum name to the flag - enumname = qdeclare->trlUnit->spell(qdeclare->ast->enum_token); - found = true; - break; - } - } - if(found) + EnumeratorAST *pflags = qflags->ast->asEnumerator(); + if(pflags){ + qflagname = qflags->trlUnit->spell(pflags->firstToken()); + enumname = qflagname; + //try to find if there is a deflare flag macro with the same name as in qflagname + bool found = false; + foreach(QList<QDECLAREFLAGSITEM*> qdeclarelist, qdeclareflagslookuplist){ + foreach(QDECLAREFLAGSITEM* qdeclare, qdeclarelist){ + QString declarename = qdeclare->trlUnit->spell(qdeclare->ast->flag_token); + if(declarename == qflagname){ + //now map the right enum name to the flag + enumname = qdeclare->trlUnit->spell(qdeclare->ast->enum_token); + found = true; break; - } - //now we have the right enum name now we need to find the enum - found = false; - foreach(QList<ENUMITEM*> enumitemlist, enumlookuplist){ - foreach(ENUMITEM* enumitem, enumitemlist){ - EnumSpecifierAST *penumspec = enumitem->ast; - QString enumspecname = enumitem->trlUnit->spell(penumspec->name->firstToken()); - if(enumspecname == enumname){ - qflags->enumvalues << getEnumValueStringList(enumitem, qflagname); - found = true; - break; - } } - if(found) + } + if(found) + break; + } + //now we have the right enum name now we need to find the enum + found = false; + foreach(QList<ENUMITEM*> enumitemlist, enumlookuplist){ + foreach(ENUMITEM* enumitem, enumitemlist){ + EnumSpecifierAST *penumspec = enumitem->ast; + QString enumspecname = enumitem->trlUnit->spell(penumspec->name->firstToken()); + if(enumspecname == enumname){ + qflags->enumvalues << getEnumValueStringList(enumitem, qflagname); + found = true; break; + } } - if(!found) - qflags->foundallenums = false; + if(found) + break; } + if(!found) + qflags->foundallenums = false; } } @@ -1315,11 +1432,11 @@ QList<QFLAGITEM*> ParseManager::containsAllFlags(const QList<QFLAGITEM*> &classq bool found = false; QStringList missingimplinclasses; ClassSpecifierAST* clspec = 0; + QString classname = ""; foreach(QFLAGITEM* qflags, classqflaglist){ if(clspec != qflags->highestlevelclass->classspec){ clspec = qflags->highestlevelclass->classspec; //get the classname - QString classname = ""; unsigned int firsttoken = clspec->name->firstToken(); classname += qflags->trlUnit->spell(firsttoken); if(missingimplinclasses.indexOf(classname) < 0) @@ -1328,12 +1445,15 @@ QList<QFLAGITEM*> ParseManager::containsAllFlags(const QList<QFLAGITEM*> &classq if(qflags->isEqualTo(iqflags)){ found = true; missingimplinclasses.clear(); + Trace("- Flag: " + classname + "::" + qflags->trlUnit->spell(qflags->ast->firstToken()) + " found"); break; } } if(!found){ iqflags->classWichIsNotFound.append(missingimplinclasses); ret.push_back(iqflags); + QString classname = iqflags->trlUnit->spell(iqflags->highestlevelclass->classspec->name->firstToken()); + Trace("- Flag: " + classname + "::" + iqflags->trlUnit->spell(iqflags->ast->firstToken()) + " not found!"); } } else @@ -1343,43 +1463,87 @@ QList<QFLAGITEM*> ParseManager::containsAllFlags(const QList<QFLAGITEM*> &classq } /************************************ -Function that gives back an error +Function that gives back an error string for a Q_FLAGS mismatch. ************************************/ -QString ParseManager::getErrorMessage(QFLAGITEM* pfg) +QStringList ParseManager::getErrorMessage(QFLAGITEM* pfg) { - QString ret = ""; - QTextStream out(&ret); + QStringList ret; if(!pfg->foundallenums) { + QString tmp; + QTextStream out(&tmp); + unsigned int firsttoken = pfg->highestlevelclass->classspec->name->firstToken(); unsigned int lasttoken = pfg->highestlevelclass->classspec->name->lastToken(); for(unsigned int i = firsttoken; i < lasttoken; i++){ out << pfg->trlUnit->spell(i); } - out << "::"; + out << "::Q_FLAGS ( "; firsttoken = pfg->ast->firstToken(); lasttoken = pfg->ast->lastToken(); - for(unsigned int i = firsttoken; i <= lasttoken; i++){ + for(unsigned int i = firsttoken; i < lasttoken; i++) out << pfg->trlUnit->spell(i) << " "; - } + out << ")"; out << endl << " - one or more Enums missing." << endl; + ret << tmp; } for(int i = 0; i < pfg->classWichIsNotFound.size(); i++){ - if(ret.size() > 0) - out << endl; + QString tmp; + QTextStream out(&tmp); - out << pfg->classWichIsNotFound[i] << "::"; + out << pfg->classWichIsNotFound[i] << "::Q_FLAGS ( "; unsigned int firsttoken = pfg->ast->firstToken(); unsigned int lasttoken = pfg->ast->lastToken(); - for(unsigned int i = firsttoken; i <= lasttoken; i++){ + for(unsigned int i = firsttoken; i < lasttoken; i++) out << pfg->trlUnit->spell(i) << " "; - } + out << ")"; + ret << tmp; } return ret; } -#include <moc_ParseManager.cpp> +inline QString ParseManager::getTraceFuntionString(const FUNCTIONITEM *fctitem, const QString& classname) +{ + QString ret; + + if(fctitem->function->isPublic()) + ret = "public "; + if(fctitem->function->isProtected()) + ret = "protected "; + if(fctitem->function->isPrivate()) + ret = "private "; + + if(fctitem->function->isVirtual()) + ret += "virtual "; + if(fctitem->function->isPureVirtual()) + ret += "pure virtual "; + + if(fctitem->function->isSignal()) + ret += "Signal "; + if(fctitem->function->isSlot()) + ret += "Slot "; + if(fctitem->function->isNormal()) + ret += "Normal "; + if(fctitem->function->isInvokable()) + ret += "Invokable "; + + ret += classname; + ret += "::"; + ret += fctitem->trlUnit->spell(fctitem->function->sourceLocation()); + return ret; +} + +void ParseManager::Trace(QString value) +{ + if(::m_resultFile){ + QTextStream out(::m_resultFile); + if(value == "\n") + out << endl; + else + out << value << endl; + } +} //---> diff --git a/tests/auto/icheckbuild/ParseManager.h b/tests/auto/icheckbuild/parsemanager.h similarity index 92% rename from tests/auto/icheckbuild/ParseManager.h rename to tests/auto/icheckbuild/parsemanager.h index ee6fb396526..0104a4f02a3 100644 --- a/tests/auto/icheckbuild/ParseManager.h +++ b/tests/auto/icheckbuild/parsemanager.h @@ -66,6 +66,7 @@ #include <QFuture> #include <QStringList> #include "cplusplus/CppDocument.h" +#include <QFile> namespace CppTools{ namespace Internal{ @@ -78,11 +79,10 @@ namespace CPlusPlus { class AST; class ClassSpecifierAST; class QPropertyDeclarationAST; - class QEnumDeclarationAST; - class QFlagsDeclarationAST; class QDeclareFlagsDeclarationAST; class EnumSpecifierAST; class Function; + class EnumeratorAST; class CLASSLISTITEM { @@ -155,7 +155,7 @@ namespace CPlusPlus { const CLASSLISTITEM* highestlevelclass; CPlusPlus::TranslationUnit* trlUnit; QStringList classWichIsNotFound; - QEnumDeclarationAST* ast; + EnumeratorAST* ast; //an item in this list will be shown like: //EnumName.EnumItemName.Value //ConnectionState.disconnected.0 @@ -195,7 +195,7 @@ namespace CPlusPlus { const CLASSLISTITEM* highestlevelclass; CPlusPlus::TranslationUnit* trlUnit; QStringList classWichIsNotFound; - QFlagsDeclarationAST* ast; + EnumeratorAST* ast; QStringList enumvalues; bool foundallenums; @@ -226,6 +226,7 @@ namespace CPlusPlus { } }; + static QFile* m_resultFile = 0; class ParseManager : public QObject { Q_OBJECT @@ -234,14 +235,20 @@ namespace CPlusPlus { virtual ~ParseManager(); void setIncludePath(const QStringList &includePath); void parse(const QStringList &sourceFiles); - bool checkAllMetadatas(ParseManager* pInterfaceParserManager); + bool checkAllMetadatas(ParseManager* pInterfaceParserManager, QString resultfile); CppTools::Internal::CppPreprocessor *getPreProcessor() { return pCppPreprocessor; } - QList<CLASSTREE*> CreateClassLists(); + QList<CLASSTREE*> CreateClassLists(bool isInterfaceHeader); QStringList getErrorMsg() { return m_errormsgs; } private: void parse(CppTools::Internal::CppPreprocessor *preproc, const QStringList &files); - void getBaseClasses(const CLASSLISTITEM* pclass, QList<CLASSLISTITEM*> &baseclasslist, const QList<CLASSLISTITEM*> &allclasslist); + void Trace(QString value); + inline QString getTraceFuntionString(const FUNCTIONITEM* fctitem, const QString& classname); + void getBaseClasses(const CLASSLISTITEM* pclass + , QList<CLASSLISTITEM*> &baseclasslist + , const QList<CLASSLISTITEM*> &allclasslist + , int level + , bool isInterfaceHeader); void getElements(QList<FUNCTIONITEM*> &functionlist , QList<PROPERTYITEM*> &propertylist , QList<QENUMITEM*> &qenumlist @@ -255,7 +262,7 @@ namespace CPlusPlus { QList<FUNCTIONITEM*> checkMetadataFunctions(const QList<QList<FUNCTIONITEM*> > &classfctlist, const QList<QList<FUNCTIONITEM*> > &iclassfctlist); bool isMetaObjFunction(FUNCTIONITEM* fct); QList<FUNCTIONITEM*> containsAllMetadataFunction(const QList<FUNCTIONITEM*> &classfctlist, const QList<FUNCTIONITEM*> &iclassfctlist); - QString getErrorMessage(FUNCTIONITEM* fct); + QStringList getErrorMessage(FUNCTIONITEM* fct); //---> //<--- for Q_PROPERTY functions checks @@ -265,7 +272,7 @@ namespace CPlusPlus { , const QList<QList<FUNCTIONITEM*> > &iclassfctlist); void assignPropertyFunctions(PROPERTYITEM* prop, const QList<QList<FUNCTIONITEM*> > &fctlookuplist); QList<PROPERTYITEM*> containsAllPropertyFunction(const QList<PROPERTYITEM*> &classproplist, const QList<PROPERTYITEM*> &iclassproplist); - QString getErrorMessage(PROPERTYITEM* ppt); + QStringList getErrorMessage(PROPERTYITEM* ppt); //---> //<--- for Q_ENUMS checks @@ -276,7 +283,7 @@ namespace CPlusPlus { QStringList getEnumValueStringList(ENUMITEM *penum, QString mappedenumname = ""); void assignEnumValues(QENUMITEM* qenum, const QList<QList<ENUMITEM*> > &enumlookuplist); QList<QENUMITEM*> containsAllEnums(const QList<QENUMITEM*> &classqenumlist, const QList<QENUMITEM*> &iclassqenumlist); - QString getErrorMessage(QENUMITEM* qenum); + QStringList getErrorMessage(QENUMITEM* qenum); //---> //<--- for QFlags checks ---> @@ -288,7 +295,7 @@ namespace CPlusPlus { , const QList<QList<ENUMITEM*> > &iclassenumlist); void assignFlagValues(QFLAGITEM* qflags, const QList<QList<QDECLAREFLAGSITEM*> > &qdeclareflagslookuplist, const QList<QList<ENUMITEM*> > &enumlookuplist); QList<QFLAGITEM*> containsAllFlags(const QList<QFLAGITEM*> &classqflaglist, const QList<QFLAGITEM*> &iclassqflaglist); - QString getErrorMessage(QFLAGITEM* pfg); + QStringList getErrorMessage(QFLAGITEM* pfg); //---> private: -- GitLab