From fbadbd3b0d40d19bc0b8a7303cb0dc0d1d031eb0 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 12 Feb 2019 19:49:38 +0100 Subject: [PATCH] Observe the cration of extra compiler We link into the extra compiler factory and notify the PchManager for every extra compiler creation. It enables to monitor if all extra compiler finished. Change-Id: If8da386c88909abd2e0e651e4336865c9dc5bf34 Reviewed-by: Ivan Donchevskii --- src/libs/clangsupport/filecontainerv2.cpp | 4 ++-- .../clangpchmanager/qtcreatorprojectupdater.h | 15 ++++++++++-- src/plugins/projectexplorer/extracompiler.cpp | 23 ++++++++++++++++-- src/plugins/projectexplorer/extracompiler.h | 24 +++++++++++++++++-- src/plugins/qtsupport/qscxmlcgenerator.cpp | 2 ++ src/plugins/qtsupport/uicgenerator.cpp | 2 ++ 6 files changed, 62 insertions(+), 8 deletions(-) diff --git a/src/libs/clangsupport/filecontainerv2.cpp b/src/libs/clangsupport/filecontainerv2.cpp index 96cc528750a..af5d89a787b 100644 --- a/src/libs/clangsupport/filecontainerv2.cpp +++ b/src/libs/clangsupport/filecontainerv2.cpp @@ -30,9 +30,9 @@ namespace V2 { QDebug operator<<(QDebug debug, const FileContainer &container) { - debug.nospace() << "FileContainer(" - << container.filePath << ", " + debug.nospace() << "FileContainer(" << container.filePath << ", " << container.commandLineArguments << ", " + << container.unsavedFileContent.hasContent() << ", " << container.documentRevision; debug.nospace() << ")"; diff --git a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h index fa008f14aec..4d66a2f8c30 100644 --- a/src/plugins/clangpchmanager/qtcreatorprojectupdater.h +++ b/src/plugins/clangpchmanager/qtcreatorprojectupdater.h @@ -28,6 +28,7 @@ #include "pchmanagerprojectupdater.h" #include +#include #include @@ -49,8 +50,9 @@ CLANGPCHMANAGER_EXPORT std::vector createGenera CLANGPCHMANAGER_EXPORT std::vector createProjectParts(ProjectExplorer::Project *project); } -template -class QtCreatorProjectUpdater : public ProjectUpdaterType +template +class QtCreatorProjectUpdater : public ProjectUpdaterType, + public ProjectExplorer::ExtraCompilerFactoryObserver { public: template @@ -90,6 +92,15 @@ public: ProjectUpdaterType::removeGeneratedFiles({ClangBackEnd::FilePath{filePath}}); } +protected: + void newExtraCompiler(const ProjectExplorer::Project *, + const Utils::FileName &, + const Utils::FileNameList &targets) override + { + for (const Utils::FileName &target : targets) + abstractEditorUpdated(target.toString(), {}); + } + private: void connectToCppModelManager() { diff --git a/src/plugins/projectexplorer/extracompiler.cpp b/src/plugins/projectexplorer/extracompiler.cpp index e73b44cb901..df7297c33de 100644 --- a/src/plugins/projectexplorer/extracompiler.cpp +++ b/src/plugins/projectexplorer/extracompiler.cpp @@ -52,7 +52,7 @@ namespace ProjectExplorer { Q_GLOBAL_STATIC(QThreadPool, s_extraCompilerThreadPool); Q_GLOBAL_STATIC(QList, factories); - +Q_GLOBAL_STATIC(QVector, observers); class ExtraCompilerPrivate { public: @@ -310,7 +310,8 @@ void ExtraCompiler::setContent(const Utils::FileName &file, const QByteArray &co } } -ExtraCompilerFactory::ExtraCompilerFactory(QObject *parent) : QObject(parent) +ExtraCompilerFactory::ExtraCompilerFactory(QObject *parent) + : QObject(parent) { factories->append(this); } @@ -320,6 +321,14 @@ ExtraCompilerFactory::~ExtraCompilerFactory() factories->removeAll(this); } +void ExtraCompilerFactory::annouceCreation(const Project *project, + const Utils::FileName &source, + const Utils::FileNameList &targets) +{ + for (ExtraCompilerFactoryObserver *observer : *observers) + observer->newExtraCompiler(project, source, targets); +} + QList ExtraCompilerFactory::extraCompilerFactories() { return *factories(); @@ -455,4 +464,14 @@ void ProcessExtraCompiler::cleanUp() setCompileTime(QDateTime::currentDateTime()); } +ExtraCompilerFactoryObserver::ExtraCompilerFactoryObserver() +{ + observers->push_back(this); +} + +ExtraCompilerFactoryObserver::~ExtraCompilerFactoryObserver() +{ + observers->removeOne(this); +} + } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/extracompiler.h b/src/plugins/projectexplorer/extracompiler.h index c93830b10ce..006555ffc63 100644 --- a/src/plugins/projectexplorer/extracompiler.h +++ b/src/plugins/projectexplorer/extracompiler.h @@ -137,6 +137,20 @@ private: QFutureWatcher *m_watcher = nullptr; }; +class PROJECTEXPLORER_EXPORT ExtraCompilerFactoryObserver +{ + friend class ExtraCompilerFactory; + +protected: + ExtraCompilerFactoryObserver(); + ~ExtraCompilerFactoryObserver(); + + virtual void newExtraCompiler(const Project *project, + const Utils::FileName &source, + const Utils::FileNameList &targets) + = 0; +}; + class PROJECTEXPLORER_EXPORT ExtraCompilerFactory : public QObject { Q_OBJECT @@ -147,8 +161,14 @@ public: virtual FileType sourceType() const = 0; virtual QString sourceTag() const = 0; - virtual ExtraCompiler *create(const Project *project, const Utils::FileName &source, - const Utils::FileNameList &targets) = 0; + virtual ExtraCompiler *create(const Project *project, + const Utils::FileName &source, + const Utils::FileNameList &targets) + = 0; + + void annouceCreation(const Project *project, + const Utils::FileName &source, + const Utils::FileNameList &targets); static QList extraCompilerFactories(); }; diff --git a/src/plugins/qtsupport/qscxmlcgenerator.cpp b/src/plugins/qtsupport/qscxmlcgenerator.cpp index f9e4c3c4555..7874cde57d0 100644 --- a/src/plugins/qtsupport/qscxmlcgenerator.cpp +++ b/src/plugins/qtsupport/qscxmlcgenerator.cpp @@ -149,6 +149,8 @@ ExtraCompiler *QScxmlcGeneratorFactory::create( const Project *project, const Utils::FileName &source, const Utils::FileNameList &targets) { + annouceCreation(project, source, targets); + return new QScxmlcGenerator(project, source, targets, this); } diff --git a/src/plugins/qtsupport/uicgenerator.cpp b/src/plugins/qtsupport/uicgenerator.cpp index a88619e521a..89e8713b22d 100644 --- a/src/plugins/qtsupport/uicgenerator.cpp +++ b/src/plugins/qtsupport/uicgenerator.cpp @@ -100,6 +100,8 @@ ExtraCompiler *UicGeneratorFactory::create(const Project *project, const Utils::FileName &source, const Utils::FileNameList &targets) { + annouceCreation(project, source, targets); + return new UicGenerator(project, source, targets, this); }