diff options
author | Sergey Shambir <sergey.shambir.auto@gmail.com> | 2013-01-28 18:50:48 +0400 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@digia.com> | 2014-03-11 19:54:52 +0100 |
commit | 3649843c05337b5faff18f2667e177cf5599e444 (patch) | |
tree | 13a0e3d6064419111c25f25497b2c48016efdecd | |
parent | fa76cbcaa2ce05cb4a60bda3564c1ba3d5959659 (diff) |
VCProj: added integration with C++ code model.
VCProjectManager plugin now depends on CppTools.
Change-Id: I3b73b7f5ab5a6ecb2cd95fdc95f1e22744179842
Reviewed-by: Radovan Zivkovic <pivonroll@gmail.com>
-rw-r--r-- | src/plugins/vcprojectmanager/vcproject.cpp | 91 | ||||
-rw-r--r-- | src/plugins/vcprojectmanager/vcproject.h | 5 | ||||
-rw-r--r-- | src/plugins/vcprojectmanager/vcprojectmanager_dependencies.pri | 1 |
3 files changed, 82 insertions, 15 deletions
diff --git a/src/plugins/vcprojectmanager/vcproject.cpp b/src/plugins/vcprojectmanager/vcproject.cpp index 7716649a6e..989f2bc8c8 100644 --- a/src/plugins/vcprojectmanager/vcproject.cpp +++ b/src/plugins/vcprojectmanager/vcproject.cpp @@ -10,14 +10,18 @@ #include <coreplugin/icontext.h> #include <coreplugin/icore.h> -#include <projectexplorer/buildsteplist.h> +#include <cpptools/ModelManagerInterface.h> +#include <extensionsystem/pluginmanager.h> #include <projectexplorer/buildenvironmentwidget.h> -#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/buildsteplist.h> #include <projectexplorer/kit.h> +#include <projectexplorer/kitinformation.h> #include <projectexplorer/kitmanager.h> +#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/target.h> -#include <extensionsystem/pluginmanager.h> +#include <projectexplorer/toolchain.h> #include <utils/filesystemwatcher.h> +#include <utils/qtcassert.h> #include <QFileInfo> #include <QFileSystemWatcher> @@ -44,6 +48,11 @@ VcProject::VcProject(VcManager *projectManager, const QString &projectFilePath) connect(m_projectFileWatcher, SIGNAL(fileChanged(QString)), this, SLOT(reparse())); } +VcProject::~VcProject() +{ + m_codeModelFuture.cancel(); +} + QString VcProject::displayName() const { return m_rootNode->displayName(); @@ -109,6 +118,7 @@ void VcProject::reparse() delete projInfo; + updateCodeModels(); // TODO: can we (and is is important to) detect when the list really changed? emit fileListChanged(); } @@ -116,9 +126,72 @@ void VcProject::reparse() bool VcProject::fromMap(const QVariantMap &map) { loadBuildConfigurations(); + updateCodeModels(); return Project::fromMap(map); } +bool VcProject::setupTarget(ProjectExplorer::Target *t) +{ + VcProjectBuildConfigurationFactory *factory + = ExtensionSystem::PluginManager::instance()->getObject<VcProjectBuildConfigurationFactory>(); + VcProjectBuildConfiguration *bc = factory->create(t, Constants::VC_PROJECT_BC_ID, QLatin1String("vcproj")); + if (!bc) + return false; + + t->addBuildConfiguration(bc); + return true; +} + +/** + * @brief Visit folder node recursive and accumulate Source and Header files + */ +void VcProject::addCxxModelFiles(const FolderNode *node, QStringList &sourceFiles) +{ + foreach (const FileNode *file, node->fileNodes()) + if (file->fileType() == HeaderType || file->fileType() == SourceType) + sourceFiles += file->path(); + foreach (const FolderNode *subfolder, node->subFolderNodes()) + addCxxModelFiles(subfolder, sourceFiles); +} + +/** + * @brief Update editor Code Models + * + * Because only language with Code Model in QtCreator and support in VS is C++, + * this method updates C++ code model. + * VCProj doesn't support Qt, ObjectiveC and always uses c++11. + * + * @note Method should pass some flags for ClangCodeModel plugin: "-fms-extensions" + * and "-fdelayed-template-parsing", but no interface exists at this moment. + */ +void VcProject::updateCodeModels() +{ + typedef CPlusPlus::CppModelManagerInterface::ProjectPart ProjectPart; + + Kit *k = activeTarget() ? activeTarget()->kit() : KitManager::instance()->defaultKit(); + QTC_ASSERT(k, return); + ToolChain *tc = ToolChainKitInformation::toolChain(k); + CPlusPlus::CppModelManagerInterface *modelmanager = CPlusPlus::CppModelManagerInterface::instance(); + QTC_ASSERT(modelmanager, return); + CPlusPlus::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this); + + pinfo.clearProjectParts(); + ProjectPart::Ptr pPart(new ProjectPart()); + // VS 2005-2008 has poor c++11 support, see http://wiki.apache.org/stdcxx/C%2B%2B0xCompilerSupport + pPart->cxx11Enabled = false; + pPart->qtVersion = ProjectPart::NoQt; + pPart->defines += tc->predefinedMacros(QStringList()); // TODO: extract proper CXX flags and project defines + foreach (const HeaderPath &path, tc->systemHeaderPaths(Utils::FileName())) + if (path.kind() != HeaderPath::FrameworkHeaderPath) + pPart->includePaths += path.path(); + addCxxModelFiles(m_rootNode, pPart->sourceFiles); + if (!pPart->sourceFiles.isEmpty()) + pinfo.appendProjectPart(pPart); + + modelmanager->updateProjectInfo(pinfo); + m_codeModelFuture = modelmanager->updateSourceFiles(pPart->sourceFiles); +} + void VcProject::loadBuildConfigurations() { Kit *defaultKit = KitManager::instance()->defaultKit(); @@ -171,18 +244,6 @@ void VcProject::loadBuildConfigurations() addTarget(target); } } -bool VcProject::setupTarget(ProjectExplorer::Target *t) -{ - VcProjectBuildConfigurationFactory *factory - = ExtensionSystem::PluginManager::instance()->getObject<VcProjectBuildConfigurationFactory>(); - VcProjectBuildConfiguration *bc = factory->create(t, Constants::VC_PROJECT_BC_ID, QLatin1String("vcproj")); - if (!bc) - return false; - - t->addBuildConfiguration(bc); - return true; -} - VcProjectBuildSettingsWidget::VcProjectBuildSettingsWidget() { QFormLayout *f1 = new QFormLayout(this); diff --git a/src/plugins/vcprojectmanager/vcproject.h b/src/plugins/vcprojectmanager/vcproject.h index f327634b30..aea6b470dc 100644 --- a/src/plugins/vcprojectmanager/vcproject.h +++ b/src/plugins/vcprojectmanager/vcproject.h @@ -5,6 +5,7 @@ #include <projectexplorer/buildstep.h> #include <projectexplorer/project.h> +#include <QFuture> class QFileSystemWatcher; @@ -21,6 +22,7 @@ class VcProject : public ProjectExplorer::Project public: VcProject(VcManager *projectManager, const QString &projectFilePath); + ~VcProject(); QString displayName() const; Core::Id id() const; @@ -47,6 +49,8 @@ protected: bool setupTarget(ProjectExplorer::Target *t); private: + void addCxxModelFiles(const ProjectExplorer::FolderNode *node, QStringList &sourceFiles); + void updateCodeModels(); void loadBuildConfigurations(); VcManager *m_projectManager; @@ -55,6 +59,7 @@ private: VcProjectReader reader; QString m_name; QFileSystemWatcher *m_projectFileWatcher; + QFuture<void> m_codeModelFuture; }; class VcProjectBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget diff --git a/src/plugins/vcprojectmanager/vcprojectmanager_dependencies.pri b/src/plugins/vcprojectmanager/vcprojectmanager_dependencies.pri index 2ed5387255..b089e9d836 100644 --- a/src/plugins/vcprojectmanager/vcprojectmanager_dependencies.pri +++ b/src/plugins/vcprojectmanager/vcprojectmanager_dependencies.pri @@ -1,4 +1,5 @@ QTC_PLUGIN_NAME = VcProjectManager QTC_PLUGIN_DEPENDS += \ coreplugin \ + cpptools \ projectexplorer |