diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2017-09-29 14:41:09 +0200 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-01-17 11:33:24 +0000 |
commit | 7666db896d093e450c18f6a6f12d7fa289fb789b (patch) | |
tree | 22e9c1eb4ca762d60b0ab37d0c56644596a67fca | |
parent | 58494877fddb8ae923aa8dc311412afbe5433a93 (diff) | |
download | qt-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.h | 6 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 120 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.h | 17 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolsplugin.cpp | 32 |
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 |