From 7666db896d093e450c18f6a6f12d7fa289fb789b Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Fri, 29 Sep 2017 14:41:09 +0200 Subject: 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 --- src/plugins/cpptools/cppmodelmanager.cpp | 120 ++++++++++++++++++++++++++++--- 1 file changed, 111 insertions(+), 9 deletions(-) (limited to 'src/plugins/cpptools/cppmodelmanager.cpp') 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 #include +#include #include #include #include @@ -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; REHash m_refactoringEngines; + + CppLocatorData m_locatorData; + std::unique_ptr m_locatorFilter; + std::unique_ptr m_classesFilter; + std::unique_ptr m_includesFilter; + std::unique_ptr m_functionsFilter; + std::unique_ptr m_symbolsFindFilter; + std::unique_ptr m_currentDocumentFilter; }; } // namespace Internal @@ -335,6 +350,50 @@ void CppModelManager::removeRefactoringEngine(RefactoringEngineType type) instance()->d->m_refactoringEngines.remove(type); } +template +static void setFilter(std::unique_ptr &filter, + std::unique_ptr &&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 &&filter) +{ + setFilter(d->m_locatorFilter, std::move(filter)); +} + +void CppModelManager::setClassesFilter(std::unique_ptr &&filter) +{ + setFilter(d->m_classesFilter, std::move(filter)); +} + +void CppModelManager::setIncludesFilter(std::unique_ptr &&filter) +{ + setFilter(d->m_includesFilter, std::move(filter)); +} + +void CppModelManager::setFunctionsFilter(std::unique_ptr &&filter) +{ + setFilter(d->m_functionsFilter, std::move(filter)); +} + +void CppModelManager::setSymbolsFindFilter(std::unique_ptr &&filter) +{ + setFilter(d->m_symbolsFindFilter, std::move(filter)); +} + +void CppModelManager::setCurrentDocumentFilter(std::unique_ptr &&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(&d->m_locatorData)); + setClassesFilter(std::make_unique(&d->m_locatorData)); + setIncludesFilter(std::make_unique()); + setFunctionsFilter(std::make_unique(&d->m_locatorData)); + setSymbolsFindFilter(std::make_unique(this)); + setCurrentDocumentFilter( + std::make_unique(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; } -- cgit v1.2.1