CppEditor: Remove RefactoringEngine

Another useless indirection.

Change-Id: Icfcc0704a1056d8002a674edbe74b946cb56ff27
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Christian Kandeler
2022-04-29 16:52:48 +02:00
parent da0f950821
commit 969b1f711f
20 changed files with 195 additions and 493 deletions

View File

@@ -26,7 +26,6 @@ add_qtc_plugin(ClangCodeModel
clangpreprocessorassistproposalitem.cpp clangpreprocessorassistproposalitem.h
clangprojectsettings.cpp clangprojectsettings.h
clangprojectsettingswidget.cpp clangprojectsettingswidget.h clangprojectsettingswidget.ui
clangrefactoringengine.cpp clangrefactoringengine.h
clangtextmark.cpp clangtextmark.h
clanguiheaderondiskmanager.cpp clanguiheaderondiskmanager.h
clangutils.cpp clangutils.h

View File

@@ -59,8 +59,6 @@ QtcPlugin {
"clangprojectsettingswidget.cpp",
"clangprojectsettingswidget.h",
"clangprojectsettingswidget.ui",
"clangrefactoringengine.cpp",
"clangrefactoringengine.h",
"clangtextmark.cpp",
"clangtextmark.h",
"clanguiheaderondiskmanager.cpp",

View File

@@ -826,7 +826,7 @@ public:
class LocalRefsData {
public:
LocalRefsData(quint64 id, TextDocument *doc, const QTextCursor &cursor,
CppEditor::RefactoringEngineInterface::RenameCallback &&callback)
CppEditor::RenameCallback &&callback)
: id(id), document(doc), cursor(cursor), callback(std::move(callback)),
uri(DocumentUri::fromFilePath(doc->filePath())), revision(doc->document()->revision())
{}
@@ -840,7 +840,7 @@ public:
const quint64 id;
const QPointer<TextDocument> document;
const QTextCursor cursor;
CppEditor::RefactoringEngineInterface::RenameCallback callback;
CppEditor::RenameCallback callback;
const DocumentUri uri;
const int revision;
};
@@ -2187,7 +2187,7 @@ void ClangdClient::switchDeclDef(TextDocument *document, const QTextCursor &curs
}
void ClangdClient::findLocalUsages(TextDocument *document, const QTextCursor &cursor,
CppEditor::RefactoringEngineInterface::RenameCallback &&callback)
CppEditor::RenameCallback &&callback)
{
QTC_ASSERT(documentOpen(document), openDocument(document));

View File

@@ -27,7 +27,7 @@
#include <cppeditor/baseeditordocumentparser.h>
#include <cppeditor/cppcodemodelsettings.h>
#include <cppeditor/refactoringengineinterface.h>
#include <cppeditor/cursorineditor.h>
#include <languageclient/client.h>
#include <utils/link.h>
#include <utils/optional.h>
@@ -74,7 +74,7 @@ public:
Utils::ProcessLinkCallback &&callback);
void findLocalUsages(TextEditor::TextDocument *document, const QTextCursor &cursor,
CppEditor::RefactoringEngineInterface::RenameCallback &&callback);
CppEditor::RenameCallback &&callback);
void gatherHelpItemForTooltip(
const LanguageServerProtocol::HoverRequest::Response &hoverResponse,

View File

@@ -31,7 +31,6 @@
#include "clangeditordocumentprocessor.h"
#include "clangdlocatorfilters.h"
#include "clangprojectsettings.h"
#include "clangrefactoringengine.h"
#include "clangutils.h"
#include <coreplugin/documentmanager.h>
@@ -49,7 +48,6 @@
#include <cppeditor/cppprojectfile.h>
#include <cppeditor/cpptoolsreuse.h>
#include <cppeditor/editordocumenthandle.h>
#include <cppeditor/symbolfinder.h>
#include <languageclient/languageclientmanager.h>
@@ -104,7 +102,7 @@ static const QList<TextEditor::TextDocument *> allCppDocuments()
return Utils::qobject_container_cast<TextEditor::TextDocument *>(documents);
}
ClangModelManagerSupport::ClangModelManagerSupport() : m_refactoringEngine(new RefactoringEngine)
ClangModelManagerSupport::ClangModelManagerSupport()
{
QTC_CHECK(!m_instance);
m_instance = this;
@@ -189,10 +187,8 @@ void ClangModelManagerSupport::followSymbol(const CppEditor::CursorInEditor &dat
return;
}
SymbolFinder finder;
CppModelManager::builtinFollowSymbol().findLink(data, std::move(processLinkCallback),
resolveTarget, CppModelManager::instance()->snapshot(),
data.editorWidget()->semanticInfo().doc, &finder, inNextSplit);
CppModelManager::followSymbol(data, std::move(processLinkCallback), resolveTarget, inNextSplit,
CppModelManager::Backend::Builtin);
}
void ClangModelManagerSupport::switchDeclDef(const CppEditor::CursorInEditor &data,
@@ -205,15 +201,52 @@ void ClangModelManagerSupport::switchDeclDef(const CppEditor::CursorInEditor &da
return;
}
SymbolFinder finder;
CppModelManager::builtinFollowSymbol().switchDeclDef(data, std::move(processLinkCallback),
CppModelManager::instance()->snapshot(), data.editorWidget()->semanticInfo().doc,
&finder);
CppModelManager::switchDeclDef(data, std::move(processLinkCallback),
CppModelManager::Backend::Builtin);
}
CppEditor::RefactoringEngineInterface &ClangModelManagerSupport::refactoringEngineInterface()
void ClangModelManagerSupport::startLocalRenaming(const CppEditor::CursorInEditor &data,
const CppEditor::ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback)
{
return *m_refactoringEngine;
if (ClangdClient * const client = clientForFile(data.filePath());
client && client->reachable()) {
client->findLocalUsages(data.textDocument(), data.cursor(),
std::move(renameSymbolsCallback));
return;
}
CppModelManager::startLocalRenaming(data, projectPart,
std::move(renameSymbolsCallback), CppModelManager::Backend::Builtin);
}
void ClangModelManagerSupport::globalRename(const CppEditor::CursorInEditor &cursor,
CppEditor::UsagesCallback &&callback,
const QString &replacement)
{
if (ClangdClient * const client = clientForFile(cursor.filePath());
client && client->isFullyIndexed()) {
QTC_ASSERT(client->documentOpen(cursor.textDocument()),
client->openDocument(cursor.textDocument()));
client->findUsages(cursor.textDocument(), cursor.cursor(), replacement);
return;
}
CppModelManager::globalRename(cursor, std::move(callback), replacement,
CppModelManager::Backend::Builtin);
}
void ClangModelManagerSupport::findUsages(const CppEditor::CursorInEditor &cursor,
CppEditor::UsagesCallback &&callback) const
{
if (ClangdClient * const client = clientForFile(cursor.filePath());
client && client->isFullyIndexed()) {
QTC_ASSERT(client->documentOpen(cursor.textDocument()),
client->openDocument(cursor.textDocument()));
client->findUsages(cursor.textDocument(), cursor.cursor(), {});
return;
}
CppModelManager::findUsages(cursor, std::move(callback), CppModelManager::Backend::Builtin);
}
std::unique_ptr<CppEditor::AbstractOverviewModel> ClangModelManagerSupport::createOverviewModel()

View File

@@ -68,7 +68,6 @@ public:
TextEditor::BaseHoverHandler *createHoverHandler() override { return nullptr; }
CppEditor::BaseEditorDocumentProcessor *createEditorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) override;
CppEditor::RefactoringEngineInterface &refactoringEngineInterface() override;
std::unique_ptr<CppEditor::AbstractOverviewModel> createOverviewModel() override;
bool supportsOutline(const TextEditor::TextDocument *document) const override;
bool supportsLocalUses(const TextEditor::TextDocument *document) const override;
@@ -93,6 +92,13 @@ private:
bool inNextSplit) override;
void switchDeclDef(const CppEditor::CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback) override;
void startLocalRenaming(const CppEditor::CursorInEditor &data,
const CppEditor::ProjectPart *projectPart,
CppEditor::RenameCallback &&renameSymbolsCallback) override;
void globalRename(const CppEditor::CursorInEditor &cursor, CppEditor::UsagesCallback &&callback,
const QString &replacement) override;
void findUsages(const CppEditor::CursorInEditor &cursor,
CppEditor::UsagesCallback &&callback) const override;
void onEditorOpened(Core::IEditor *editor);
void onCurrentEditorChanged(Core::IEditor *newCurrent);
@@ -128,7 +134,6 @@ private:
void watchForInternalChanges();
UiHeaderOnDiskManager m_uiHeaderOnDiskManager;
std::unique_ptr<CppEditor::RefactoringEngineInterface> m_refactoringEngine;
QHash<ProjectExplorer::Project *, ClangProjectSettings *> m_projectSettings;
Utils::FutureSynchronizer m_generatorSynchronizer;

View File

@@ -1,87 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "clangrefactoringengine.h"
#include "clangdclient.h"
#include "clangmodelmanagersupport.h"
#include <cppeditor/cppmodelmanager.h>
#include <languageclient/languageclientsymbolsupport.h>
#include <utils/textutils.h>
#include <utils/qtcassert.h>
namespace ClangCodeModel {
namespace Internal {
void RefactoringEngine::startLocalRenaming(const CppEditor::CursorInEditor &data,
const CppEditor::ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback)
{
ClangdClient * const client
= ClangModelManagerSupport::instance()->clientForFile(data.filePath());
if (client && client->reachable()) {
client->findLocalUsages(data.textDocument(), data.cursor(),
std::move(renameSymbolsCallback));
return;
}
CppEditor::CppModelManager::builtinRefactoringEngine()
->startLocalRenaming(data, projectPart, std::move(renameSymbolsCallback));
}
void RefactoringEngine::globalRename(const CppEditor::CursorInEditor &cursor,
CppEditor::UsagesCallback &&callback,
const QString &replacement)
{
ClangdClient * const client
= ClangModelManagerSupport::instance()->clientForFile(cursor.filePath());
if (!client || !client->isFullyIndexed()) {
CppEditor::CppModelManager::builtinRefactoringEngine()
->globalRename(cursor, std::move(callback), replacement);
return;
}
QTC_ASSERT(client->documentOpen(cursor.textDocument()),
client->openDocument(cursor.textDocument()));
client->findUsages(cursor.textDocument(), cursor.cursor(), replacement);
}
void RefactoringEngine::findUsages(const CppEditor::CursorInEditor &cursor,
CppEditor::UsagesCallback &&callback) const
{
ClangdClient * const client
= ClangModelManagerSupport::instance()->clientForFile(cursor.filePath());
if (!client || !client->isFullyIndexed()) {
CppEditor::CppModelManager::builtinRefactoringEngine()
->findUsages(cursor, std::move(callback));
return;
}
QTC_ASSERT(client->documentOpen(cursor.textDocument()),
client->openDocument(cursor.textDocument()));
client->findUsages(cursor.textDocument(), cursor.cursor(), {});
}
} // namespace Internal
} // namespace ClangCodeModel

View File

@@ -1,58 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#include <cppeditor/refactoringengineinterface.h>
#include <cppeditor/cppcursorinfo.h>
#include <QFutureWatcher>
namespace ClangBackEnd {
class RefactoringClientInterface;
class RefactoringServerInterface;
}
namespace ClangCodeModel {
namespace Internal {
class RefactoringEngine : public CppEditor::RefactoringEngineInterface
{
public:
void startLocalRenaming(const CppEditor::CursorInEditor &data,
const CppEditor::ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) override;
void globalRename(const CppEditor::CursorInEditor &cursor, CppEditor::UsagesCallback &&callback,
const QString &replacement) override;
void findUsages(const CppEditor::CursorInEditor &cursor,
CppEditor::UsagesCallback &&callback) const override;
private:
using FutureCursorWatcher = QFutureWatcher<CppEditor::CursorInfo>;
std::unique_ptr<FutureCursorWatcher> m_watcher;
};
} // namespace Internal
} // namespace ClangRefactoring

View File

@@ -85,7 +85,6 @@ add_qtc_plugin(CppEditor
cppquickfixsettingspage.cpp cppquickfixsettingspage.h
cppquickfixsettingswidget.cpp cppquickfixsettingswidget.h cppquickfixsettingswidget.ui
cpprefactoringchanges.cpp cpprefactoringchanges.h
cpprefactoringengine.cpp cpprefactoringengine.h
cppselectionchanger.cpp cppselectionchanger.h
cppsemanticinfo.h
cppsemanticinfoupdater.cpp cppsemanticinfoupdater.h
@@ -109,7 +108,6 @@ add_qtc_plugin(CppEditor
insertionpointlocator.cpp insertionpointlocator.h
projectinfo.cpp projectinfo.h
projectpart.cpp projectpart.h
refactoringengineinterface.h
resourcepreviewhoverhandler.cpp resourcepreviewhoverhandler.h
searchsymbols.cpp searchsymbols.h
semantichighlighter.cpp semantichighlighter.h

View File

@@ -26,18 +26,20 @@
#include "cppbuiltinmodelmanagersupport.h"
#include "builtineditordocumentprocessor.h"
#include "cppcanonicalsymbol.h"
#include "cppcompletionassist.h"
#include "cppeditorwidget.h"
#include "cppelementevaluator.h"
#include "cppfollowsymbolundercursor.h"
#include "cppoverviewmodel.h"
#include "cpprefactoringengine.h"
#include "cpptoolsreuse.h"
#include "symbolfinder.h"
#include <app/app_version.h>
#include <clangsupport/sourcelocationscontainer.h>
#include <texteditor/basehoverhandler.h>
#include <utils/executeondestruction.h>
#include <utils/qtcassert.h>
#include <QCoreApplication>
@@ -105,8 +107,7 @@ ModelManagerSupport::Ptr BuiltinModelManagerSupportProvider::createModelManagerS
BuiltinModelManagerSupport::BuiltinModelManagerSupport()
: m_completionAssistProvider(new InternalCompletionAssistProvider),
m_followSymbol(new FollowSymbolUnderCursor),
m_refactoringEngine(new CppRefactoringEngine)
m_followSymbol(new FollowSymbolUnderCursor)
{
}
@@ -134,11 +135,6 @@ TextEditor::BaseHoverHandler *BuiltinModelManagerSupport::createHoverHandler()
return new CppHoverHandler;
}
RefactoringEngineInterface &BuiltinModelManagerSupport::refactoringEngineInterface()
{
return *m_refactoringEngine;
}
std::unique_ptr<AbstractOverviewModel> BuiltinModelManagerSupport::createOverviewModel()
{
return std::make_unique<OverviewModel>();
@@ -163,4 +159,68 @@ void BuiltinModelManagerSupport::switchDeclDef(const CursorInEditor &data,
&finder);
}
void BuiltinModelManagerSupport::startLocalRenaming(const CursorInEditor &data,
const ProjectPart *,
RenameCallback &&renameSymbolsCallback)
{
CppEditorWidget *editorWidget = data.editorWidget();
QTC_ASSERT(editorWidget, renameSymbolsCallback(QString(),
ClangBackEnd::SourceLocationsContainer(),
0); return;);
editorWidget->updateSemanticInfo();
// Call empty callback
renameSymbolsCallback(QString(),
ClangBackEnd::SourceLocationsContainer(),
data.cursor().document()->revision());
}
void BuiltinModelManagerSupport::globalRename(const CursorInEditor &data,
UsagesCallback &&,
const QString &replacement)
{
CppModelManager *modelManager = CppModelManager::instance();
if (!modelManager)
return;
CppEditorWidget *editorWidget = data.editorWidget();
QTC_ASSERT(editorWidget, return;);
SemanticInfo info = editorWidget->semanticInfo();
info.snapshot = modelManager->snapshot();
info.snapshot.insert(info.doc);
const QTextCursor &cursor = data.cursor();
if (const CPlusPlus::Macro *macro = findCanonicalMacro(cursor, info.doc)) {
modelManager->renameMacroUsages(*macro, replacement);
} else {
Internal::CanonicalSymbol cs(info.doc, info.snapshot);
CPlusPlus::Symbol *canonicalSymbol = cs(cursor);
if (canonicalSymbol)
modelManager->renameUsages(canonicalSymbol, cs.context(), replacement);
}
}
void BuiltinModelManagerSupport::findUsages(const CursorInEditor &data,
UsagesCallback &&) const
{
CppModelManager *modelManager = CppModelManager::instance();
if (!modelManager)
return;
CppEditorWidget *editorWidget = data.editorWidget();
QTC_ASSERT(editorWidget, return;);
SemanticInfo info = editorWidget->semanticInfo();
info.snapshot = modelManager->snapshot();
info.snapshot.insert(info.doc);
const QTextCursor &cursor = data.cursor();
if (const CPlusPlus::Macro *macro = findCanonicalMacro(cursor, info.doc)) {
modelManager->findMacroUsages(*macro);
} else {
Internal::CanonicalSymbol cs(info.doc, info.snapshot);
CPlusPlus::Symbol *canonicalSymbol = cs(cursor);
if (canonicalSymbol)
modelManager->findUsages(canonicalSymbol, cs.context());
}
}
} // namespace CppEditor::Internal

View File

@@ -46,7 +46,6 @@ public:
TextEditor::BaseHoverHandler *createHoverHandler() final;
BaseEditorDocumentProcessor *createEditorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) final;
RefactoringEngineInterface &refactoringEngineInterface() final;
std::unique_ptr<AbstractOverviewModel> createOverviewModel() final;
FollowSymbolUnderCursor &followSymbolInterface() { return *m_followSymbol; }
@@ -56,10 +55,15 @@ private:
bool resolveTarget, bool inNextSplit) override;
void switchDeclDef(const CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback) override;
void startLocalRenaming(const CursorInEditor &data,
const ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) override;
void globalRename(const CursorInEditor &data, UsagesCallback &&,
const QString &replacement) override;
void findUsages(const CursorInEditor &data, UsagesCallback &&) const override;
QScopedPointer<CppCompletionAssistProvider> m_completionAssistProvider;
QScopedPointer<FollowSymbolUnderCursor> m_followSymbol;
QScopedPointer<RefactoringEngineInterface> m_refactoringEngine;
};
class BuiltinModelManagerSupportProvider : public ModelManagerSupportProvider

View File

@@ -189,8 +189,6 @@ QtcPlugin {
"cppqtstyleindenter.h",
"cpprefactoringchanges.cpp",
"cpprefactoringchanges.h",
"cpprefactoringengine.cpp",
"cpprefactoringengine.h",
"cppselectionchanger.cpp",
"cppselectionchanger.h",
"cppsemanticinfo.h",
@@ -235,7 +233,6 @@ QtcPlugin {
"projectinfo.h",
"projectpart.cpp",
"projectpart.h",
"refactoringengineinterface.h",
"resourcepreviewhoverhandler.cpp",
"resourcepreviewhoverhandler.h",
"searchsymbols.cpp",

View File

@@ -50,7 +50,6 @@
#include "cpptoolssettings.h"
#include "cppuseselectionsupdater.h"
#include "cppworkingcopy.h"
#include "refactoringengineinterface.h"
#include "symbolfinder.h"
#include <clangsupport/sourcelocationscontainer.h>
@@ -1044,7 +1043,7 @@ void CppEditorWidget::switchDeclarationDefinition(bool inNextSplit)
if (self && link.hasValidTarget())
self->openLink(link, split);
};
CppModelManager::instance()->switchDeclDef(cursor, std::move(callback));
CppModelManager::switchDeclDef(cursor, std::move(callback));
}
void CppEditorWidget::findLinkAt(const QTextCursor &cursor,
@@ -1084,7 +1083,7 @@ void CppEditorWidget::findLinkAt(const QTextCursor &cursor,
}
callback(link);
};
CppModelManager::instance()->followSymbol(
CppModelManager::followSymbol(
CursorInEditor{cursor, filePath, this, textDocument()},
std::move(callbackWrapper),
resolveTarget,

View File

@@ -40,7 +40,6 @@
#include "cpplocatorfilter.h"
#include "cppbuiltinmodelmanagersupport.h"
#include "cpprefactoringchanges.h"
#include "cpprefactoringengine.h"
#include "cppsourceprocessor.h"
#include "cpptoolsjsextension.h"
#include "cpptoolsreuse.h"
@@ -136,8 +135,6 @@ protected:
namespace CppEditor {
using REType = RefactoringEngineType;
namespace Internal {
static CppModelManager *m_instance;
@@ -197,10 +194,6 @@ public:
QTimer m_delayedGcTimer;
QTimer m_fallbackProjectPartTimer;
// 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;
@@ -308,43 +301,32 @@ QString CppModelManager::editorConfigurationFileName()
return QLatin1String("<per-editor-defines>");
}
static RefactoringEngineInterface *getRefactoringEngine(CppModelManagerPrivate::REHash &engines)
ModelManagerSupport *CppModelManager::modelManagerSupport(Backend backend) const
{
QTC_ASSERT(!engines.empty(), return nullptr;);
RefactoringEngineInterface *currentEngine = engines[REType::BuiltIn];
if (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;
return (backend == Backend::Builtin
? d->m_builtinModelManagerSupport : d->m_activeModelManagerSupport).data();
}
void CppModelManager::startLocalRenaming(const CursorInEditor &data,
const ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback)
RenameCallback &&renameSymbolsCallback,
Backend backend)
{
RefactoringEngineInterface *engine = getRefactoringEngine(d->m_refactoringEngines);
QTC_ASSERT(engine, return;);
engine->startLocalRenaming(data, projectPart, std::move(renameSymbolsCallback));
instance()->modelManagerSupport(backend)
->startLocalRenaming(data, projectPart, std::move(renameSymbolsCallback));
}
void CppModelManager::globalRename(const CursorInEditor &data, UsagesCallback &&renameCallback,
const QString &replacement)
const QString &replacement, Backend backend)
{
RefactoringEngineInterface *engine = getRefactoringEngine(d->m_refactoringEngines);
QTC_ASSERT(engine, return;);
engine->globalRename(data, std::move(renameCallback), replacement);
instance()->modelManagerSupport(backend)
->globalRename(data, std::move(renameCallback), replacement);
}
void CppModelManager::findUsages(const CursorInEditor &data,
UsagesCallback &&showUsagesCallback) const
UsagesCallback &&showUsagesCallback, Backend backend)
{
RefactoringEngineInterface *engine = getRefactoringEngine(d->m_refactoringEngines);
QTC_ASSERT(engine, return;);
engine->findUsages(data, std::move(showUsagesCallback));
instance()->modelManagerSupport(backend)->findUsages(data, std::move(showUsagesCallback));
}
bool CppModelManager::positionRequiresSignal(const QString &filePath, const QByteArray &content,
@@ -456,22 +438,6 @@ bool CppModelManager::positionRequiresSignal(const QString &filePath, const QByt
return false;
}
void CppModelManager::addRefactoringEngine(RefactoringEngineType type,
RefactoringEngineInterface *refactoringEngine)
{
instance()->d->m_refactoringEngines[type] = refactoringEngine;
}
void CppModelManager::removeRefactoringEngine(RefactoringEngineType type)
{
instance()->d->m_refactoringEngines.remove(type);
}
RefactoringEngineInterface *CppModelManager::builtinRefactoringEngine()
{
return instance()->d->m_refactoringEngines.value(RefactoringEngineType::BuiltIn);
}
FollowSymbolUnderCursor &CppModelManager::builtinFollowSymbol()
{
return instance()->d->m_builtinModelManagerSupport.staticCast<BuiltinModelManagerSupport>()
@@ -622,8 +588,6 @@ void CppModelManager::initializeBuiltinModelManagerSupport()
d->m_builtinModelManagerSupport
= BuiltinModelManagerSupportProvider().createModelManagerSupport();
d->m_activeModelManagerSupport = d->m_builtinModelManagerSupport;
d->m_refactoringEngines[RefactoringEngineType::BuiltIn] =
&d->m_activeModelManagerSupport->refactoringEngineInterface();
}
CppModelManager::CppModelManager()
@@ -1647,8 +1611,6 @@ void CppModelManager::activateClangCodeModel(
QTC_ASSERT(modelManagerSupportProvider, return);
d->m_activeModelManagerSupport = modelManagerSupportProvider->createModelManagerSupport();
d->m_refactoringEngines[RefactoringEngineType::ClangCodeModel] =
&d->m_activeModelManagerSupport->refactoringEngineInterface();
}
CppCompletionAssistProvider *CppModelManager::completionAssistProvider() const
@@ -1668,16 +1630,17 @@ TextEditor::BaseHoverHandler *CppModelManager::createHoverHandler() const
void CppModelManager::followSymbol(const CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback,
bool resolveTarget, bool inNextSplit)
bool resolveTarget, bool inNextSplit, Backend backend)
{
d->m_activeModelManagerSupport->followSymbol(data, std::move(processLinkCallback),
instance()->modelManagerSupport(backend)->followSymbol(data, std::move(processLinkCallback),
resolveTarget, inNextSplit);
}
void CppModelManager::switchDeclDef(const CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback)
Utils::ProcessLinkCallback &&processLinkCallback,
Backend backend)
{
d->m_activeModelManagerSupport->switchDeclDef(data, std::move(processLinkCallback));
instance()->modelManagerSupport(backend)->switchDeclDef(data, std::move(processLinkCallback));
}
Core::ILocatorFilter *CppModelManager::createAuxiliaryCurrentDocumentFilter()

View File

@@ -27,14 +27,16 @@
#include "cppeditor_global.h"
#include "refactoringengineinterface.h"
#include "cursorineditor.h"
#include "projectinfo.h"
#include "projectpart.h"
#include <projectexplorer/headerpath.h>
#include "usages.h"
#include <cplusplus/cppmodelmanagerbase.h>
#include <coreplugin/find/ifindfilter.h>
#include <coreplugin/locator/ilocatorfilter.h>
#include <projectexplorer/headerpath.h>
#include <utils/link.h>
#include <QFuture>
#include <QObject>
@@ -62,6 +64,7 @@ class CppIndexingSupport;
class CppLocatorData;
class FollowSymbolUnderCursor;
class ModelManagerSupportProvider;
class ModelManagerSupport;
class SymbolFinder;
class WorkingCopy;
@@ -73,15 +76,7 @@ class CppModelManagerPrivate;
namespace Tests { class ModelManagerTestHelper; }
enum class RefactoringEngineType : int
{
BuiltIn = 0,
ClangCodeModel = 1,
ClangRefactoring = 2
};
class CPPEDITOR_EXPORT CppModelManager final : public CPlusPlus::CppModelManagerBase,
public RefactoringEngineInterface
class CPPEDITOR_EXPORT CppModelManager final : public CPlusPlus::CppModelManagerBase
{
Q_OBJECT
@@ -156,14 +151,6 @@ public:
QList<int> references(CPlusPlus::Symbol *symbol, const CPlusPlus::LookupContext &context);
void startLocalRenaming(const CursorInEditor &data,
const ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) final;
void globalRename(const CursorInEditor &data, UsagesCallback &&renameCallback,
const QString &replacement) final;
void findUsages(const CursorInEditor &data,
UsagesCallback &&showUsagesCallback) const final;
bool positionRequiresSignal(const QString &filePath, const QByteArray &content,
int position) const;
@@ -183,10 +170,22 @@ public:
TextEditor::TextDocument *baseTextDocument) const;
TextEditor::BaseHoverHandler *createHoverHandler() const;
static FollowSymbolUnderCursor &builtinFollowSymbol();
void followSymbol(const CursorInEditor &data, Utils::ProcessLinkCallback &&processLinkCallback,
bool resolveTarget, bool inNextSplit);
void switchDeclDef(const CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback);
enum class Backend { Builtin, Best };
static void followSymbol(const CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback,
bool resolveTarget, bool inNextSplit, Backend backend = Backend::Best);
static void switchDeclDef(const CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback,
Backend backend = Backend::Best);
static void startLocalRenaming(const CursorInEditor &data, const ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback,
Backend backend = Backend::Best);
static void globalRename(const CursorInEditor &data, UsagesCallback &&renameCallback,
const QString &replacement, Backend backend = Backend::Best);
static void findUsages(const CursorInEditor &data, UsagesCallback &&showUsagesCallback,
Backend backend = Backend::Best);
static Core::ILocatorFilter *createAuxiliaryCurrentDocumentFilter();
std::unique_ptr<AbstractOverviewModel> createOverviewModel() const;
@@ -214,11 +213,6 @@ public:
static QString configurationFileName();
static QString editorConfigurationFileName();
static void addRefactoringEngine(RefactoringEngineType type,
RefactoringEngineInterface *refactoringEngine);
static void removeRefactoringEngine(RefactoringEngineType type);
static RefactoringEngineInterface *builtinRefactoringEngine();
void setLocatorFilter(std::unique_ptr<Core::ILocatorFilter> &&filter);
void setClassesFilter(std::unique_ptr<Core::ILocatorFilter> &&filter);
void setIncludesFilter(std::unique_ptr<Core::ILocatorFilter> &&filter);
@@ -292,6 +286,8 @@ private:
WorkingCopy buildWorkingCopyList();
ModelManagerSupport *modelManagerSupport(Backend backend) const;
void ensureUpdated();
QStringList internalProjectFiles() const;
ProjectExplorer::HeaderPaths internalHeaderPaths() const;

View File

@@ -26,6 +26,8 @@
#pragma once
#include "cppeditor_global.h"
#include "cursorineditor.h"
#include "usages.h"
#include <utils/link.h>
@@ -44,7 +46,7 @@ namespace CppEditor {
class AbstractOverviewModel;
class BaseEditorDocumentProcessor;
class CppCompletionAssistProvider;
class CursorInEditor;
class ProjectPart;
class RefactoringEngineInterface;
class CPPEDITOR_EXPORT ModelManagerSupport
@@ -60,7 +62,6 @@ public:
virtual TextEditor::BaseHoverHandler *createHoverHandler() = 0;
virtual BaseEditorDocumentProcessor *createEditorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) = 0;
virtual RefactoringEngineInterface &refactoringEngineInterface() = 0;
virtual std::unique_ptr<AbstractOverviewModel> createOverviewModel() = 0;
virtual bool supportsOutline(const TextEditor::TextDocument *) const { return true; }
virtual bool hasSpecialHoverHandler(const TextEditor::TextDocument *) const { return false; }
@@ -71,6 +72,14 @@ public:
bool resolveTarget, bool inNextSplit) = 0;
virtual void switchDeclDef(const CursorInEditor &data,
Utils::ProcessLinkCallback &&processLinkCallback) = 0;
virtual void startLocalRenaming(const CursorInEditor &data,
const ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) = 0;
virtual void globalRename(const CursorInEditor &data,
UsagesCallback &&renameCallback,
const QString &replacement) = 0;
virtual void findUsages(const CursorInEditor &data,
UsagesCallback &&showUsagesCallback) const = 0;
};
class CPPEDITOR_EXPORT ModelManagerSupportProvider

View File

@@ -1,106 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#include "cpprefactoringengine.h"
#include "cppcanonicalsymbol.h"
#include "cppeditorwidget.h"
#include "cppmodelmanager.h"
#include "cppsemanticinfo.h"
#include "cpptoolsreuse.h"
#include "cppfollowsymbolundercursor.h"
#include <clangsupport/sourcelocationscontainer.h>
#include <texteditor/texteditor.h>
#include <utils/qtcassert.h>
namespace CppEditor::Internal {
void CppRefactoringEngine::startLocalRenaming(const CursorInEditor &data,
const ProjectPart *,
RenameCallback &&renameSymbolsCallback)
{
CppEditorWidget *editorWidget = data.editorWidget();
QTC_ASSERT(editorWidget, renameSymbolsCallback(QString(),
ClangBackEnd::SourceLocationsContainer(),
0); return;);
editorWidget->updateSemanticInfo();
// Call empty callback
renameSymbolsCallback(QString(),
ClangBackEnd::SourceLocationsContainer(),
data.cursor().document()->revision());
}
void CppRefactoringEngine::globalRename(const CursorInEditor &data,
UsagesCallback &&,
const QString &replacement)
{
CppModelManager *modelManager = CppModelManager::instance();
if (!modelManager)
return;
CppEditorWidget *editorWidget = data.editorWidget();
QTC_ASSERT(editorWidget, return;);
SemanticInfo info = editorWidget->semanticInfo();
info.snapshot = modelManager->snapshot();
info.snapshot.insert(info.doc);
const QTextCursor &cursor = data.cursor();
if (const CPlusPlus::Macro *macro = findCanonicalMacro(cursor, info.doc)) {
modelManager->renameMacroUsages(*macro, replacement);
} else {
Internal::CanonicalSymbol cs(info.doc, info.snapshot);
CPlusPlus::Symbol *canonicalSymbol = cs(cursor);
if (canonicalSymbol)
modelManager->renameUsages(canonicalSymbol, cs.context(), replacement);
}
}
void CppRefactoringEngine::findUsages(const CursorInEditor &data,
UsagesCallback &&) const
{
CppModelManager *modelManager = CppModelManager::instance();
if (!modelManager)
return;
CppEditorWidget *editorWidget = data.editorWidget();
QTC_ASSERT(editorWidget, return;);
SemanticInfo info = editorWidget->semanticInfo();
info.snapshot = modelManager->snapshot();
info.snapshot.insert(info.doc);
const QTextCursor &cursor = data.cursor();
if (const CPlusPlus::Macro *macro = findCanonicalMacro(cursor, info.doc)) {
modelManager->findMacroUsages(*macro);
} else {
Internal::CanonicalSymbol cs(info.doc, info.snapshot);
CPlusPlus::Symbol *canonicalSymbol = cs(cursor);
if (canonicalSymbol)
modelManager->findUsages(canonicalSymbol, cs.context());
}
}
} // namespace CppEditor::Internal

View File

@@ -1,43 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#include "refactoringengineinterface.h"
namespace CppEditor::Internal {
class CppRefactoringEngine : public RefactoringEngineInterface
{
public:
void startLocalRenaming(const CursorInEditor &data,
const ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) override;
void globalRename(const CursorInEditor &data, UsagesCallback &&,
const QString &replacement) override;
void findUsages(const CursorInEditor &data, UsagesCallback &&) const override;
};
} // namespace CppEditor::Internal

View File

@@ -29,11 +29,19 @@
#include <QTextCursor>
#include <functional>
namespace ClangBackEnd { class SourceLocationsContainer; }
namespace TextEditor { class TextDocument; }
namespace CppEditor {
class CppEditorWidget;
// TODO: Move to a better place.
using RenameCallback = std::function<void(const QString &,
const ClangBackEnd::SourceLocationsContainer &,
int)>;
class CursorInEditor
{
public:

View File

@@ -1,73 +0,0 @@
/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
****************************************************************************/
#pragma once
#include "cppeditor_global.h"
#include "cursorineditor.h"
#include "usages.h"
#include <utils/link.h>
#include <utils/fileutils.h>
#include <cplusplus/CppDocument.h>
namespace ClangBackEnd { class SourceLocationsContainer; }
namespace TextEditor { class TextEditorWidget; }
namespace CppEditor {
class ProjectPart;
class SymbolFinder;
enum class CallType
{
Synchronous,
Asynchronous
};
// NOTE: This interface is not supposed to be owned as an interface pointer
class CPPEDITOR_EXPORT RefactoringEngineInterface
{
public:
using RenameCallback = std::function<void(const QString &,
const ClangBackEnd::SourceLocationsContainer &,
int)>;
using Link = Utils::Link;
virtual ~RefactoringEngineInterface() = default;
virtual void startLocalRenaming(const CursorInEditor &data,
const ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) = 0;
virtual void globalRename(const CursorInEditor &data,
UsagesCallback &&renameCallback,
const QString &replacement) = 0;
virtual void findUsages(const CursorInEditor &data,
UsagesCallback &&showUsagesCallback) const = 0;
virtual bool isRefactoringEngineAvailable() const { return true; }
};
} // namespace CppEditor