From 925c686d85090cd6f9b3cd23b64367000e1a59d5 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Wed, 11 Nov 2009 10:10:00 +0100
Subject: [PATCH] Listening Qml syntax errors in Tasks window

---
 src/plugins/qmleditor/qmldocument.cpp         |  2 +-
 src/plugins/qmleditor/qmldocument.h           |  7 ++--
 src/plugins/qmleditor/qmleditor.cpp           |  6 +--
 src/plugins/qmleditor/qmleditor.h             |  2 +-
 src/plugins/qmleditor/qmlmodelmanager.cpp     |  7 ++--
 src/plugins/qmleditor/qmlmodelmanager.h       |  4 +-
 .../qmleditor/qmlmodelmanagerinterface.h      |  5 +++
 src/plugins/qmleditor/qmlsymbol.h             |  2 +-
 .../qmlprojectmanager/qmlprojectconstants.h   |  2 +
 .../qmlprojectmanager/qmlprojectmanager.pro   |  2 +
 .../qmlprojectmanager/qmlprojectplugin.cpp    | 24 ++++++++++--
 .../qmlprojectmanager/qmlprojectplugin.h      |  2 +
 .../qmlprojectmanager/qmltaskmanager.cpp      | 38 +++++++++++++++++++
 .../qmlprojectmanager/qmltaskmanager.h        | 29 ++++++++++++++
 14 files changed, 113 insertions(+), 19 deletions(-)
 create mode 100644 src/plugins/qmlprojectmanager/qmltaskmanager.cpp
 create mode 100644 src/plugins/qmlprojectmanager/qmltaskmanager.h

diff --git a/src/plugins/qmleditor/qmldocument.cpp b/src/plugins/qmleditor/qmldocument.cpp
index d6baba6f821..13cbe2895e5 100644
--- a/src/plugins/qmleditor/qmldocument.cpp
+++ b/src/plugins/qmleditor/qmldocument.cpp
@@ -32,8 +32,8 @@
 #include "qmljsast_p.h"
 #include "qmljslexer_p.h"
 #include "qmljsparser_p.h"
-#include "qmljsengine_p.h"
 #include "qmljsnodepool_p.h"
+#include "qmljsastfwd_p.h"
 
 using namespace QmlEditor;
 using namespace QmlJS;
diff --git a/src/plugins/qmleditor/qmldocument.h b/src/plugins/qmleditor/qmldocument.h
index be6a3658eb7..4f9420ebaae 100644
--- a/src/plugins/qmleditor/qmldocument.h
+++ b/src/plugins/qmleditor/qmldocument.h
@@ -35,10 +35,9 @@
 #include <QtCore/QSharedPointer>
 #include <QtCore/QString>
 
-#include "qmleditor_global.h"
-#include "qmljsengine_p.h"
-#include "qmljsastfwd_p.h"
-#include "qmlsymbol.h"
+#include <qmleditor/qmleditor_global.h>
+#include <qmleditor/parser/qmljsengine_p.h>
+#include <qmleditor/qmlsymbol.h>
 
 namespace QmlEditor {
 
diff --git a/src/plugins/qmleditor/qmleditor.cpp b/src/plugins/qmleditor/qmleditor.cpp
index d0f57c0ae6a..e82d9319d57 100644
--- a/src/plugins/qmleditor/qmleditor.cpp
+++ b/src/plugins/qmleditor/qmleditor.cpp
@@ -398,8 +398,8 @@ ScriptEditor::ScriptEditor(QWidget *parent) :
     m_modelManager = ExtensionSystem::PluginManager::instance()->getObject<QmlModelManagerInterface>();
 
     if (m_modelManager) {
-        connect(m_modelManager, SIGNAL(documentUpdated(QmlDocument::Ptr)),
-                this, SLOT(onDocumentUpdated(QmlDocument::Ptr)));
+        connect(m_modelManager, SIGNAL(documentUpdated(QmlEditor::QmlDocument::Ptr)),
+                this, SLOT(onDocumentUpdated(QmlEditor::QmlDocument::Ptr)));
     }
 }
 
@@ -447,7 +447,7 @@ void ScriptEditor::updateDocumentNow()
     m_modelManager->updateSourceFiles(QStringList() << fileName);
 }
 
-void ScriptEditor::onDocumentUpdated(QmlDocument::Ptr doc)
+void ScriptEditor::onDocumentUpdated(QmlEditor::QmlDocument::Ptr doc)
 {
     if (file()->fileName() != doc->fileName())
         return;
diff --git a/src/plugins/qmleditor/qmleditor.h b/src/plugins/qmleditor/qmleditor.h
index d6a1026e71a..ac4692bc4de 100644
--- a/src/plugins/qmleditor/qmleditor.h
+++ b/src/plugins/qmleditor/qmleditor.h
@@ -113,7 +113,7 @@ public slots:
     virtual void setFontSettings(const TextEditor::FontSettings &);
 
 private slots:
-    void onDocumentUpdated(QmlDocument::Ptr doc);
+    void onDocumentUpdated(QmlEditor::QmlDocument::Ptr doc);
 
     void updateDocument();
     void updateDocumentNow();
diff --git a/src/plugins/qmleditor/qmlmodelmanager.cpp b/src/plugins/qmleditor/qmlmodelmanager.cpp
index b7b09adecb5..ae4e309fcb6 100644
--- a/src/plugins/qmleditor/qmlmodelmanager.cpp
+++ b/src/plugins/qmleditor/qmlmodelmanager.cpp
@@ -52,9 +52,10 @@ QmlModelManager::QmlModelManager(QObject *parent):
 {
     m_synchronizer.setCancelOnWait(true);
 
-    qRegisterMetaType<QmlDocument::Ptr>("QmlDocument::Ptr");
+    qRegisterMetaType<QmlEditor::QmlDocument::Ptr>("QmlEditor::QmlDocument::Ptr");
 
-    connect(this, SIGNAL(documentUpdated(QmlDocument::Ptr)), this, SLOT(onDocumentUpdated(QmlDocument::Ptr)));
+    connect(this, SIGNAL(documentUpdated(QmlEditor::QmlDocument::Ptr)),
+            this, SLOT(onDocumentUpdated(QmlEditor::QmlDocument::Ptr)));
 }
 
 Snapshot QmlModelManager::snapshot() const
@@ -122,7 +123,7 @@ QMap<QString, QString> QmlModelManager::buildWorkingCopyList()
 void QmlModelManager::emitDocumentUpdated(QmlDocument::Ptr doc)
 { emit documentUpdated(doc); }
 
-void QmlModelManager::onDocumentUpdated(QmlDocument::Ptr doc)
+void QmlModelManager::onDocumentUpdated(QmlEditor::QmlDocument::Ptr doc)
 {
     QMutexLocker locker(&m_mutex);
 
diff --git a/src/plugins/qmleditor/qmlmodelmanager.h b/src/plugins/qmleditor/qmlmodelmanager.h
index 4eb1f408b66..cada51871d1 100644
--- a/src/plugins/qmleditor/qmlmodelmanager.h
+++ b/src/plugins/qmleditor/qmlmodelmanager.h
@@ -58,13 +58,11 @@ public:
 
 Q_SIGNALS:
     void projectPathChanged(const QString &projectPath);
-
-    void documentUpdated(QmlDocument::Ptr doc);
     void aboutToRemoveFiles(const QStringList &files);
 
 private Q_SLOTS:
     // this should be executed in the GUI thread.
-    void onDocumentUpdated(QmlDocument::Ptr doc);
+    void onDocumentUpdated(QmlEditor::QmlDocument::Ptr doc);
 
 protected:
     QFuture<void> refreshSourceFiles(const QStringList &sourceFiles);
diff --git a/src/plugins/qmleditor/qmlmodelmanagerinterface.h b/src/plugins/qmleditor/qmlmodelmanagerinterface.h
index 4adcf91bd0a..f348b30bc9c 100644
--- a/src/plugins/qmleditor/qmlmodelmanagerinterface.h
+++ b/src/plugins/qmleditor/qmlmodelmanagerinterface.h
@@ -32,8 +32,10 @@
 
 #include <QObject>
 #include <QStringList>
+#include <QSharedPointer>
 
 #include <qmleditor/qmleditor_global.h>
+#include <qmleditor/qmldocument.h>
 
 namespace QmlEditor {
 
@@ -49,6 +51,9 @@ public:
 
     virtual Snapshot snapshot() const = 0;
     virtual void updateSourceFiles(const QStringList &files) = 0;
+
+signals:
+    void documentUpdated(QmlEditor::QmlDocument::Ptr doc);
 };
 
 }
diff --git a/src/plugins/qmleditor/qmlsymbol.h b/src/plugins/qmleditor/qmlsymbol.h
index 788341e104c..4b9f213be68 100644
--- a/src/plugins/qmleditor/qmlsymbol.h
+++ b/src/plugins/qmleditor/qmlsymbol.h
@@ -4,7 +4,7 @@
 #include <QList>
 #include <QString>
 
-#include "qmljsastfwd_p.h"
+#include <qmleditor/parser/qmljsastfwd_p.h>
 
 namespace QmlEditor {
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojectconstants.h b/src/plugins/qmlprojectmanager/qmlprojectconstants.h
index 77c2290e6ed..38611e657c6 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectconstants.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectconstants.h
@@ -49,6 +49,8 @@ const char *const PROJECT_KIND       = "QML";
 const char *const FILES_EDITOR       = ".qmlproject Editor";
 const char *const FILES_MIMETYPE     = QMLMIMETYPE;
 
+const char *const TASK_CATEGORY_QML = "Task.Category.Qml";
+
 } // namespace Constants
 } // namespace QmlProjectManager
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro
index 354c07800e9..9f41b40d85a 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectmanager.pro
+++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.pro
@@ -10,6 +10,7 @@ HEADERS = qmlproject.h \
     qmlprojectwizard.h \
     qmlnewprojectwizard.h \
     qmlprojectfileseditor.h \
+    qmltaskmanager.h \
     qmlmakestep.h
 SOURCES = qmlproject.cpp \
     qmlprojectplugin.cpp \
@@ -18,6 +19,7 @@ SOURCES = qmlproject.cpp \
     qmlprojectwizard.cpp \
     qmlnewprojectwizard.cpp \
     qmlprojectfileseditor.cpp \
+    qmltaskmanager.cpp \
     qmlmakestep.cpp
 RESOURCES += qmlproject.qrc
 
diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
index 5d21971a354..a41f3ad78d5 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
@@ -35,19 +35,26 @@
 #include "qmlprojectfileseditor.h"
 #include "qmlproject.h"
 #include "qmlmakestep.h"
+#include "qmltaskmanager.h"
+
+#include <extensionsystem/pluginmanager.h>
 
 #include <coreplugin/icore.h>
 #include <coreplugin/mimedatabase.h>
 
 #include <texteditor/texteditoractionhandler.h>
 
+#include <projectexplorer/taskwindow.h>
+#include <qmleditor/qmlmodelmanagerinterface.h>
+
 #include <QtCore/QtPlugin>
 
 using namespace QmlProjectManager;
 using namespace QmlProjectManager::Internal;
 
-QmlProjectPlugin::QmlProjectPlugin()
-    : m_projectFilesEditorFactory(0)
+QmlProjectPlugin::QmlProjectPlugin() :
+        m_projectFilesEditorFactory(0),
+        m_qmlTaskManager(0)
 { }
 
 QmlProjectPlugin::~QmlProjectPlugin()
@@ -76,6 +83,8 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
     m_projectFilesEditorFactory = new ProjectFilesFactory(manager, actionHandler);
     addObject(m_projectFilesEditorFactory);
 
+    m_qmlTaskManager = new QmlTaskManager(this);
+
     addAutoReleasedObject(manager);
     addAutoReleasedObject(new QmlRunConfigurationFactory);
     addAutoReleasedObject(new QmlNewProjectWizard);
@@ -86,6 +95,15 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
 }
 
 void QmlProjectPlugin::extensionsInitialized()
-{ }
+{
+    ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
+    ProjectExplorer::TaskWindow *taskWindow = pluginManager->getObject<ProjectExplorer::TaskWindow>();
+    m_qmlTaskManager->setTaskWindow(taskWindow);
+
+    QmlEditor::QmlModelManagerInterface *modelManager = pluginManager->getObject<QmlEditor::QmlModelManagerInterface>();
+    Q_ASSERT(modelManager);
+    connect(modelManager, SIGNAL(documentUpdated(QmlEditor::QmlDocument::Ptr)),
+            m_qmlTaskManager, SLOT(documentUpdated(QmlEditor::QmlDocument::Ptr)));
+}
 
 Q_EXPORT_PLUGIN(QmlProjectPlugin)
diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.h b/src/plugins/qmlprojectmanager/qmlprojectplugin.h
index 29ac7db5e4e..ab5d13a57a2 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectplugin.h
+++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.h
@@ -38,6 +38,7 @@ namespace QmlProjectManager {
 namespace Internal {
 
 class ProjectFilesFactory;
+class QmlTaskManager;
 
 class QmlProjectPlugin: public ExtensionSystem::IPlugin
 {
@@ -52,6 +53,7 @@ public:
 
 private:
     ProjectFilesFactory *m_projectFilesEditorFactory;
+    QmlTaskManager *m_qmlTaskManager;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qmlprojectmanager/qmltaskmanager.cpp b/src/plugins/qmlprojectmanager/qmltaskmanager.cpp
new file mode 100644
index 00000000000..2a76c425ce4
--- /dev/null
+++ b/src/plugins/qmlprojectmanager/qmltaskmanager.cpp
@@ -0,0 +1,38 @@
+#include "qmltaskmanager.h"
+#include "qmlprojectconstants.h"
+#include <QDebug>
+
+namespace QmlProjectManager {
+namespace Internal {
+
+QmlTaskManager::QmlTaskManager(QObject *parent) :
+        QObject(parent),
+        m_taskWindow(0)
+{
+}
+
+void QmlTaskManager::setTaskWindow(ProjectExplorer::TaskWindow *taskWindow)
+{
+    Q_ASSERT(taskWindow);
+    m_taskWindow = taskWindow;
+
+    m_taskWindow->addCategory(Constants::TASK_CATEGORY_QML, "Qml");
+}
+
+void QmlTaskManager::documentUpdated(QmlEditor::QmlDocument::Ptr doc)
+{
+    m_taskWindow->clearTasks(Constants::TASK_CATEGORY_QML);
+
+    foreach (const QmlJS::DiagnosticMessage &msg, doc->diagnosticMessages()) {
+        ProjectExplorer::TaskWindow::TaskType type
+                = msg.isError() ? ProjectExplorer::TaskWindow::Error
+                                : ProjectExplorer::TaskWindow::Warning;
+
+        ProjectExplorer::TaskWindow::Task task(type, msg.message, doc->fileName(), msg.loc.startLine,
+                                                Constants::TASK_CATEGORY_QML);
+        m_taskWindow->addTask(task);
+    }
+}
+
+} // Internal
+} // QmlEditor
diff --git a/src/plugins/qmlprojectmanager/qmltaskmanager.h b/src/plugins/qmlprojectmanager/qmltaskmanager.h
new file mode 100644
index 00000000000..0f952610765
--- /dev/null
+++ b/src/plugins/qmlprojectmanager/qmltaskmanager.h
@@ -0,0 +1,29 @@
+#ifndef QMLTASKMANAGER_H
+#define QMLTASKMANAGER_H
+
+#include <projectexplorer/taskwindow.h>
+#include <qmleditor/qmldocument.h>
+#include <QtCore/QObject>
+
+
+namespace QmlProjectManager {
+namespace Internal {
+
+class QmlTaskManager : public QObject
+{
+    Q_OBJECT
+public:
+    QmlTaskManager(QObject *parent = 0);
+    void setTaskWindow(ProjectExplorer::TaskWindow *taskWindow);
+
+public slots:
+    void documentUpdated(QmlEditor::QmlDocument::Ptr doc);
+
+private:
+    ProjectExplorer::TaskWindow *m_taskWindow;
+};
+
+} // Internal
+} // QmlProjectManager
+
+#endif // QMLTASKMANAGER_H
-- 
GitLab