summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-04-16 12:42:12 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-04-16 12:55:00 +0200
commitd88eaff481ba469f5a41b0bc893b78d1e4a8ed87 (patch)
treeb59d3d64d48e4a25770410088f04e62de0a629de /src
parentfb9a9ceede0d872742c44462292626475df9f145 (diff)
downloadqt-creator-d88eaff481ba469f5a41b0bc893b78d1e4a8ed87.tar.gz
Hooked up the QML task manager again.
The QML task manager behaviour is to show warnings/errors for _saved_ files only.
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmljseditor/qmljseditor.cpp7
-rw-r--r--src/plugins/qmljseditor/qmljseditor.h1
-rw-r--r--src/plugins/qmljseditor/qmljsmodelmanager.cpp17
-rw-r--r--src/plugins/qmljseditor/qmljsmodelmanager.h7
-rw-r--r--src/plugins/qmljseditor/qmljsmodelmanagerinterface.h3
-rw-r--r--src/plugins/qmlprojectmanager/qmlproject.cpp12
-rw-r--r--src/plugins/qmlprojectmanager/qmlproject.h3
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectmanager.cpp8
-rw-r--r--src/plugins/qmlprojectmanager/qmlprojectplugin.cpp5
-rw-r--r--src/plugins/qmlprojectmanager/qmltaskmanager.cpp46
-rw-r--r--src/plugins/qmlprojectmanager/qmltaskmanager.h13
11 files changed, 104 insertions, 18 deletions
diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index 344830e90b..9ef22349f1 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -651,6 +651,7 @@ QmlJSTextEditor::QmlJSTextEditor(QWidget *parent) :
m_semanticHighlighter->setModelManager(m_modelManager);
connect(m_modelManager, SIGNAL(documentUpdated(QmlJS::Document::Ptr)),
this, SLOT(onDocumentUpdated(QmlJS::Document::Ptr)));
+ connect(this->document(), SIGNAL(modificationChanged(bool)), this, SLOT(modificationChanged(bool)));
}
connect(m_semanticHighlighter, SIGNAL(changed(QmlJSEditor::Internal::SemanticInfo)),
@@ -775,6 +776,12 @@ void QmlJSTextEditor::onDocumentUpdated(QmlJS::Document::Ptr doc)
}
}
+void QmlJSTextEditor::modificationChanged(bool changed)
+{
+ if (!changed && m_modelManager)
+ m_modelManager->fileChangedOnDisk(file()->fileName());
+}
+
void QmlJSTextEditor::jumpToMethod(int index)
{
if (index > 0 && index <= m_semanticInfo.declarations.size()) { // indexes are 1-based
diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h
index 6bfb3b4722..1fb222e51b 100644
--- a/src/plugins/qmljseditor/qmljseditor.h
+++ b/src/plugins/qmljseditor/qmljseditor.h
@@ -218,6 +218,7 @@ public slots:
private slots:
void onDocumentUpdated(QmlJS::Document::Ptr doc);
+ void modificationChanged(bool);
void updateDocument();
void updateDocumentNow();
diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.cpp b/src/plugins/qmljseditor/qmljsmodelmanager.cpp
index 0788dc4a99..8c60de1a38 100644
--- a/src/plugins/qmljseditor/qmljsmodelmanager.cpp
+++ b/src/plugins/qmljseditor/qmljsmodelmanager.cpp
@@ -112,7 +112,7 @@ QFuture<void> ModelManager::refreshSourceFiles(const QStringList &sourceFiles)
QFuture<void> result = QtConcurrent::run(&ModelManager::parse,
workingCopy, sourceFiles,
- this);
+ this, false);
if (m_synchronizer.futures().size() > 10) {
QList<QFuture<void> > futures = m_synchronizer.futures();
@@ -154,6 +154,16 @@ QMap<QString, ModelManager::WorkingCopy> ModelManager::buildWorkingCopyList()
return workingCopy;
}
+void ModelManager::fileChangedOnDisk(const QString &path)
+{
+ QtConcurrent::run(&ModelManager::parse,
+ buildWorkingCopyList(), QStringList() << path,
+ this, true);
+}
+
+void ModelManager::emitDocumentChangedOnDisk(Document::Ptr doc)
+{ emit documentChangedOnDisk(doc); }
+
void ModelManager::emitDocumentUpdated(Document::Ptr doc)
{ emit documentUpdated(doc); }
@@ -279,7 +289,8 @@ static void findNewLibraryImports(const Document::Ptr &doc, const Snapshot &snap
void ModelManager::parse(QFutureInterface<void> &future,
QMap<QString, WorkingCopy> workingCopy,
QStringList files,
- ModelManager *modelManager)
+ ModelManager *modelManager,
+ bool emitDocChangedOnDisk)
{
Core::MimeDatabase *db = Core::ICore::instance()->mimeDatabase();
Core::MimeType jsSourceTy = db->findByType(QLatin1String("application/javascript"));
@@ -344,6 +355,8 @@ void ModelManager::parse(QFutureInterface<void> &future,
}
modelManager->emitDocumentUpdated(doc);
+ if (emitDocChangedOnDisk)
+ modelManager->emitDocumentChangedOnDisk(doc);
}
future.setProgressValue(progressRange);
diff --git a/src/plugins/qmljseditor/qmljsmodelmanager.h b/src/plugins/qmljseditor/qmljsmodelmanager.h
index d83d6547c2..f43f7c6129 100644
--- a/src/plugins/qmljseditor/qmljsmodelmanager.h
+++ b/src/plugins/qmljseditor/qmljsmodelmanager.h
@@ -55,18 +55,20 @@ public:
virtual QmlJS::Snapshot snapshot() const;
virtual void updateSourceFiles(const QStringList &files);
+ virtual void fileChangedOnDisk(const QString &path);
void emitDocumentUpdated(QmlJS::Document::Ptr doc);
void emitLibraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info);
+ void emitDocumentChangedOnDisk(QmlJS::Document::Ptr doc);
virtual void setProjectImportPaths(const QStringList &importPaths);
virtual QStringList importPaths() const;
Q_SIGNALS:
void projectPathChanged(const QString &projectPath);
- void aboutToRemoveFiles(const QStringList &files);
void libraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info);
+
private Q_SLOTS:
// this should be executed in the GUI thread.
void onDocumentUpdated(QmlJS::Document::Ptr doc);
@@ -86,7 +88,8 @@ protected:
static void parse(QFutureInterface<void> &future,
QMap<QString, WorkingCopy> workingCopy,
QStringList files,
- ModelManager *modelManager);
+ ModelManager *modelManager,
+ bool emitDocChangedOnDisk);
void loadQmlTypeDescriptions();
diff --git a/src/plugins/qmljseditor/qmljsmodelmanagerinterface.h b/src/plugins/qmljseditor/qmljsmodelmanagerinterface.h
index 280828c0e7..706e574f87 100644
--- a/src/plugins/qmljseditor/qmljsmodelmanagerinterface.h
+++ b/src/plugins/qmljseditor/qmljsmodelmanagerinterface.h
@@ -54,12 +54,15 @@ public:
virtual QmlJS::Snapshot snapshot() const = 0;
virtual void updateSourceFiles(const QStringList &files) = 0;
+ virtual void fileChangedOnDisk(const QString &path) = 0;
virtual void setProjectImportPaths(const QStringList &importPaths) = 0;
virtual QStringList importPaths() const = 0;
signals:
void documentUpdated(QmlJS::Document::Ptr doc);
+ void documentChangedOnDisk(QmlJS::Document::Ptr doc);
+ void aboutToRemoveFiles(const QStringList &files);
};
} // namespace QmlJSEditor
diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp
index 1b495017ce..548c402688 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ b/src/plugins/qmlprojectmanager/qmlproject.cpp
@@ -121,14 +121,20 @@ void QmlProject::parseProject(RefreshOptions options)
void QmlProject::refresh(RefreshOptions options)
{
- QSet<QString> oldFileList;
- if (!(options & Configuration))
- oldFileList = m_files.toSet();
+ const QSet<QString> oldFiles = m_files.toSet();
parseProject(options);
if (options & Files)
m_rootNode->refresh();
+
+ const QSet<QString> newFiles = m_files.toSet();
+ QStringList removedPaths;
+ foreach (const QString &oldFile, oldFiles)
+ if (!newFiles.contains(oldFile))
+ removedPaths.append(oldFile);
+ if (!removedPaths.isEmpty())
+ emit filesRemovedFromProject(removedPaths);
}
QStringList QmlProject::convertToAbsoluteFiles(const QStringList &paths) const
diff --git a/src/plugins/qmlprojectmanager/qmlproject.h b/src/plugins/qmlprojectmanager/qmlproject.h
index a1903dfc08..bab39524c4 100644
--- a/src/plugins/qmlprojectmanager/qmlproject.h
+++ b/src/plugins/qmlprojectmanager/qmlproject.h
@@ -101,6 +101,9 @@ public:
bool addFiles(const QStringList &filePaths);
+signals:
+ void filesRemovedFromProject(const QStringList removedPaths);
+
private slots:
void refreshProjectFile();
void refreshFiles();
diff --git a/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp b/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp
index e82b0ba319..a1d3092bdb 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectmanager.cpp
@@ -30,6 +30,7 @@
#include "qmlprojectmanager.h"
#include "qmlprojectconstants.h"
#include "qmlproject.h"
+#include "qmltaskmanager.h"
#include <coreplugin/icore.h>
#include <coreplugin/ifile.h>
@@ -79,7 +80,12 @@ ProjectExplorer::Project *Manager::openProject(const QString &fileName)
}
if (fileInfo.isFile()) {
- return new QmlProject(this, fileName);
+ QmlProject *project = new QmlProject(this, fileName);
+ QmlTaskManager *taskManager = QmlTaskManager::instance();
+ if (taskManager)
+ connect(project, SIGNAL(filesRemovedFromProject(QStringList)),
+ taskManager, SLOT(documentsRemoved(const QStringList)));
+ return project;
}
return 0;
diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
index 3077d69f06..f58d3ecb5e 100644
--- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
+++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
@@ -77,6 +77,7 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
Manager *manager = new Manager;
m_qmlTaskManager = new QmlTaskManager(this);
+ addAutoReleasedObject(m_qmlTaskManager);
addAutoReleasedObject(manager);
addAutoReleasedObject(new Internal::QmlProjectRunConfigurationFactory);
@@ -100,8 +101,8 @@ void QmlProjectPlugin::extensionsInitialized()
QmlJSEditor::ModelManagerInterface *modelManager = pluginManager->getObject<QmlJSEditor::ModelManagerInterface>();
Q_ASSERT(modelManager);
- connect(modelManager, SIGNAL(documentUpdated(QmlJS::Document::Ptr)),
- m_qmlTaskManager, SLOT(documentUpdated(QmlJS::Document::Ptr)));
+ connect(modelManager, SIGNAL(documentChangedOnDisk(QmlJS::Document::Ptr)),
+ m_qmlTaskManager, SLOT(documentChangedOnDisk(QmlJS::Document::Ptr)));
}
} // namespace Internal
diff --git a/src/plugins/qmlprojectmanager/qmltaskmanager.cpp b/src/plugins/qmlprojectmanager/qmltaskmanager.cpp
index cf5d8af2dc..f17c2fc2a7 100644
--- a/src/plugins/qmlprojectmanager/qmltaskmanager.cpp
+++ b/src/plugins/qmlprojectmanager/qmltaskmanager.cpp
@@ -29,6 +29,9 @@
#include "qmltaskmanager.h"
#include "qmlprojectconstants.h"
+
+#include <extensionsystem/pluginmanager.h>
+
#include <QDebug>
namespace QmlProjectManager {
@@ -40,29 +43,58 @@ QmlTaskManager::QmlTaskManager(QObject *parent) :
{
}
+QmlTaskManager *QmlTaskManager::instance()
+{
+ ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
+ return pluginManager->getObject<QmlTaskManager>();
+}
+
void QmlTaskManager::setTaskWindow(ProjectExplorer::TaskWindow *taskWindow)
{
Q_ASSERT(taskWindow);
m_taskWindow = taskWindow;
- m_taskWindow->addCategory(Constants::TASK_CATEGORY_QML, "QML");
+ m_taskWindow->addCategory(Constants::TASK_CATEGORY_QML, tr("QML"));
}
-void QmlTaskManager::documentUpdated(QmlJS::Document::Ptr /*doc*/)
+void QmlTaskManager::documentChangedOnDisk(QmlJS::Document::Ptr doc)
{
-#if 0 // This will give way too many flickering errors in the build-results pane *when you're typing*
- m_taskWindow->clearTasks(Constants::TASK_CATEGORY_QML);
+ const QString fileName = doc->fileName();
+ removeTasksForFile(fileName);
foreach (const QmlJS::DiagnosticMessage &msg, doc->diagnosticMessages()) {
ProjectExplorer::Task::TaskType type
= msg.isError() ? ProjectExplorer::Task::Error
: ProjectExplorer::Task::Warning;
- ProjectExplorer::Task task(type, msg.message, doc->fileName(), msg.loc.startLine,
+ ProjectExplorer::Task task(type, msg.message, fileName, msg.loc.startLine,
Constants::TASK_CATEGORY_QML);
- m_taskWindow->addTask(task);
+ insertTask(fileName, task);
+ }
+}
+
+void QmlTaskManager::documentsRemoved(const QStringList path)
+{
+ foreach (const QString &item, path)
+ removeTasksForFile(item);
+}
+
+void QmlTaskManager::insertTask(const QString &fileName, const ProjectExplorer::Task &task)
+{
+ QList<ProjectExplorer::Task> tasks = m_docsWithTasks.value(fileName);
+ tasks.append(task);
+ m_docsWithTasks.insert(fileName, tasks);
+ m_taskWindow->addTask(task);
+}
+
+void QmlTaskManager::removeTasksForFile(const QString &fileName)
+{
+ if (m_docsWithTasks.contains(fileName)) {
+ const QList<ProjectExplorer::Task> tasks = m_docsWithTasks.value(fileName);
+ foreach (const ProjectExplorer::Task &task, tasks)
+ m_taskWindow->removeTask(task);
+ m_docsWithTasks.remove(fileName);
}
-#endif
}
} // Internal
diff --git a/src/plugins/qmlprojectmanager/qmltaskmanager.h b/src/plugins/qmlprojectmanager/qmltaskmanager.h
index 3fd47d64af..369c95a78a 100644
--- a/src/plugins/qmlprojectmanager/qmltaskmanager.h
+++ b/src/plugins/qmlprojectmanager/qmltaskmanager.h
@@ -34,6 +34,8 @@
#include <qmljs/qmljsdocument.h>
#include <QtCore/QObject>
+#include <QtCore/QList>
+#include <QtCore/QSet>
namespace QmlProjectManager {
namespace Internal {
@@ -43,13 +45,22 @@ class QmlTaskManager : public QObject
Q_OBJECT
public:
QmlTaskManager(QObject *parent = 0);
+
void setTaskWindow(ProjectExplorer::TaskWindow *taskWindow);
+ static QmlTaskManager *instance();
+
public slots:
- void documentUpdated(QmlJS::Document::Ptr doc);
+ void documentChangedOnDisk(QmlJS::Document::Ptr doc);
+ void documentsRemoved(const QStringList path);
+
+private:
+ void insertTask(const QString &fileName, const ProjectExplorer::Task &task);
+ void removeTasksForFile(const QString &fileName);
private:
ProjectExplorer::TaskWindow *m_taskWindow;
+ QMap<QString, QList<ProjectExplorer::Task> > m_docsWithTasks;
};
} // Internal