summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2017-09-29 14:41:09 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2018-01-17 11:33:24 +0000
commit7666db896d093e450c18f6a6f12d7fa289fb789b (patch)
tree22e9c1eb4ca762d60b0ab37d0c56644596a67fca
parent58494877fddb8ae923aa8dc311412afbe5433a93 (diff)
downloadqt-creator-7666db896d093e450c18f6a6f12d7fa289fb789b.tar.gz
CppTools: move locators ownership to ModelManager
Move locator and find filters ownership and initialization to ModelManager. Initialize builtin filters by default and provide methods to set them from plugins. Change-Id: I4cc82ecff3415329a5f97b1be9dcc45e6103bf5a Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r--src/plugins/cpptools/cpplocatordata.h6
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp120
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h17
-rw-r--r--src/plugins/cpptools/cpptoolsplugin.cpp32
4 files changed, 130 insertions, 45 deletions
diff --git a/src/plugins/cpptools/cpplocatordata.h b/src/plugins/cpptools/cpplocatordata.h
index 0f28318ec7..d133bc9cc6 100644
--- a/src/plugins/cpptools/cpplocatordata.h
+++ b/src/plugins/cpptools/cpplocatordata.h
@@ -34,8 +34,6 @@
#include <QHash>
-#include <functional>
-
namespace CppTools {
namespace Internal {
@@ -46,9 +44,9 @@ class CppLocatorData : public QObject
{
Q_OBJECT
- // Only one instance, created by the CppToolsPlugin.
+ // Only one instance, created by the CppModelManager.
CppLocatorData();
- friend class Internal::CppToolsPlugin;
+ friend class Internal::CppModelManagerPrivate;
public:
void filterAllFiles(IndexItem::Visitor func) const
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index f1b1d2c2bd..5ad004b76c 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -28,9 +28,15 @@
#include "abstracteditorsupport.h"
#include "baseeditordocumentprocessor.h"
#include "builtinindexingsupport.h"
+#include "cppclassesfilter.h"
#include "cppcodemodelinspectordumper.h"
+#include "cppcurrentdocumentfilter.h"
#include "cppfindreferences.h"
+#include "cppfunctionsfilter.h"
+#include "cppincludesfilter.h"
#include "cppindexingsupport.h"
+#include "cpplocatordata.h"
+#include "cpplocatorfilter.h"
#include "cppmodelmanagersupportinternal.h"
#include "cpprefactoringchanges.h"
#include "cpprefactoringengine.h"
@@ -40,10 +46,12 @@
#include "cpptoolsreuse.h"
#include "editordocumenthandle.h"
#include "symbolfinder.h"
+#include "symbolsfindfilter.h"
#include "followsymbolinterface.h"
#include <coreplugin/documentmanager.h>
#include <coreplugin/icore.h>
+#include <coreplugin/vcsmanager.h>
#include <coreplugin/progressmanager/progressmanager.h>
#include <coreplugin/editormanager/editormanager.h>
#include <texteditor/textdocument.h>
@@ -124,7 +132,6 @@ using REType = RefactoringEngineType;
namespace Internal {
-static QMutex m_instanceMutex;
static CppModelManager *m_instance;
class CppModelManagerPrivate
@@ -171,6 +178,14 @@ public:
// Refactoring
using REHash = QMap<REType, RefactoringEngineInterface *>;
REHash m_refactoringEngines;
+
+ CppLocatorData m_locatorData;
+ std::unique_ptr<Core::ILocatorFilter> m_locatorFilter;
+ std::unique_ptr<Core::ILocatorFilter> m_classesFilter;
+ std::unique_ptr<Core::ILocatorFilter> m_includesFilter;
+ std::unique_ptr<Core::ILocatorFilter> m_functionsFilter;
+ std::unique_ptr<Core::IFindFilter> m_symbolsFindFilter;
+ std::unique_ptr<Core::ILocatorFilter> m_currentDocumentFilter;
};
} // namespace Internal
@@ -335,6 +350,50 @@ void CppModelManager::removeRefactoringEngine(RefactoringEngineType type)
instance()->d->m_refactoringEngines.remove(type);
}
+template<class FilterClass>
+static void setFilter(std::unique_ptr<FilterClass> &filter,
+ std::unique_ptr<FilterClass> &&newFilter)
+{
+ if (!ExtensionSystem::PluginManager::instance())
+ return;
+ if (filter)
+ ExtensionSystem::PluginManager::removeObject(filter.get());
+ if (!newFilter)
+ return;
+ filter = std::move(newFilter);
+ ExtensionSystem::PluginManager::addObject(filter.get());
+}
+
+void CppModelManager::setLocatorFilter(std::unique_ptr<Core::ILocatorFilter> &&filter)
+{
+ setFilter(d->m_locatorFilter, std::move(filter));
+}
+
+void CppModelManager::setClassesFilter(std::unique_ptr<Core::ILocatorFilter> &&filter)
+{
+ setFilter(d->m_classesFilter, std::move(filter));
+}
+
+void CppModelManager::setIncludesFilter(std::unique_ptr<Core::ILocatorFilter> &&filter)
+{
+ setFilter(d->m_includesFilter, std::move(filter));
+}
+
+void CppModelManager::setFunctionsFilter(std::unique_ptr<Core::ILocatorFilter> &&filter)
+{
+ setFilter(d->m_functionsFilter, std::move(filter));
+}
+
+void CppModelManager::setSymbolsFindFilter(std::unique_ptr<Core::IFindFilter> &&filter)
+{
+ setFilter(d->m_symbolsFindFilter, std::move(filter));
+}
+
+void CppModelManager::setCurrentDocumentFilter(std::unique_ptr<Core::ILocatorFilter> &&filter)
+{
+ setFilter(d->m_currentDocumentFilter, std::move(filter));
+}
+
FollowSymbolInterface &CppModelManager::followSymbolInterface() const
{
return d->m_activeModelManagerSupport->followSymbolInterface();
@@ -369,14 +428,56 @@ void CppModelManager::updateModifiedSourceFiles()
CppModelManager *CppModelManager::instance()
{
- if (m_instance)
- return m_instance;
+ QTC_ASSERT(m_instance, return nullptr;);
+ return m_instance;
+}
- QMutexLocker locker(&m_instanceMutex);
- if (!m_instance)
- m_instance = new CppModelManager;
+void CppModelManager::resetFilters()
+{
+ setLocatorFilter();
+ setClassesFilter();
+ setIncludesFilter();
+ setFunctionsFilter();
+ setSymbolsFindFilter();
+ setCurrentDocumentFilter();
+}
- return m_instance;
+void CppModelManager::createCppModelManager(Internal::CppToolsPlugin *parent,
+ Internal::StringTable &stringTable)
+{
+ QTC_ASSERT(!m_instance, return;);
+ m_instance = new CppModelManager();
+ m_instance->initCppTools(stringTable);
+ m_instance->setParent(parent);
+}
+
+void CppModelManager::initCppTools(Internal::StringTable &stringTable)
+{
+ // Objects
+ connect(Core::VcsManager::instance(), &Core::VcsManager::repositoryChanged,
+ this, &CppModelManager::updateModifiedSourceFiles);
+ connect(Core::DocumentManager::instance(), &Core::DocumentManager::filesChangedInternally,
+ [this](const QStringList &files) {
+ updateSourceFiles(files.toSet());
+ });
+
+ connect(this, &CppModelManager::documentUpdated,
+ &d->m_locatorData, &CppLocatorData::onDocumentUpdated);
+
+ connect(this, &CppModelManager::aboutToRemoveFiles,
+ &d->m_locatorData, &CppLocatorData::onAboutToRemoveFiles);
+
+ ExtensionSystem::PluginManager *pluginManager = ExtensionSystem::PluginManager::instance();
+ QTC_ASSERT(pluginManager, return;);
+
+ // Set up builtin filters
+ setLocatorFilter(std::make_unique<CppLocatorFilter>(&d->m_locatorData));
+ setClassesFilter(std::make_unique<CppClassesFilter>(&d->m_locatorData));
+ setIncludesFilter(std::make_unique<CppIncludesFilter>());
+ setFunctionsFilter(std::make_unique<CppFunctionsFilter>(&d->m_locatorData));
+ setSymbolsFindFilter(std::make_unique<SymbolsFindFilter>(this));
+ setCurrentDocumentFilter(
+ std::make_unique<Internal::CppCurrentDocumentFilter>(this, stringTable));
}
void CppModelManager::initializeBuiltinModelManagerSupport()
@@ -388,8 +489,8 @@ void CppModelManager::initializeBuiltinModelManagerSupport()
&d->m_activeModelManagerSupport->refactoringEngineInterface();
}
-CppModelManager::CppModelManager(QObject *parent)
- : CppModelManagerBase(parent), d(new CppModelManagerPrivate)
+CppModelManager::CppModelManager()
+ : CppModelManagerBase(nullptr), d(new CppModelManagerPrivate)
{
d->m_indexingSupporter = 0;
d->m_enableGC = true;
@@ -438,6 +539,7 @@ CppModelManager::CppModelManager(QObject *parent)
CppModelManager::~CppModelManager()
{
delete d->m_internalIndexingSupport;
+ resetFilters();
delete d;
}
diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h
index d8b8d2f192..1d5ee280c4 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -31,6 +31,7 @@
#include "projectinfo.h"
#include "projectpart.h"
#include "projectpartheaderpath.h"
+#include "stringtable.h"
#include <cplusplus/cppmodelmanagerbase.h>
@@ -41,6 +42,8 @@
namespace Core {
class IDocument;
class IEditor;
+class ILocatorFilter;
+class IFindFilter;
}
namespace CPlusPlus { class LookupContext; }
namespace ProjectExplorer { class Project; }
@@ -64,6 +67,7 @@ class WorkingCopy;
namespace Internal {
class CppSourceProcessor;
class CppModelManagerPrivate;
+class CppToolsPlugin;
}
namespace Tests {
@@ -86,10 +90,12 @@ public:
typedef CPlusPlus::Document Document;
public:
- CppModelManager(QObject *parent = 0);
+ CppModelManager();
~CppModelManager();
static CppModelManager *instance();
+ static void createCppModelManager(Internal::CppToolsPlugin *parent,
+ Internal::StringTable &stringTable);
// Documented in source file.
enum ProgressNotificationMode {
@@ -208,6 +214,13 @@ public:
RefactoringEngineInterface *refactoringEngine);
static void removeRefactoringEngine(RefactoringEngineType type);
+ void setLocatorFilter(std::unique_ptr<Core::ILocatorFilter> &&filter = nullptr);
+ void setClassesFilter(std::unique_ptr<Core::ILocatorFilter> &&filter = nullptr);
+ void setIncludesFilter(std::unique_ptr<Core::ILocatorFilter> &&filter = nullptr);
+ void setFunctionsFilter(std::unique_ptr<Core::ILocatorFilter> &&filter = nullptr);
+ void setSymbolsFindFilter(std::unique_ptr<Core::IFindFilter> &&filter = nullptr);
+ void setCurrentDocumentFilter(std::unique_ptr<Core::ILocatorFilter> &&filter = nullptr);
+
void renameIncludes(const QString &oldFileName, const QString &newFileName);
signals:
@@ -260,6 +273,8 @@ private:
ProjectExplorer::Macros internalDefinedMacros() const;
void dumpModelManagerConfiguration(const QString &logFileId);
+ void initCppTools(Internal::StringTable &stringTable);
+ void resetFilters();
private:
Internal::CppModelManagerPrivate *d;
diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp
index f344ff871e..c79881cc67 100644
--- a/src/plugins/cpptools/cpptoolsplugin.cpp
+++ b/src/plugins/cpptools/cpptoolsplugin.cpp
@@ -28,18 +28,11 @@
#include "cppfilesettingspage.h"
#include "cppcodemodelsettingspage.h"
#include "cppcodestylesettingspage.h"
-#include "cppclassesfilter.h"
-#include "cppfunctionsfilter.h"
-#include "cppcurrentdocumentfilter.h"
#include "cppmodelmanager.h"
-#include "cpplocatorfilter.h"
-#include "symbolsfindfilter.h"
#include "cpptoolsjsextension.h"
#include "cpptoolssettings.h"
#include "cpptoolsreuse.h"
#include "cppprojectfile.h"
-#include "cpplocatordata.h"
-#include "cppincludesfilter.h"
#include "cpptoolsbridge.h"
#include "projectinfo.h"
#include "cpptoolsbridgeqtcreatorimplementation.h"
@@ -141,39 +134,16 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error)
Q_UNUSED(arguments)
Q_UNUSED(error)
- CppModelManager::instance()->setParent(this);
+ CppModelManager::createCppModelManager(this, m_stringTable);
m_settings = new CppToolsSettings(this); // force registration of cpp tools settings
- // Objects
- CppModelManager *modelManager = CppModelManager::instance();
- connect(VcsManager::instance(), &VcsManager::repositoryChanged,
- modelManager, &CppModelManager::updateModifiedSourceFiles);
- connect(DocumentManager::instance(), &DocumentManager::filesChangedInternally,
- [=](const QStringList &files) {
- modelManager->updateSourceFiles(files.toSet());
- });
-
m_codeModelSettings->fromSettings(ICore::settings());
JsExpander::registerQObjectForJs(QLatin1String("Cpp"), new CppToolsJsExtension);
- CppLocatorData *locatorData = new CppLocatorData;
- connect(modelManager, &CppModelManager::documentUpdated,
- locatorData, &CppLocatorData::onDocumentUpdated);
-
- connect(modelManager, &CppModelManager::aboutToRemoveFiles,
- locatorData, &CppLocatorData::onAboutToRemoveFiles);
-
- addAutoReleasedObject(locatorData);
- addAutoReleasedObject(new CppLocatorFilter(locatorData));
- addAutoReleasedObject(new CppClassesFilter(locatorData));
- addAutoReleasedObject(new CppIncludesFilter);
- addAutoReleasedObject(new CppFunctionsFilter(locatorData));
- addAutoReleasedObject(new CppCurrentDocumentFilter(modelManager, m_stringTable));
addAutoReleasedObject(new CppFileSettingsPage(m_fileSettings));
addAutoReleasedObject(new CppCodeModelSettingsPage(m_codeModelSettings));
- addAutoReleasedObject(new SymbolsFindFilter(modelManager));
addAutoReleasedObject(new CppCodeStyleSettingsPage);
// Menus