aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Shambir <sergey.shambir.auto@gmail.com>2013-01-28 18:50:48 +0400
committerOswald Buddenhagen <oswald.buddenhagen@digia.com>2014-03-11 19:54:52 +0100
commit3649843c05337b5faff18f2667e177cf5599e444 (patch)
tree13a0e3d6064419111c25f25497b2c48016efdecd
parentfa76cbcaa2ce05cb4a60bda3564c1ba3d5959659 (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.cpp91
-rw-r--r--src/plugins/vcprojectmanager/vcproject.h5
-rw-r--r--src/plugins/vcprojectmanager/vcprojectmanager_dependencies.pri1
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