From 56f37f78b2883771a11f4ceeb596b77e55c218f7 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 15 Sep 2015 11:48:25 +0200 Subject: [PATCH] Clang: Speed up requesting diagnostics Register the translation unit and request diagnostics from the clangbackend as soon as the project part is determined. There is no reason to wait until the parser is finished for the highlighter. Change-Id: Iebccbf59ebd205389462dcee97363746fb651bb2 Reviewed-by: Erik Verbruggen --- .../clangcodemodel/clangcodemodelplugin.cpp | 5 +++++ .../clangcodemodel/clangcodemodelplugin.h | 2 ++ .../clangcodemodel/clangeditordocumentparser.cpp | 1 + .../clangcodemodel/clangeditordocumentparser.h | 3 +++ .../clangeditordocumentprocessor.cpp | 16 ++++++++++++---- .../clangeditordocumentprocessor.h | 3 ++- .../test/clangcodecompletion_test.cpp | 2 +- src/plugins/cpptools/cppprojects.h | 2 ++ 8 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp index b69366ee4c2..928b034387f 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp @@ -58,6 +58,11 @@ static void initializeTextMarks() Utils::Theme::ClangCodeModel_Error_TextMarkColor); } +ClangCodeModelPlugin::ClangCodeModelPlugin() +{ + qRegisterMetaType(); +} + bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *errorMessage) { Q_UNUSED(arguments) diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.h b/src/plugins/clangcodemodel/clangcodemodelplugin.h index 6a767d5b710..39d4ba6633c 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.h +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.h @@ -50,6 +50,8 @@ class ClangCodeModelPlugin: public ExtensionSystem::IPlugin Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QtCreatorPlugin" FILE "ClangCodeModel.json") public: + ClangCodeModelPlugin(); + bool initialize(const QStringList &arguments, QString *errorMessage); void extensionsInitialized(); diff --git a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp index 43a78680176..caeefd2267d 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp @@ -99,6 +99,7 @@ void ClangEditorDocumentParser::updateHelper(const BaseEditorDocumentParser::InM State state_ = state(); state_.projectPart = determineProjectPart(filePath(), configuration(), state_); setState(state_); + emit projectPartDetermined(state_.projectPart); // Determine message line arguments const QStringList options = createOptions(filePath(), state_.projectPart, true); diff --git a/src/plugins/clangcodemodel/clangeditordocumentparser.h b/src/plugins/clangcodemodel/clangeditordocumentparser.h index 4784d51672c..ef207749c27 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentparser.h +++ b/src/plugins/clangcodemodel/clangeditordocumentparser.h @@ -50,6 +50,9 @@ public: QList ifdefedOutBlocks() const; SemanticMarker::Ptr semanticMarker() const; +signals: + void projectPartDetermined(CppTools::ProjectPart::Ptr projectPart); + private: void updateHelper(const BaseEditorDocumentParser::InMemoryInfo &info) override; diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 43617439652..c4a75dfbba6 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -88,6 +88,9 @@ ClangEditorDocumentProcessor::ClangEditorDocumentProcessor( , m_semanticHighlighter(document) , m_builtinProcessor(document, /*enableSemanticHighlighter=*/ false) { + connect(m_parser.data(), &ClangEditorDocumentParser::projectPartDetermined, + this, &ClangEditorDocumentProcessor::onParserDeterminedProjectPart); + // Forwarding the semantic info from the builtin processor enables us to provide all // editor (widget) related features that are not yet implemented by the clang plugin. connect(&m_builtinProcessor, &CppTools::BuiltinEditorDocumentProcessor::cppDocumentUpdated, @@ -231,9 +234,10 @@ static bool isProjectPartLoadedOrIsFallback(CppTools::ProjectPart::Ptr projectPa && (projectPart->id().isEmpty() || ClangCodeModel::Utils::isProjectPartLoaded(projectPart)); } -void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor() +void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor( + CppTools::ProjectPart::Ptr projectPart) { - const CppTools::ProjectPart::Ptr projectPart = m_parser->projectPart(); + QTC_ASSERT(projectPart, return); if (isProjectPartLoadedOrIsFallback(projectPart)) { updateTranslationUnitForEditor(projectPart.data()); @@ -243,6 +247,12 @@ void ClangEditorDocumentProcessor::updateProjectPartAndTranslationUnitForEditor( } } +void ClangEditorDocumentProcessor::onParserDeterminedProjectPart( + CppTools::ProjectPart::Ptr projectPart) +{ + updateProjectPartAndTranslationUnitForEditor(projectPart); +} + void ClangEditorDocumentProcessor::onParserFinished() { if (revision() != m_parserRevision) @@ -254,8 +264,6 @@ void ClangEditorDocumentProcessor::onParserFinished() // Run semantic highlighter m_semanticHighlighter.run(); - - updateProjectPartAndTranslationUnitForEditor(); } void ClangEditorDocumentProcessor::updateTranslationUnitForEditor(CppTools::ProjectPart *projectPart) diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h index 4e29265aba7..575725e8738 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.h +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.h @@ -85,10 +85,11 @@ public: static ClangEditorDocumentProcessor *get(const QString &filePath); private slots: + void onParserDeterminedProjectPart(CppTools::ProjectPart::Ptr projectPart); void onParserFinished(); private: - void updateProjectPartAndTranslationUnitForEditor(); + void updateProjectPartAndTranslationUnitForEditor(CppTools::ProjectPart::Ptr projectPart); void updateTranslationUnitForEditor(CppTools::ProjectPart *projectPart); void requestDiagnostics(CppTools::ProjectPart *projectPart); void requestDiagnostics(); diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp index 84b0dc4d732..58a86051931 100644 --- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp +++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp @@ -1037,6 +1037,7 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile( CppTools::Tests::ProjectOpenerAndCloser projectManager; const CppTools::ProjectInfo projectInfo = projectManager.open(projectFilePath, true); QVERIFY(projectInfo.isValid()); + QVERIFY(monitorGeneratedUiFile.waitUntilGenerated()); // Open file with ui object const QString completionFile = testDir.absolutePath("mainwindow.cpp"); @@ -1046,7 +1047,6 @@ void ClangCodeCompletionTest::testCompleteProjectDependingCodeInGeneratedUiFile( QVERIFY(openSource.succeeded()); // ...and check comletions - QVERIFY(monitorGeneratedUiFile.waitUntilGenerated()); ProposalModel proposal = completionResults(openSource.editor()); QVERIFY(hasItem(proposal, "menuBar")); QVERIFY(hasItem(proposal, "statusBar")); diff --git a/src/plugins/cpptools/cppprojects.h b/src/plugins/cpptools/cppprojects.h index c994257fa49..dc6c841bf02 100644 --- a/src/plugins/cpptools/cppprojects.h +++ b/src/plugins/cpptools/cppprojects.h @@ -247,4 +247,6 @@ private: } // namespace CppTools +Q_DECLARE_METATYPE(CppTools::ProjectPart::Ptr) + #endif // CPPPROJECTPART_H