OSDN Git Service

Fixed QTCREATORBUG-1397.
authorErik Verbruggen <erik.verbruggen@nokia.com>
Tue, 18 May 2010 11:40:35 +0000 (13:40 +0200)
committerErik Verbruggen <erik.verbruggen@nokia.com>
Tue, 18 May 2010 13:29:11 +0000 (15:29 +0200)
When adding a new file, refreshing semantic errors in the open editor should
have worked. It now also works for removing existing files.

Done-with: Christian Kamm

13 files changed:
src/libs/qmljs/qmljsdocument.cpp
src/libs/qmljs/qmljsdocument.h
src/plugins/qmljseditor/qmljsmodelmanager.cpp
src/plugins/qmljseditor/qmljsmodelmanager.h
src/plugins/qmljseditor/qmljsmodelmanagerinterface.h
src/plugins/qmlprojectmanager/fileformat/filefilteritems.cpp
src/plugins/qmlprojectmanager/fileformat/filefilteritems.h
src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.cpp
src/plugins/qmlprojectmanager/fileformat/qmlprojectitem.h
src/plugins/qmlprojectmanager/qmlproject.cpp
src/plugins/qmlprojectmanager/qmlproject.h
src/plugins/qmlprojectmanager/qmlprojectmanager.cpp
src/plugins/qmlprojectmanager/qmlprojectplugin.cpp

index 3cb6162..40b71be 100644 (file)
@@ -254,9 +254,7 @@ void Snapshot::insert(const Document::Ptr &document)
         const QString fileName = document->fileName();
         const QString path = document->path();
 
-        Document::Ptr old = _documents.value(fileName);
-        if (old)
-            _documentsByPath.remove(path, old);
+        remove(fileName);
         _documentsByPath.insert(path, document);
         _documents.insert(fileName, document);
     }
@@ -267,6 +265,15 @@ void Snapshot::insertLibraryInfo(const QString &path, const LibraryInfo &info)
     _libraries.insert(QDir::cleanPath(path), info);
 }
 
+void Snapshot::remove(const QString &fileName)
+{
+    Document::Ptr doc = _documents.value(fileName);
+    if (!doc.isNull()) {
+        _documentsByPath.remove(doc->path(), doc);
+        _documents.remove(fileName);
+    }
+}
+
 Document::Ptr Snapshot::documentFromSource(const QString &code,
                                            const QString &fileName) const
 {
index c81c513..51b4e56 100644 (file)
@@ -148,6 +148,7 @@ public:
 
     void insert(const Document::Ptr &document);
     void insertLibraryInfo(const QString &path, const LibraryInfo &info);
+    void remove(const QString &fileName);
 
     Document::Ptr document(const QString &fileName) const;
     QList<Document::Ptr> documentsInDirectory(const QString &path) const;
index 58f44fb..405f94d 100644 (file)
@@ -164,6 +164,16 @@ void ModelManager::fileChangedOnDisk(const QString &path)
                       this, true);
 }
 
+void ModelManager::removeFiles(const QStringList &files)
+{
+    emit aboutToRemoveFiles(files);
+
+    QMutexLocker locker(&m_mutex);
+
+    foreach (const QString &file, files)
+        _snapshot.remove(file);
+}
+
 void ModelManager::emitDocumentChangedOnDisk(Document::Ptr doc)
 { emit documentChangedOnDisk(doc); }
 
index 4377731..0585356 100644 (file)
@@ -57,6 +57,7 @@ public:
     virtual void updateSourceFiles(const QStringList &files,
                                    bool emitDocumentOnDiskChanged);
     virtual void fileChangedOnDisk(const QString &path);
+    virtual void removeFiles(const QStringList &files);
 
     void emitDocumentUpdated(QmlJS::Document::Ptr doc);
     void emitLibraryInfoUpdated(const QString &path, const QmlJS::LibraryInfo &info);
@@ -69,7 +70,6 @@ Q_SIGNALS:
     void projectPathChanged(const QString &projectPath);
     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);
index 0f50222..a39a7d2 100644 (file)
@@ -56,6 +56,7 @@ public:
     virtual void updateSourceFiles(const QStringList &files,
                                    bool emitDocumentOnDiskChanged) = 0;
     virtual void fileChangedOnDisk(const QString &path) = 0;
+    virtual void removeFiles(const QStringList &files) = 0;
 
     virtual void setProjectImportPaths(const QStringList &importPaths) = 0;
     virtual QStringList importPaths() const = 0;
index 0080c62..d6a8256 100644 (file)
@@ -169,8 +169,15 @@ void FileFilterBaseItem::updateFileList()
         newFiles += filesInSubTree(QDir(m_defaultDir), QDir(projectDir), &dirsToBeWatched);
 
     if (newFiles != m_files) {
+        QSet<QString> addedFiles = newFiles;
+        QSet<QString> removedFiles = m_files;
+        QSet<QString> unchanged = newFiles;
+        unchanged.intersect(m_files);
+        addedFiles.subtract(unchanged);
+        removedFiles.subtract(unchanged);
+
         m_files = newFiles;
-        emit filesChanged();
+        emit filesChanged(addedFiles, removedFiles);
     }
 
     // update watched directories
index 8ded6d7..bcfa22d 100644 (file)
@@ -45,7 +45,7 @@ signals:
     void directoryChanged();
     void recursiveChanged();
     void pathsChanged();
-    void filesChanged();
+    void filesChanged(const QSet<QString> &added, const QSet<QString> &removed);
     void filterChanged();
 
 private slots:
index 0be5f30..19408db 100644 (file)
@@ -72,7 +72,8 @@ void QmlProjectItem::setSourceDirectory(const QString &directoryPath)
         FileFilterBaseItem *fileFilter = qobject_cast<FileFilterBaseItem*>(contentElement);
         if (fileFilter) {
             fileFilter->setDefaultDirectory(directoryPath);
-            connect(fileFilter, SIGNAL(filesChanged()), this, SIGNAL(qmlFilesChanged()));
+            connect(fileFilter, SIGNAL(filesChanged(QSet<QString>, QSet<QString>)),
+                    this, SIGNAL(qmlFilesChanged(QSet<QString>, QSet<QString>)));
         }
     }
 
index 1271146..32a2f1d 100644 (file)
@@ -44,7 +44,7 @@ public:
     bool matchesFile(const QString &filePath) const;
 
 signals:
-    void qmlFilesChanged();
+    void qmlFilesChanged(const QSet<QString> &, const QSet<QString> &);
     void sourceDirectoryChanged();
     void importPathsChanged();
 
index 0b2afe6..0daf385 100644 (file)
@@ -94,7 +94,8 @@ void QmlProject::parseProject(RefreshOptions options)
                 if (component->isReady()
                     && qobject_cast<QmlProjectItem*>(component->create())) {
                     m_projectItem = qobject_cast<QmlProjectItem*>(component->create());
-                    connect(m_projectItem.data(), SIGNAL(qmlFilesChanged()), this, SLOT(refreshFiles()));
+                    connect(m_projectItem.data(), SIGNAL(qmlFilesChanged(QSet<QString>, QSet<QString>)),
+                            this, SLOT(refreshFiles(QSet<QString>, QSet<QString>)));
                     connect(m_projectItem.data(), SIGNAL(importPathsChanged()), this, SLOT(refreshImportPaths()));
                     refreshImportPaths();
                 } else {
@@ -121,20 +122,10 @@ void QmlProject::parseProject(RefreshOptions options)
 
 void QmlProject::refresh(RefreshOptions options)
 {
-    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
@@ -188,9 +179,11 @@ void QmlProject::refreshProjectFile()
     refresh(QmlProject::ProjectFile | Files);
 }
 
-void QmlProject::refreshFiles()
+void QmlProject::refreshFiles(const QSet<QString> &/*added*/, const QSet<QString> &removed)
 {
     refresh(Files);
+    if (!removed.isEmpty())
+        m_modelManager->removeFiles(removed.toList());
 }
 
 void QmlProject::refreshImportPaths()
index bab3952..132622e 100644 (file)
@@ -101,12 +101,9 @@ public:
 
     bool addFiles(const QStringList &filePaths);
 
-signals:
-    void filesRemovedFromProject(const QStringList removedPaths);
-
 private slots:
     void refreshProjectFile();
-    void refreshFiles();
+    void refreshFiles(const QSet<QString> &added, const QSet<QString> &removed);
     void refreshImportPaths();
 
 protected:
index a1d3092..cd8cc19 100644 (file)
@@ -79,14 +79,8 @@ ProjectExplorer::Project *Manager::openProject(const QString &fileName)
         }
     }
 
-    if (fileInfo.isFile()) {
-        QmlProject *project = new QmlProject(this, fileName);
-        QmlTaskManager *taskManager = QmlTaskManager::instance();
-        if (taskManager)
-            connect(project, SIGNAL(filesRemovedFromProject(QStringList)),
-                    taskManager, SLOT(documentsRemoved(const QStringList)));
-        return project;
-    }
+    if (fileInfo.isFile())
+        return new QmlProject(this, fileName);
 
     return 0;
 }
index f58d3ec..144d5d0 100644 (file)
@@ -103,6 +103,8 @@ void QmlProjectPlugin::extensionsInitialized()
     Q_ASSERT(modelManager);
     connect(modelManager, SIGNAL(documentChangedOnDisk(QmlJS::Document::Ptr)),
             m_qmlTaskManager, SLOT(documentChangedOnDisk(QmlJS::Document::Ptr)));
+    connect(modelManager, SIGNAL(aboutToRemoveFiles(QStringList)),
+            m_qmlTaskManager, SLOT(documentsRemoved(QStringList)));
 }
 
 } // namespace Internal