diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp index f4865d7edf7..9909b22d944 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.cpp @@ -419,14 +419,29 @@ CompilationDatabaseProject::CompilationDatabaseProject(const Utils::FileName &pr m_kit.reset(KitManager::defaultKit()->clone()); - connect(this, &CompilationDatabaseProject::parsingFinished, - this, [this]() { addTarget(createTarget(m_kit.get())); }); - - emitParsingStarted(); - - const QFuture future = ::Utils::runAsync([this, projectFile](){ - buildTreeAndProjectParts(projectFile); + connect(this, &CompilationDatabaseProject::parsingFinished, this, [this]() { + if (!m_hasTarget) { + addTarget(createTarget(m_kit.get())); + m_hasTarget = true; + } }); + + reparseProject(projectFile); + + m_fileSystemWatcher.addFile(projectFile.toString(), Utils::FileSystemWatcher::WatchModifiedDate); + connect(&m_fileSystemWatcher, + &Utils::FileSystemWatcher::fileChanged, + this, + [this](const QString &projectFile) { + reparseProject(Utils::FileName::fromString(projectFile)); + }); +} + +void CompilationDatabaseProject::reparseProject(const Utils::FileName &projectFile) +{ + emitParsingStarted(); + const QFuture future = ::Utils::runAsync( + [this, projectFile]() { buildTreeAndProjectParts(projectFile); }); m_parserWatcher.setFuture(future); } diff --git a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h index 26fabebe472..5b6fc0a1167 100644 --- a/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h +++ b/src/plugins/compilationdatabaseprojectmanager/compilationdatabaseproject.h @@ -26,8 +26,8 @@ #pragma once #include - #include +#include #include @@ -51,11 +51,14 @@ public: bool needsBuildConfigurations() const override { return false; } private: + void reparseProject(const Utils::FileName &projectFile); void buildTreeAndProjectParts(const Utils::FileName &projectFile); QFutureWatcher m_parserWatcher; std::unique_ptr m_cppCodeModelUpdater; std::unique_ptr m_kit; + Utils::FileSystemWatcher m_fileSystemWatcher; + bool m_hasTarget = false; }; class CompilationDatabaseEditorFactory : public TextEditor::TextEditorFactory