From 5c554c0de9fd9115dbcfa010353640b11e349c6c Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Mon, 25 Sep 2017 16:41:17 +0200 Subject: CppTools: add multiple refactoring engines support Make model manager able to select the most functional refactoring engine from the available ones. Change-Id: I74031c910706fd694a0a7def022531501f1ea005 Reviewed-by: Nikolai Kosjar --- src/plugins/cpptools/cppmodelmanager.cpp | 47 ++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 8 deletions(-) (limited to 'src/plugins/cpptools/cppmodelmanager.cpp') diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index da45301782..633ad7a747 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -119,6 +119,9 @@ protected: #endif // QTCREATOR_WITH_DUMP_AST namespace CppTools { + +using REType = RefactoringEngineType; + namespace Internal { static QMutex m_instanceMutex; @@ -167,7 +170,8 @@ public: // Refactoring CppRefactoringEngine m_builtInRefactoringEngine; - RefactoringEngineInterface *m_refactoringEngine { &m_builtInRefactoringEngine }; + using REHash = QMap; + REHash m_refactoringEngines {{REType::BuiltIn, &m_builtInRefactoringEngine}}; }; } // namespace Internal @@ -267,17 +271,44 @@ QString CppModelManager::editorConfigurationFileName() return QLatin1String(""); } -void CppModelManager::setRefactoringEngine(RefactoringEngineInterface *refactoringEngine) +static RefactoringEngineInterface *getRefactoringEngine( + CppModelManagerPrivate::REHash &engines, bool excludeClangCodeModel = true) +{ + RefactoringEngineInterface *currentEngine = engines[REType::BuiltIn]; + if (!excludeClangCodeModel && engines.find(REType::ClangCodeModel) != engines.end()) { + currentEngine = engines[REType::ClangCodeModel]; + } else if (engines.find(REType::ClangRefactoring) != engines.end()) { + RefactoringEngineInterface *engine = engines[REType::ClangRefactoring]; + if (engine->isRefactoringEngineAvailable()) + currentEngine = engine; + } + return currentEngine; +} + +void CppModelManager::startLocalRenaming(const CursorInEditor &data, + CppTools::ProjectPart *projectPart, + RenameCallback &&renameSymbolsCallback) +{ + RefactoringEngineInterface *engine = getRefactoringEngine(instance()->d->m_refactoringEngines, + false); + engine->startLocalRenaming(data, projectPart, std::move(renameSymbolsCallback)); +} + +void CppModelManager::startGlobalRenaming(const CursorInEditor &data) +{ + RefactoringEngineInterface *engine = getRefactoringEngine(instance()->d->m_refactoringEngines); + engine->startGlobalRenaming(data); +} + +void CppModelManager::addRefactoringEngine(RefactoringEngineType type, + RefactoringEngineInterface *refactoringEngine) { - if (refactoringEngine) - instance()->d->m_refactoringEngine = refactoringEngine; - else - instance()->d->m_refactoringEngine = &instance()->d->m_builtInRefactoringEngine; + instance()->d->m_refactoringEngines[type] = refactoringEngine; } -RefactoringEngineInterface &CppModelManager::refactoringEngine() +void CppModelManager::removeRefactoringEngine(RefactoringEngineType type) { - return *instance()->d->m_refactoringEngine; + instance()->d->m_refactoringEngines.remove(type); } FollowSymbolInterface &CppModelManager::followSymbolInterface() const -- cgit v1.2.1