diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp index 7dd5b8217e7..4037994470a 100644 --- a/src/plugins/qmljseditor/qmljseditor.cpp +++ b/src/plugins/qmljseditor/qmljseditor.cpp @@ -676,7 +676,7 @@ QmlJSTextEditor::QmlJSTextEditor(QWidget *parent) : connect(m_modelManager, SIGNAL(documentUpdated(QmlJS::Document::Ptr)), this, SLOT(onDocumentUpdated(QmlJS::Document::Ptr))); connect(m_modelManager, SIGNAL(libraryInfoUpdated(QString,QmlJS::LibraryInfo)), - this, SLOT(forceSemanticRehighlight())); + this, SLOT(forceSemanticRehighlightIfCurrentEditor())); connect(this->document(), SIGNAL(modificationChanged(bool)), this, SLOT(modificationChanged(bool))); } @@ -1465,6 +1465,13 @@ void QmlJSTextEditor::forceSemanticRehighlight() m_semanticHighlighter->rehighlight(currentSource(/* force = */ true)); } +void QmlJSEditor::QmlJSTextEditor::forceSemanticRehighlightIfCurrentEditor() +{ + Core::EditorManager *editorManager = Core::EditorManager::instance(); + if (editorManager->currentEditor() == editableInterface()) + forceSemanticRehighlight(); +} + void QmlJSTextEditor::semanticRehighlight() { m_semanticHighlighter->rehighlight(currentSource()); diff --git a/src/plugins/qmljseditor/qmljseditor.h b/src/plugins/qmljseditor/qmljseditor.h index 7d141ed8e0c..51e7a6fddd7 100644 --- a/src/plugins/qmljseditor/qmljseditor.h +++ b/src/plugins/qmljseditor/qmljseditor.h @@ -192,6 +192,7 @@ private slots: void renameIdUnderCursor(); void semanticRehighlight(); + void forceSemanticRehighlightIfCurrentEditor(); void updateSemanticInfo(const QmlJSEditor::SemanticInfo &semanticInfo); void onCursorPositionChanged(); void onRefactorMarkerClicked(const TextEditor::RefactorMarker &marker); diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index 4ec092fd179..d3da19329e9 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -349,7 +349,7 @@ static void findNewFileImports(const Document::Ptr &doc, const Snapshot &snapsho static void findNewLibraryImports(const Document::Ptr &doc, const Snapshot &snapshot, ModelManager *modelManager, - QStringList *importedFiles, QSet *scannedPaths) + QStringList *importedFiles, QSet *scannedPaths, QSet *newLibraries) { // scan library imports const QStringList importPaths = modelManager->importPaths(); @@ -364,6 +364,8 @@ static void findNewLibraryImports(const Document::Ptr &doc, const Snapshot &snap // if we know there is a library, done if (snapshot.libraryInfo(targetPath).isValid()) break; + if (newLibraries->contains(targetPath)) + break; // if there is a qmldir file, we found a new library! if (dir.exists("qmldir")) { @@ -375,8 +377,10 @@ static void findNewLibraryImports(const Document::Ptr &doc, const Snapshot &snap qmldirParser.setSource(qmldirData); qmldirParser.parse(); - modelManager->updateLibraryInfo(QFileInfo(qmldirFile).absolutePath(), - LibraryInfo(qmldirParser)); + const QString libraryPath = QFileInfo(qmldirFile).absolutePath(); + newLibraries->insert(libraryPath); + modelManager->updateLibraryInfo(libraryPath, + LibraryInfo(qmldirParser)); // scan the qml files in the library foreach (const QmlDirParser::Component &component, qmldirParser.components()) { @@ -425,6 +429,8 @@ void ModelManager::parse(QFutureInterface &future, // paths we have scanned for files and added to the files list QSet scannedPaths; + // libraries we've found while scanning imports + QSet newLibraries; for (int i = 0; i < files.size(); ++i) { future.setProgressValue(qreal(i) / files.size() * progressRange); @@ -471,7 +477,7 @@ void ModelManager::parse(QFutureInterface &future, QStringList importedFiles; findNewImplicitImports(doc, snapshot, &importedFiles, &scannedPaths); findNewFileImports(doc, snapshot, &importedFiles, &scannedPaths); - findNewLibraryImports(doc, snapshot, modelManager, &importedFiles, &scannedPaths); + findNewLibraryImports(doc, snapshot, modelManager, &importedFiles, &scannedPaths, &newLibraries); // add new files to parse list foreach (const QString &file, importedFiles) { @@ -547,8 +553,9 @@ void ModelManager::updateImportPaths() Snapshot snapshot = _snapshot; QStringList importedFiles; QSet scannedPaths; + QSet newLibraries; foreach (const Document::Ptr &doc, snapshot) - findNewLibraryImports(doc, snapshot, this, &importedFiles, &scannedPaths); + findNewLibraryImports(doc, snapshot, this, &importedFiles, &scannedPaths, &newLibraries); updateSourceFiles(importedFiles, true); }