forked from qt-creator/qt-creator
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user