diff --git a/src/libs/clangsupport/refactoringserverinterface.h b/src/libs/clangsupport/refactoringserverinterface.h index a4a3b1e6f4ac0355b3fd8765d2677cba34e86e7a..09634802dae48ca7167f1ff157d520e8ffddb73d 100644 --- a/src/libs/clangsupport/refactoringserverinterface.h +++ b/src/libs/clangsupport/refactoringserverinterface.h @@ -51,17 +51,17 @@ public: virtual void requestSourceRangesForQueryMessage(RequestSourceRangesForQueryMessage &&message) = 0; virtual void cancel() = 0; - bool isUsable() const + bool isAvailable() const { - return isUsable_; + return isAvailable_; } - void setUsable(bool isUsable) + void setAvailable(bool isAvailable) { - isUsable_ = isUsable; + isAvailable_ = isAvailable; } private: - bool isUsable_ = false; + bool isAvailable_ = false; }; } // namespace ClangBackEnd diff --git a/src/libs/clangsupport/sourcelocationcontainer.h b/src/libs/clangsupport/sourcelocationcontainer.h index 80971e8ee8fed945d0b722d90cc40c7853dd5100..ffccc2a82a6ebf1fefe70aded500cc75b1cba891 100644 --- a/src/libs/clangsupport/sourcelocationcontainer.h +++ b/src/libs/clangsupport/sourcelocationcontainer.h @@ -27,7 +27,7 @@ #include "clangsupport_global.h" -#include <utf8string.h> +#include <sqlite/utf8string.h> namespace ClangBackEnd { diff --git a/src/libs/utils/smallstringfwd.h b/src/libs/utils/smallstringfwd.h index f3b343f961609b11bf67a23be1690655ea5eafe1..05a8a9efb4fe70d371570026c55021aea1b80dbc 100644 --- a/src/libs/utils/smallstringfwd.h +++ b/src/libs/utils/smallstringfwd.h @@ -25,10 +25,10 @@ #pragma once -namespace Utils { - using uint = unsigned int; +namespace Utils { + class SmallStringView; template <uint Size> class BasicSmallString; diff --git a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp index 14d8a1620ec857e7bf72606e5b1078bbe04a7e23..b3d52949bdcaa863ea769630a0bcc6c367b909ad 100644 --- a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp +++ b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.cpp @@ -127,14 +127,14 @@ void ClangQueryProjectsFindFilter::setProjectParts(const std::vector<CppTools::P this->m_projectParts = projectParts; } -bool ClangQueryProjectsFindFilter::isUsable() const +bool ClangQueryProjectsFindFilter::isAvailable() const { - return m_server.isUsable(); + return m_server.isAvailable(); } -void ClangQueryProjectsFindFilter::setUsable(bool isUsable) +void ClangQueryProjectsFindFilter::setAvailable(bool isAvailable) { - m_server.setUsable(isUsable); + m_server.setAvailable(isAvailable); } SearchHandle *ClangQueryProjectsFindFilter::searchHandleForTestOnly() const diff --git a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h index 73608557eca2e784a26ec9271bfc5a9776b8a790..a92c994f0d224c97f00e3b5c6015f21a442971b6 100644 --- a/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h +++ b/src/plugins/clangrefactoring/clangqueryprojectsfindfilter.h @@ -66,8 +66,8 @@ public: void setProjectParts(const std::vector<CppTools::ProjectPart::Ptr> &m_projectParts); - bool isUsable() const; - void setUsable(bool isUsable); + bool isAvailable() const; + void setAvailable(bool isAvailable); SearchHandle* searchHandleForTestOnly() const; diff --git a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp index ac5a96ee88941ffd0a65628dbc6af21c18a5c798..7ca01459c22909fb775fbc4c1b9b045bc0622c4b 100644 --- a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp +++ b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp @@ -100,13 +100,15 @@ bool ClangRefactoringPlugin::initialize(const QStringList & /*arguments*/, QStri void ClangRefactoringPlugin::extensionsInitialized() { - CppTools::CppModelManager::setRefactoringEngine(&refactoringEngine()); + CppTools::CppModelManager::addRefactoringEngine( + CppTools::RefactoringEngineType::ClangRefactoring, &refactoringEngine()); } ExtensionSystem::IPlugin::ShutdownFlag ClangRefactoringPlugin::aboutToShutdown() { ExtensionSystem::PluginManager::removeObject(&d->qtCreatorfindFilter); - CppTools::CppModelManager::setRefactoringEngine(nullptr); + CppTools::CppModelManager::removeRefactoringEngine( + CppTools::RefactoringEngineType::ClangRefactoring); d->refactoringClient.setRefactoringConnectionClient(nullptr); d->refactoringClient.setRefactoringEngine(nullptr); @@ -137,7 +139,7 @@ void ClangRefactoringPlugin::connectBackend() void ClangRefactoringPlugin::backendIsConnected() { - d->engine.setUsable(true); + d->engine.setRefactoringEngineAvailable(true); } } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/refactoringclient.cpp b/src/plugins/clangrefactoring/refactoringclient.cpp index 5c544e5a22060d85c139760bd3d11c1e08f8d981..1bbc01aa02b189547fc89fd651883755319118c4 100644 --- a/src/plugins/clangrefactoring/refactoringclient.cpp +++ b/src/plugins/clangrefactoring/refactoringclient.cpp @@ -47,7 +47,7 @@ void RefactoringClient::sourceLocationsForRenamingMessage( message.sourceLocations(), message.textDocumentRevision()); - m_refactoringEngine->setUsable(true); + m_refactoringEngine->setRefactoringEngineAvailable(true); } void RefactoringClient::sourceRangesAndDiagnosticsForQueryMessage( diff --git a/src/plugins/clangrefactoring/refactoringengine.cpp b/src/plugins/clangrefactoring/refactoringengine.cpp index bc9ec9ab68752944f5c06c164677121c5fe8a921..174254253cd9c6063652474044c6d3e2100c8086 100644 --- a/src/plugins/clangrefactoring/refactoringengine.cpp +++ b/src/plugins/clangrefactoring/refactoringengine.cpp @@ -60,7 +60,7 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data, { using CppTools::ClangCompilerOptionsBuilder; - setUsable(false); + setRefactoringEngineAvailable(false); m_client.setLocalRenamingCallback(std::move(renameSymbolsCallback)); @@ -89,14 +89,14 @@ void RefactoringEngine::startGlobalRenaming(const CppTools::CursorInEditor &) // TODO: implement } -bool RefactoringEngine::isUsable() const +bool RefactoringEngine::isRefactoringEngineAvailable() const { - return m_server.isUsable(); + return m_server.isAvailable(); } -void RefactoringEngine::setUsable(bool isUsable) +void RefactoringEngine::setRefactoringEngineAvailable(bool isAvailable) { - m_server.setUsable(isUsable); + m_server.setAvailable(isAvailable); } } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/refactoringengine.h b/src/plugins/clangrefactoring/refactoringengine.h index b64a2c8eebb58082ebaf756f82d3ac5e3217a78e..eaa15ad7d542d4f7d31d9700434f7ab2b4410c65 100644 --- a/src/plugins/clangrefactoring/refactoringengine.h +++ b/src/plugins/clangrefactoring/refactoringengine.h @@ -48,8 +48,8 @@ public: RenameCallback &&renameSymbolsCallback) override; void startGlobalRenaming(const CppTools::CursorInEditor &data) override; - bool isUsable() const override; - void setUsable(bool isUsable); + bool isRefactoringEngineAvailable() const override; + void setRefactoringEngineAvailable(bool isAvailable); ClangBackEnd::FilePathCachingInterface &filePathCache() { diff --git a/src/plugins/cppeditor/cppeditorwidget.cpp b/src/plugins/cppeditor/cppeditorwidget.cpp index c14bb541bef17256637ad367b6b8c22ed5135930..cd3da7d7ee2004752e83bf63f93d7916e35a2e7f 100644 --- a/src/plugins/cppeditor/cppeditorwidget.cpp +++ b/src/plugins/cppeditor/cppeditorwidget.cpp @@ -524,7 +524,7 @@ void CppEditorWidget::renameSymbolUnderCursor() using ClangBackEnd::SourceLocationsContainer; ProjectPart *projPart = projectPart(); - if (!refactoringEngine().isUsable() || !projPart) + if (!projPart) return; d->m_useSelectionsUpdater.abortSchedule(); @@ -686,7 +686,7 @@ RefactorMarkers CppEditorWidget::refactorMarkersWithoutClangMarkers() const RefactoringEngineInterface &CppEditorWidget::refactoringEngine() const { - return CppTools::CppModelManager::refactoringEngine(); + return *CppTools::CppModelManager::instance(); } CppTools::FollowSymbolInterface &CppEditorWidget::followSymbolInterface() const diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index da45301782227095efac1233beb16c2127fbf92a..633ad7a747020449c92c72ad651fe4f62b21989c 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<REType, RefactoringEngineInterface *>; + REHash m_refactoringEngines {{REType::BuiltIn, &m_builtInRefactoringEngine}}; }; } // namespace Internal @@ -267,17 +271,44 @@ QString CppModelManager::editorConfigurationFileName() return QLatin1String("<per-editor-defines>"); } -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 diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index df04beec3a1ce6d58c5a5192aed07c9f5931ca3e..0a66e63badbc968362f72913e2e8f2d916ea42ae 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -27,6 +27,7 @@ #include "cpptools_global.h" +#include "refactoringengineinterface.h" #include "projectinfo.h" #include "projectpart.h" #include "projectpartheaderpath.h" @@ -53,7 +54,6 @@ class CppCompletionAssistProvider; class CppEditorDocumentHandle; class CppIndexingSupport; class ModelManagerSupportProvider; -class RefactoringEngineInterface; class FollowSymbolInterface; class SymbolFinder; class WorkingCopy; @@ -67,7 +67,15 @@ namespace Tests { class ModelManagerTestHelper; } -class CPPTOOLS_EXPORT CppModelManager : public CPlusPlus::CppModelManagerBase +enum class RefactoringEngineType : int +{ + BuiltIn = 0, + ClangCodeModel = 1, + ClangRefactoring = 2 +}; + +class CPPTOOLS_EXPORT CppModelManager final : public CPlusPlus::CppModelManagerBase, + public RefactoringEngineInterface { Q_OBJECT @@ -140,6 +148,11 @@ public: QList<int> references(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context); + void startLocalRenaming(const CursorInEditor &data, + CppTools::ProjectPart *projectPart, + RenameCallback &&renameSymbolsCallback) final; + void startGlobalRenaming(const CursorInEditor &data) final; + void renameUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context, const QString &replacement = QString()); void findUsages(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context); @@ -179,8 +192,9 @@ public: static QString configurationFileName(); static QString editorConfigurationFileName(); - static void setRefactoringEngine(RefactoringEngineInterface *refactoringEngine); - static RefactoringEngineInterface &refactoringEngine(); + static void addRefactoringEngine(RefactoringEngineType type, + RefactoringEngineInterface *refactoringEngine); + static void removeRefactoringEngine(RefactoringEngineType type); void renameIncludes(const QString &oldFileName, const QString &newFileName); diff --git a/src/plugins/cpptools/cpprefactoringengine.h b/src/plugins/cpptools/cpprefactoringengine.h index acbf02e5e657f52773c967370e2981a5e407f4d5..9ea61ec29ad466b032e9fac95544fa815872fe62 100644 --- a/src/plugins/cpptools/cpprefactoringengine.h +++ b/src/plugins/cpptools/cpprefactoringengine.h @@ -36,8 +36,6 @@ public: CppTools::ProjectPart *projectPart, RenameCallback &&renameSymbolsCallback) override; void startGlobalRenaming(const CppTools::CursorInEditor &data) override; - - bool isUsable() const override { return true; } }; } // namespace CppEditor diff --git a/src/plugins/cpptools/refactoringengineinterface.h b/src/plugins/cpptools/refactoringengineinterface.h index afb6025c036efafd65f8eef5fdc6c451a96ef47d..f18b6ba466c2fe056eb6f915311318fb91f88c9f 100644 --- a/src/plugins/cpptools/refactoringengineinterface.h +++ b/src/plugins/cpptools/refactoringengineinterface.h @@ -57,8 +57,7 @@ public: CppTools::ProjectPart *projectPart, RenameCallback &&renameSymbolsCallback) = 0; virtual void startGlobalRenaming(const CursorInEditor &data) = 0; - - virtual bool isUsable() const = 0; + virtual bool isRefactoringEngineAvailable() const { return true; } }; } // namespace CppTools diff --git a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp index c33b8ab38a28e6f7718c4fa1b6f55eea7cd89960..5ffc382e18701181f7125e3bc336f1b61ed5e707 100644 --- a/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp +++ b/tests/unit/unittest/clangqueryprojectfindfilter-test.cpp @@ -82,25 +82,25 @@ TEST_F(ClangQueryProjectFindFilter, SupportedFindFlags) TEST_F(ClangQueryProjectFindFilter, IsNotUsableForUnusableServer) { - auto isUsable = findFilter.isUsable(); + auto isUsable = findFilter.isAvailable(); ASSERT_FALSE(isUsable); } TEST_F(ClangQueryProjectFindFilter, IsUsableForUsableServer) { - mockRefactoringServer.setUsable(true); + mockRefactoringServer.setAvailable(true); - auto isUsable = findFilter.isUsable(); + auto isUsable = findFilter.isAvailable(); ASSERT_TRUE(isUsable); } TEST_F(ClangQueryProjectFindFilter, ServerIsUsableForUsableFindFilter) { - findFilter.setUsable(true); + findFilter.setAvailable(true); - auto isUsable = mockRefactoringServer.isUsable(); + auto isUsable = mockRefactoringServer.isAvailable(); ASSERT_TRUE(isUsable); } diff --git a/tests/unit/unittest/refactoringclient-test.cpp b/tests/unit/unittest/refactoringclient-test.cpp index f159c424009e4c5f1aa3c74deb0f976eae522d2d..c562e832dbd470bd6fe5fb8ef6c40af00e32e401 100644 --- a/tests/unit/unittest/refactoringclient-test.cpp +++ b/tests/unit/unittest/refactoringclient-test.cpp @@ -123,7 +123,7 @@ TEST_F(RefactoringClient, AfterSourceLocationsForRenamingEngineIsUsableAgain) client.sourceLocationsForRenamingMessage(std::move(renameMessage)); - ASSERT_TRUE(engine.isUsable()); + ASSERT_TRUE(engine.isRefactoringEngineAvailable()); } TEST_F(RefactoringClient, AfterStartLocalRenameHasValidCallback) diff --git a/tests/unit/unittest/refactoringengine-test.cpp b/tests/unit/unittest/refactoringengine-test.cpp index c1363bf7d889d6e75c8893b0fe5458eddd80938a..db6eaf86d472c8256b0cb0b996533002188c5aa0 100644 --- a/tests/unit/unittest/refactoringengine-test.cpp +++ b/tests/unit/unittest/refactoringengine-test.cpp @@ -99,26 +99,26 @@ TEST_F(RefactoringEngine, AfterSendRequestSourceLocationsForRenamingMessageIsUnu engine.startLocalRenaming(CppTools::CursorInEditor{cursor, filePath}, projectPart.data(), {}); - ASSERT_FALSE(engine.isUsable()); + ASSERT_FALSE(engine.isRefactoringEngineAvailable()); } TEST_F(RefactoringEngine, EngineIsNotUsableForUnusableServer) { - ASSERT_FALSE(engine.isUsable()); + ASSERT_FALSE(engine.isRefactoringEngineAvailable()); } TEST_F(RefactoringEngine, EngineIsUsableForUsableServer) { - mockRefactoringServer.setUsable(true); + mockRefactoringServer.setAvailable(true); - ASSERT_TRUE(engine.isUsable()); + ASSERT_TRUE(engine.isRefactoringEngineAvailable()); } TEST_F(RefactoringEngine, ServerIsUsableForUsableEngine) { - engine.setUsable(true); + engine.setRefactoringEngineAvailable(true); - ASSERT_TRUE(mockRefactoringServer.isUsable()); + ASSERT_TRUE(mockRefactoringServer.isAvailable()); } void RefactoringEngine::SetUp()