From abdbae33083164b4021884fee500cf325ffc8994 Mon Sep 17 00:00:00 2001 From: Przemyslaw Gorszkowski Date: Tue, 5 Nov 2013 14:02:13 +0100 Subject: [PATCH] CppEditor: "Include Hierarchy": using snapshot from snapshotUpdater For "includes" we should use snapshot from "SnapshotUpdater"(project specific snapshot, not global snapshot) instead of "global" snapshot. The snapshot of the editor's SnapshotUpdater contains the documents parsed with the appropriate include paths/defines etc. and should therefore be used for the include hierarchy. Change-Id: I6bbaf5040536b771d32697aad1db364758ff8382 Reviewed-by: Nikolai Kosjar --- src/plugins/cppeditor/cppincludehierarchy.cpp | 24 +++++++++++++---- src/plugins/cppeditor/cppincludehierarchy.h | 3 +++ .../cppeditor/cppincludehierarchy_test.cpp | 15 +++++++++-- .../cppeditor/cppincludehierarchymodel.cpp | 27 ++++++++++++------- .../cppeditor/cppincludehierarchymodel.h | 8 +++++- 5 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/plugins/cppeditor/cppincludehierarchy.cpp b/src/plugins/cppeditor/cppincludehierarchy.cpp index 15a2429f824..3efde4c154c 100644 --- a/src/plugins/cppeditor/cppincludehierarchy.cpp +++ b/src/plugins/cppeditor/cppincludehierarchy.cpp @@ -36,6 +36,7 @@ #include "cppincludehierarchymodel.h" #include "cppincludehierarchytreeview.h" +#include #include #include @@ -89,7 +90,8 @@ CppIncludeHierarchyWidget::CppIncludeHierarchyWidget() : m_treeView(0), m_model(0), m_delegate(0), - m_includeHierarchyInfoLabel(0) + m_includeHierarchyInfoLabel(0), + m_editor(0) { m_inspectedFile = new CppIncludeLabel(this); m_inspectedFile->setMargin(5); @@ -118,6 +120,9 @@ CppIncludeHierarchyWidget::CppIncludeHierarchyWidget() : setLayout(layout); connect(CppEditorPlugin::instance(), SIGNAL(includeHierarchyRequested()), SLOT(perform())); + connect(Core::EditorManager::instance(), SIGNAL(editorsClosed(QList)), + this, SLOT(editorsClosed(QList))); + } CppIncludeHierarchyWidget::~CppIncludeHierarchyWidget() @@ -128,15 +133,16 @@ void CppIncludeHierarchyWidget::perform() { showNoIncludeHierarchyLabel(); - CPPEditor *editor = qobject_cast(Core::EditorManager::currentEditor()); - if (!editor) + m_editor = qobject_cast(Core::EditorManager::currentEditor()); + if (!m_editor) return; - CPPEditorWidget *widget = qobject_cast(editor->widget()); + + CPPEditorWidget *widget = qobject_cast(m_editor->widget()); if (!widget) return; m_model->clear(); - m_model->buildHierarchy(widget->editorDocument()->filePath()); + m_model->buildHierarchy(m_editor, widget->editorDocument()->filePath()); if (m_model->isEmpty()) return; @@ -162,6 +168,14 @@ void CppIncludeHierarchyWidget::onItemClicked(const QModelIndex &index) Constants::CPPEDITOR_ID); } +void CppIncludeHierarchyWidget::editorsClosed(QList editors) +{ + foreach (Core::IEditor *editor, editors) { + if (m_editor == editor) + perform(); + } +} + void CppIncludeHierarchyWidget::showNoIncludeHierarchyLabel() { m_inspectedFile->hide(); diff --git a/src/plugins/cppeditor/cppincludehierarchy.h b/src/plugins/cppeditor/cppincludehierarchy.h index fd8d31cbde1..cb7720db5ea 100644 --- a/src/plugins/cppeditor/cppincludehierarchy.h +++ b/src/plugins/cppeditor/cppincludehierarchy.h @@ -55,6 +55,7 @@ class FileName; namespace CppEditor { namespace Internal { +class CPPEditor; class CPPEditorWidget; class CppInclude; class CppIncludeLabel; @@ -73,6 +74,7 @@ public slots: private slots: void onItemClicked(const QModelIndex &index); + void editorsClosed(QList editors); private: void showNoIncludeHierarchyLabel(); @@ -84,6 +86,7 @@ private: Utils::AnnotatedItemDelegate *m_delegate; CppIncludeLabel *m_inspectedFile; QLabel *m_includeHierarchyInfoLabel; + CPPEditor *m_editor; }; // @todo: Pretty much the same design as the OutlineWidgetStack. Maybe we can generalize the diff --git a/src/plugins/cppeditor/cppincludehierarchy_test.cpp b/src/plugins/cppeditor/cppincludehierarchy_test.cpp index e52273743c5..7e641e74944 100644 --- a/src/plugins/cppeditor/cppincludehierarchy_test.cpp +++ b/src/plugins/cppeditor/cppincludehierarchy_test.cpp @@ -30,6 +30,8 @@ #include "cppeditorplugin.h" #include "cppincludehierarchymodel.h" +#include +#include #include #include @@ -47,6 +49,7 @@ class TestCase public: TestCase(const QList &sourceList) : m_cmm(CppModelManagerInterface::instance()) + , m_editor(0) { QStringList filePaths; const int sourceListSize = sourceList.size(); @@ -82,22 +85,30 @@ public: ~TestCase() { + // Close editor + if (m_editor) + Core::EditorManager::closeEditor(m_editor, false); + m_cmm->GC(); QVERIFY(m_cmm->snapshot().isEmpty()); } - void run(int includesCount, int includedByCount) const + void run(int includesCount, int includedByCount) { const QString fileName = QDir::tempPath() + QLatin1String("/file1.h"); + m_editor = qobject_cast(Core::EditorManager::openEditor(fileName)); + QVERIFY(m_editor); + CppIncludeHierarchyModel model(0); - model.buildHierarchy(fileName); + model.buildHierarchy(m_editor, fileName); QCOMPARE(model.rowCount(model.index(0, 0)), includesCount); QCOMPARE(model.rowCount(model.index(1, 0)), includedByCount); } private: CppModelManagerInterface *m_cmm; + CPPEditor *m_editor; }; } diff --git a/src/plugins/cppeditor/cppincludehierarchymodel.cpp b/src/plugins/cppeditor/cppincludehierarchymodel.cpp index 7709bed2d57..06fe941cd9a 100644 --- a/src/plugins/cppeditor/cppincludehierarchymodel.cpp +++ b/src/plugins/cppeditor/cppincludehierarchymodel.cpp @@ -35,10 +35,12 @@ #include #include #include +#include #include using namespace CPlusPlus; +using namespace CppTools; namespace CppEditor { namespace Internal { @@ -48,7 +50,7 @@ CppIncludeHierarchyModel::CppIncludeHierarchyModel(QObject *parent) , m_rootItem(new CppIncludeHierarchyItem(QString())) , m_includesItem(new CppIncludeHierarchyItem(tr("Includes"), m_rootItem)) , m_includedByItem(new CppIncludeHierarchyItem(tr("Included by"), m_rootItem)) - + , m_editor(0) { m_rootItem->appendChild(m_includesItem); m_rootItem->appendChild(m_includedByItem); @@ -199,6 +201,15 @@ void CppIncludeHierarchyModel::clear() endResetModel(); } +void CppIncludeHierarchyModel::buildHierarchy(CPPEditor *editor, const QString &filePath) +{ + m_editor = editor; + beginResetModel(); + buildHierarchyIncludes(filePath); + buildHierarchyIncludedBy(filePath); + endResetModel(); +} + bool CppIncludeHierarchyModel::hasChildren(const QModelIndex &parent) const { if (!parent.isValid()) @@ -210,14 +221,6 @@ bool CppIncludeHierarchyModel::hasChildren(const QModelIndex &parent) const return parentItem->hasChildren(); } -void CppIncludeHierarchyModel::buildHierarchy(const QString &filePath) -{ - beginResetModel(); - buildHierarchyIncludes(filePath); - buildHierarchyIncludedBy(filePath); - endResetModel(); -} - bool CppIncludeHierarchyModel::isEmpty() const { return !m_includesItem->hasChildren() && !m_includedByItem->hasChildren(); @@ -233,7 +236,11 @@ void CppIncludeHierarchyModel::buildHierarchyIncludes_helper(const QString &file CppIncludeHierarchyItem *parent, QSet *cyclic, bool recursive) { - const Snapshot &snapshot = CppTools::CppModelManagerInterface::instance()->snapshot(); + if (!m_editor) + return; + + CppModelManagerInterface *cppMM = CppModelManagerInterface::instance(); + const Snapshot &snapshot = cppMM->cppEditorSupport(m_editor)->snapshotUpdater()->snapshot(); Document::Ptr doc = snapshot.document(filePath); if (!doc) return; diff --git a/src/plugins/cppeditor/cppincludehierarchymodel.h b/src/plugins/cppeditor/cppincludehierarchymodel.h index cc9cbef050d..afb4c7ceb83 100644 --- a/src/plugins/cppeditor/cppincludehierarchymodel.h +++ b/src/plugins/cppeditor/cppincludehierarchymodel.h @@ -41,9 +41,14 @@ enum ItemRole { } // Anonymous +namespace Core { +class IEditor; +} + namespace CppEditor { namespace Internal { +class CPPEditor; class CppIncludeHierarchyItem; class CppIncludeHierarchyModel : public QAbstractItemModel @@ -63,7 +68,7 @@ public: bool hasChildren(const QModelIndex &parent) const; void clear(); - void buildHierarchy(const QString &filePath); + void buildHierarchy(CPPEditor *editor, const QString &filePath); bool isEmpty() const; private: @@ -77,6 +82,7 @@ private: CppIncludeHierarchyItem *m_rootItem; CppIncludeHierarchyItem *m_includesItem; CppIncludeHierarchyItem *m_includedByItem; + CPPEditor *m_editor; }; } // namespace Internal