From 1fcba8df5fcdd8ff43519b7a3d4955b3f38910f3 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 30 Oct 2014 16:17:18 +0100 Subject: [PATCH] QbsProject: Provide compiler call data ...so that analyzers can make use of it. Change-Id: I9694535f02f631cac266c26b4f4c973a06c6c899 Reviewed-by: Christian Kandeler Reviewed-by: Fawzi Mohamed --- src/plugins/qbsprojectmanager/qbsproject.cpp | 49 ++++++++++++++++++-- src/plugins/qbsprojectmanager/qbsproject.h | 4 ++ 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index ae4592b7891..65e145f15a5 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -559,6 +559,7 @@ void QbsProject::updateAfterBuild() QTC_ASSERT(m_qbsProject.isValid(), return); m_projectData = m_qbsProject.projectData(); updateBuildTargetData(); + updateCppCompilerCallData(); } void QbsProject::registerQbsProjectParser(QbsProjectParser *p) @@ -682,9 +683,7 @@ void QbsProject::updateCppCodeModel() QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(activeTarget()->kit()); - CppTools::CppModelManager *modelmanager = - CppTools::CppModelManager::instance(); - + CppTools::CppModelManager *modelmanager = CppTools::CppModelManager::instance(); if (!modelmanager) return; @@ -780,8 +779,50 @@ void QbsProject::updateCppCodeModel() QtSupport::UiCodeModelManager::update(this, uiFiles); - // Register update the code model: + // Update the code model m_codeModelFuture = modelmanager->updateProjectInfo(pinfo); + m_codeModelProjectInfo = modelmanager->projectInfo(this); +} + +void QbsProject::updateCppCompilerCallData() +{ + CppTools::CppModelManager *modelManager = CppTools::CppModelManager::instance(); + QTC_ASSERT(m_codeModelProjectInfo == modelManager->projectInfo(this), return); + + CppTools::ProjectInfo::CompilerCallData data; + foreach (const qbs::ProductData &product, m_projectData.allProducts()) { + if (!product.isEnabled()) + continue; + + foreach (const qbs::GroupData &group, product.groups()) { + if (!group.isEnabled()) + continue; + + foreach (const QString &file, group.allFilePaths()) { + if (!CppTools::ProjectFile::isSource(CppTools::ProjectFile::classify(file))) + continue; + + qbs::ErrorInfo errorInfo; + const qbs::RuleCommandList ruleCommands + = m_qbsProject.ruleCommands(product, file, QLatin1String("obj"), &errorInfo); + if (errorInfo.hasError()) + continue; + + QList calls; + foreach (const qbs::RuleCommand &ruleCommand, ruleCommands) { + if (ruleCommand.type() == qbs::RuleCommand::ProcessCommandType) + calls << ruleCommand.arguments(); + } + + if (!calls.isEmpty()) + data.insert(file, calls); + } + } + } + + m_codeModelProjectInfo.setCompilerCallData(data); + const QFuture future = modelManager->updateProjectInfo(m_codeModelProjectInfo); + QTC_CHECK(future.isFinished()); // No reparse of files expected } void QbsProject::updateQmlJsCodeModel() diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 2d77c8e77f0..8a08a0ecb77 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -33,6 +33,8 @@ #include "qbsprojectmanager.h" +#include + #include #include #include @@ -134,6 +136,7 @@ private: void prepareForParsing(); void updateDocuments(const QSet &files); void updateCppCodeModel(); + void updateCppCompilerCallData(); void updateQmlJsCodeModel(); void updateApplicationTargets(); void updateDeploymentInfo(); @@ -161,6 +164,7 @@ private: } m_cancelStatus; QFuture m_codeModelFuture; + CppTools::ProjectInfo m_codeModelProjectInfo; QbsBuildConfiguration *m_currentBc;