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