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>
This commit is contained in:
Ivan Donchevskii
2017-09-29 14:41:09 +02:00
parent 58494877fd
commit 7666db896d
4 changed files with 131 additions and 46 deletions

View File

@@ -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

View File

@@ -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,16 +428,58 @@ void CppModelManager::updateModifiedSourceFiles()
CppModelManager *CppModelManager::instance()
{
if (m_instance)
return m_instance;
QMutexLocker locker(&m_instanceMutex);
if (!m_instance)
m_instance = new CppModelManager;
QTC_ASSERT(m_instance, return nullptr;);
return m_instance;
}
void CppModelManager::resetFilters()
{
setLocatorFilter();
setClassesFilter();
setIncludesFilter();
setFunctionsFilter();
setSymbolsFindFilter();
setCurrentDocumentFilter();
}
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()
{
d->m_builtinModelManagerSupport
@@ -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;
}

View File

@@ -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;

View File

@@ -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