diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 3097d9da883..10dc2548fae 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -181,6 +181,11 @@ void ClangEditorDocumentProcessor::clearProjectPart() m_projectPart.clear(); } +Core::Id ClangEditorDocumentProcessor::diagnosticConfigId() const +{ + return m_diagnosticConfigId; +} + void ClangEditorDocumentProcessor::updateCodeWarnings( const QVector &diagnostics, const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic, @@ -442,6 +447,7 @@ public: } const QStringList &options() const { return m_options; } + const Core::Id &diagnosticConfigId() const { return m_diagnosticConfigId; } private: void addLanguageOptions() @@ -469,15 +475,19 @@ private: const CppTools::ClangDiagnosticConfigsModel configsModel( CppTools::codeModelSettings()->clangCustomDiagnosticConfigs()); if (configsModel.hasConfigWithId(warningConfigId)) { - m_options.append( - configsModel.configWithId(warningConfigId).commandLineWarnings()); + addDiagnosticOptionsForConfig(configsModel.configWithId(warningConfigId)); return; } } } - m_options.append( - CppTools::codeModelSettings()->clangDiagnosticConfig().commandLineWarnings()); + addDiagnosticOptionsForConfig(CppTools::codeModelSettings()->clangDiagnosticConfig()); + } + + void addDiagnosticOptionsForConfig(const CppTools::ClangDiagnosticConfig &diagnosticConfig) + { + m_diagnosticConfigId = diagnosticConfig.id(); + m_options.append(diagnosticConfig.commandLineWarnings()); } void addXclangArg(const QString &argName, const QString &argValue = QString()) @@ -541,6 +551,7 @@ private: const QString &m_filePath; const CppTools::ProjectPart &m_projectPart; + Core::Id m_diagnosticConfigId; QStringList m_options; }; } // namespace @@ -563,6 +574,7 @@ void ClangEditorDocumentProcessor::registerTranslationUnitForEditor( } const FileOptionsBuilder fileOptions(filePath(), projectPart); + m_diagnosticConfigId = fileOptions.diagnosticConfigId(); m_communicator.registerTranslationUnitsForEditor( {fileContainerWithOptionsAndDocumentContent(projectPart, fileOptions.options())}); ClangCodeModel::Utils::setLastSentDocumentRevision(filePath(), revision()); diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index 67ef0bc8a5d..8715bbad082 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -28,6 +28,7 @@ #include "clangdiagnosticmanager.h" #include "clangeditordocumentparser.h" +#include #include #include @@ -67,6 +68,8 @@ public: CppTools::ProjectPart::Ptr projectPart() const; void clearProjectPart(); + Core::Id diagnosticConfigId() const; + void updateCodeWarnings(const QVector &diagnostics, const ClangBackEnd::DiagnosticContainer &firstHeaderErrorDiagnostic, uint documentRevision); @@ -120,6 +123,7 @@ private: BackendCommunicator &m_communicator; QSharedPointer m_parser; CppTools::ProjectPart::Ptr m_projectPart; + Core::Id m_diagnosticConfigId; bool m_isProjectFile = false; QFutureWatcher m_parserWatcher; QTimer m_updateTranslationUnitTimer; diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 26b01872bf5..6225894869e 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -34,8 +34,10 @@ #include "clangrefactoringengine.h" #include +#include #include #include +#include #include #include @@ -47,6 +49,7 @@ #include #include #include +#include #include #include @@ -107,6 +110,10 @@ ModelManagerSupportClang::ModelManagerSupportClang() connect(sessionManager, &ProjectExplorer::SessionManager::aboutToRemoveProject, this, &ModelManagerSupportClang::onAboutToRemoveProject); + CppTools::CppCodeModelSettings *settings = CppTools::codeModelSettings().data(); + connect(settings, &CppTools::CppCodeModelSettings::clangDiagnosticConfigsInvalidated, + this, &ModelManagerSupportClang::onDiagnosticConfigsInvalidated); + m_communicator.registerFallbackProjectPart(); } @@ -344,11 +351,41 @@ void ModelManagerSupportClang::onTextMarkContextMenuRequested(TextEditor::TextEd } } +using ClangEditorDocumentProcessors = QVector; +static ClangEditorDocumentProcessors clangProcessors() +{ + ClangEditorDocumentProcessors result; + foreach (auto *editorDocument, cppModelManager()->cppEditorDocuments()) + result.append(qobject_cast(editorDocument->processor())); + + return result; +} + +static ClangEditorDocumentProcessors +clangProcessorsWithProject(const ProjectExplorer::Project *project) +{ + return ::Utils::filtered(clangProcessors(), [project](ClangEditorDocumentProcessor *p) { + return p->hasProjectPart() && p->projectPart()->project == project; + }); +} + +static void updateProcessors(const ClangEditorDocumentProcessors &processors) +{ + CppTools::CppModelManager *modelManager = cppModelManager(); + for (ClangEditorDocumentProcessor *processor : processors) + modelManager->cppEditorDocument(processor->filePath())->resetProcessor(); + modelManager->updateCppEditorDocuments(/*projectsUpdated=*/ false); +} + void ModelManagerSupportClang::onProjectAdded(ProjectExplorer::Project *project) { QTC_ASSERT(!m_projectSettings.value(project), return); auto *settings = new Internal::ClangProjectSettings(project); + connect(settings, &Internal::ClangProjectSettings::changed, [project]() { + updateProcessors(clangProcessorsWithProject(project)); + }); + m_projectSettings.insert(project, settings); } @@ -379,21 +416,25 @@ void ModelManagerSupportClang::onProjectPartsRemoved(const QStringList &projectP } } -static QVector +static ClangEditorDocumentProcessors clangProcessorsWithDiagnosticConfig( + const QVector &configIds) +{ + return ::Utils::filtered(clangProcessors(), [configIds](ClangEditorDocumentProcessor *p) { + return configIds.contains(p->diagnosticConfigId()); + }); +} + +void ModelManagerSupportClang::onDiagnosticConfigsInvalidated(const QVector &configIds) +{ + updateProcessors(clangProcessorsWithDiagnosticConfig(configIds)); +} + +static ClangEditorDocumentProcessors clangProcessorsWithProjectParts(const QStringList &projectPartIds) { - QVector result; - - foreach (auto *editorDocument, cppModelManager()->cppEditorDocuments()) { - auto *processor = editorDocument->processor(); - auto *clangProcessor = qobject_cast(processor); - if (clangProcessor && clangProcessor->hasProjectPart()) { - if (projectPartIds.contains(clangProcessor->projectPart()->id())) - result.append(clangProcessor); - } - } - - return result; + return ::Utils::filtered(clangProcessors(), [projectPartIds](ClangEditorDocumentProcessor *p) { + return p->hasProjectPart() && projectPartIds.contains(p->projectPart()->id()); + }); } void ModelManagerSupportClang::unregisterTranslationUnitsWithProjectParts( diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h index d534ffbed89..d8c3e1c9176 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h @@ -40,7 +40,10 @@ class QMenu; class QWidget; QT_END_NAMESPACE -namespace Core { class IDocument; } +namespace Core { +class IDocument; +class Id; +} // namespace Core namespace TextEditor { class TextEditorWidget; } namespace CppTools { class FollowSymbolInterface; @@ -103,6 +106,8 @@ private: void onProjectPartsUpdated(ProjectExplorer::Project *project); void onProjectPartsRemoved(const QStringList &projectPartIds); + void onDiagnosticConfigsInvalidated(const QVector &configIds); + void unregisterTranslationUnitsWithProjectParts(const QStringList &projectPartIds); void connectTextDocumentToTranslationUnit(TextEditor::TextDocument *textDocument); diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.h b/src/plugins/cpptools/baseeditordocumentprocessor.h index d799c636b25..1b63cbd64dd 100644 --- a/src/plugins/cpptools/baseeditordocumentprocessor.h +++ b/src/plugins/cpptools/baseeditordocumentprocessor.h @@ -93,6 +93,8 @@ public: virtual QFuture requestFollowSymbol(int line, int column) = 0; virtual QFuture toolTipInfo(const QByteArray &codecName, int line, int column); + QString filePath() const { return m_filePath; } + public: using HeaderErrorDiagnosticWidgetCreator = std::function; @@ -117,7 +119,6 @@ protected: BaseEditorDocumentParser::UpdateParams updateParams); // Convenience - QString filePath() const { return m_filePath; } unsigned revision() const { return static_cast(m_textDocument->revision()); } QTextDocument *textDocument() const { return m_textDocument; }