Clang: implement globalRename based on clang Index

Has the same limitations as findUsages.

Change-Id: I8de4df2ecbfd8a4f3073666994398dc43af0d73c
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ivan Donchevskii
2017-09-25 10:51:39 +02:00
parent 3bea291427
commit 81f5c1c8ec
11 changed files with 62 additions and 48 deletions

View File

@@ -90,11 +90,6 @@ void RefactoringEngine::startLocalRenaming(const CppTools::CursorInEditor &data,
m_server.requestSourceLocationsForRenamingMessage(std::move(message)); m_server.requestSourceLocationsForRenamingMessage(std::move(message));
} }
void RefactoringEngine::startGlobalRenaming(const CppTools::CursorInEditor &)
{
// TODO: implement
}
CppTools::Usages RefactoringEngine::locationsAt(const CppTools::CursorInEditor &data) const CppTools::Usages RefactoringEngine::locationsAt(const CppTools::CursorInEditor &data) const
{ {
int line = 0, column = 0; int line = 0, column = 0;
@@ -114,13 +109,16 @@ CppTools::Usages RefactoringEngine::locationsAt(const CppTools::CursorInEditor &
return result; return result;
} }
void RefactoringEngine::globalRename(const CppTools::CursorInEditor &data,
CppTools::UsagesCallback &&renameUsagesCallback,
const QString &)
{
renameUsagesCallback(locationsAt(data));
}
void RefactoringEngine::findUsages(const CppTools::CursorInEditor &data, void RefactoringEngine::findUsages(const CppTools::CursorInEditor &data,
CppTools::UsagesCallback &&showUsagesCallback) const CppTools::UsagesCallback &&showUsagesCallback) const
{ {
int line = 0, column = 0;
QTextCursor cursor = Utils::Text::wordStartCursor(data.cursor());
Utils::Text::convertPosition(cursor.document(), cursor.position(), &line, &column);
showUsagesCallback(locationsAt(data)); showUsagesCallback(locationsAt(data));
} }

View File

@@ -50,7 +50,9 @@ public:
void startLocalRenaming(const CppTools::CursorInEditor &data, void startLocalRenaming(const CppTools::CursorInEditor &data,
CppTools::ProjectPart *projectPart, CppTools::ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) override; RenameCallback &&renameSymbolsCallback) override;
void startGlobalRenaming(const CppTools::CursorInEditor &data) override; void globalRename(const CppTools::CursorInEditor &data,
CppTools::UsagesCallback &&renameUsagesCallback,
const QString &) override;
void findUsages(const CppTools::CursorInEditor &data, void findUsages(const CppTools::CursorInEditor &data,
CppTools::UsagesCallback &&showUsagesCallback) const override; CppTools::UsagesCallback &&showUsagesCallback) const override;

View File

@@ -377,7 +377,7 @@ static void findRenameCallback(QTextCursor cursor,
{ {
cursor = Utils::Text::wordStartCursor(cursor); cursor = Utils::Text::wordStartCursor(cursor);
cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor); cursor.movePosition(QTextCursor::EndOfWord, QTextCursor::KeepAnchor);
QString text = cursor.selectedText(); const QString text = cursor.selectedText();
SearchResultWindow::SearchMode mode = SearchResultWindow::SearchOnly; SearchResultWindow::SearchMode mode = SearchResultWindow::SearchOnly;
if (rename) if (rename)
mode = SearchResultWindow::SearchAndReplace; mode = SearchResultWindow::SearchAndReplace;
@@ -414,23 +414,15 @@ void CppEditorWidget::findUsages()
}); });
} }
void CppEditorWidget::renameUsagesInternal(const QString &replacement) void CppEditorWidget::renameUsages(const QString &replacement)
{ {
if (!d->m_modelManager) refactoringEngine().globalRename(CppTools::CursorInEditor{textCursor(),
return; textDocument()->filePath(),
this},
SemanticInfo info = d->m_lastSemanticInfo; [this](const CppTools::Usages &usages) {
info.snapshot = CppModelManager::instance()->snapshot(); findRenameCallback(textCursor(), usages, true);
info.snapshot.insert(info.doc); },
replacement);
if (const Macro *macro = CppTools::findCanonicalMacro(textCursor(), info.doc)) {
d->m_modelManager->renameMacroUsages(*macro, replacement);
} else {
CanonicalSymbol cs(info.doc, info.snapshot);
if (Symbol *canonicalSymbol = cs(textCursor()))
if (canonicalSymbol->identifier() != 0)
d->m_modelManager->renameUsages(canonicalSymbol, cs.context(), replacement);
}
} }
bool CppEditorWidget::selectBlockUp() bool CppEditorWidget::selectBlockUp()
@@ -598,10 +590,8 @@ void CppEditorWidget::renameSymbolUnderCursor()
setExtraSelections(TextEditor::TextEditorWidget::CodeSemanticsSelection, selections); setExtraSelections(TextEditor::TextEditorWidget::CodeSemanticsSelection, selections);
d->m_localRenaming.updateSelectionsForVariableUnderCursor(selections); d->m_localRenaming.updateSelectionsForVariableUnderCursor(selections);
} }
if (!d->m_localRenaming.start()) { if (!d->m_localRenaming.start())
refactoringEngine().startGlobalRenaming( cppEditorWidget->renameUsages();
CppTools::CursorInEditor{textCursor(), textDocument()->filePath(), this});
}
} }
}; };

View File

@@ -79,6 +79,7 @@ public:
void showPreProcessorWidget() override; void showPreProcessorWidget() override;
void findUsages(); void findUsages();
void renameUsages(const QString &replacement = QString());
void renameSymbolUnderCursor(); void renameSymbolUnderCursor();
bool selectBlockUp() override; bool selectBlockUp() override;
@@ -105,8 +106,6 @@ protected:
void slotCodeStyleSettingsChanged(const QVariant &) override; void slotCodeStyleSettingsChanged(const QVariant &) override;
void renameUsagesInternal(const QString &replacement) override;
private: private:
void updateFunctionDeclDefLink(); void updateFunctionDeclDefLink();
void updateFunctionDeclDefLinkNow(); void updateFunctionDeclDefLinkNow();

View File

@@ -40,15 +40,9 @@ class SemanticInfo;
class CPPTOOLS_EXPORT CppEditorWidgetInterface class CPPTOOLS_EXPORT CppEditorWidgetInterface
{ {
public: public:
void renameUsages(const QString &replacement = QString())
{
return renameUsagesInternal(replacement);
}
virtual void showPreProcessorWidget() = 0; virtual void showPreProcessorWidget() = 0;
virtual SemanticInfo semanticInfo() const = 0; virtual SemanticInfo semanticInfo() const = 0;
virtual void updateSemanticInfo() = 0; virtual void updateSemanticInfo() = 0;
virtual void renameUsagesInternal(const QString &replacement) = 0;
virtual void invokeTextEditorWidgetAssist(TextEditor::AssistKind assistKind, virtual void invokeTextEditorWidgetAssist(TextEditor::AssistKind assistKind,
TextEditor::IAssistProvider *provider) = 0; TextEditor::IAssistProvider *provider) = 0;

View File

@@ -294,12 +294,12 @@ void CppModelManager::startLocalRenaming(const CursorInEditor &data,
engine->startLocalRenaming(data, projectPart, std::move(renameSymbolsCallback)); engine->startLocalRenaming(data, projectPart, std::move(renameSymbolsCallback));
} }
void CppModelManager::startGlobalRenaming(const CursorInEditor &data) void CppModelManager::globalRename(const CursorInEditor &data, UsagesCallback &&renameCallback,
const QString &replacement)
{ {
RefactoringEngineInterface *engine = getRefactoringEngine(instance()->d->m_refactoringEngines); RefactoringEngineInterface *engine = getRefactoringEngine(instance()->d->m_refactoringEngines);
engine->startGlobalRenaming(data); engine->globalRename(data, std::move(renameCallback), replacement);
} }
void CppModelManager::findUsages(const CppTools::CursorInEditor &data, void CppModelManager::findUsages(const CppTools::CursorInEditor &data,
UsagesCallback &&showUsagesCallback) const UsagesCallback &&showUsagesCallback) const
{ {

View File

@@ -151,7 +151,8 @@ public:
void startLocalRenaming(const CursorInEditor &data, void startLocalRenaming(const CursorInEditor &data,
CppTools::ProjectPart *projectPart, CppTools::ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) final; RenameCallback &&renameSymbolsCallback) final;
void startGlobalRenaming(const CursorInEditor &data) final; void globalRename(const CursorInEditor &data, UsagesCallback &&renameCallback,
const QString &replacement) final;
void findUsages(const CppTools::CursorInEditor &data, void findUsages(const CppTools::CursorInEditor &data,
UsagesCallback &&showUsagesCallback) const final; UsagesCallback &&showUsagesCallback) const final;

View File

@@ -50,11 +50,29 @@ void CppRefactoringEngine::startLocalRenaming(const CursorInEditor &data,
data.cursor().document()->revision()); data.cursor().document()->revision());
} }
void CppRefactoringEngine::startGlobalRenaming(const CursorInEditor &data) void CppRefactoringEngine::globalRename(const CursorInEditor &data,
UsagesCallback &&,
const QString &replacement)
{ {
CppModelManager *modelManager = CppModelManager::instance();
if (!modelManager)
return;
CppEditorWidgetInterface *editorWidget = data.editorWidget(); CppEditorWidgetInterface *editorWidget = data.editorWidget();
QTC_ASSERT(editorWidget, return;); QTC_ASSERT(editorWidget, return;);
editorWidget->renameUsages();
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 {
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, void CppRefactoringEngine::findUsages(const CursorInEditor &data,

View File

@@ -35,8 +35,8 @@ public:
void startLocalRenaming(const CursorInEditor &data, void startLocalRenaming(const CursorInEditor &data,
ProjectPart *projectPart, ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) override; RenameCallback &&renameSymbolsCallback) override;
void startGlobalRenaming(const CursorInEditor &data) override; void globalRename(const CursorInEditor &data, UsagesCallback &&,
const QString &replacement) override;
void findUsages(const CursorInEditor &data, UsagesCallback &&) const override; void findUsages(const CursorInEditor &data, UsagesCallback &&) const override;
}; };

View File

@@ -60,7 +60,9 @@ public:
virtual void startLocalRenaming(const CursorInEditor &data, virtual void startLocalRenaming(const CursorInEditor &data,
CppTools::ProjectPart *projectPart, CppTools::ProjectPart *projectPart,
RenameCallback &&renameSymbolsCallback) = 0; RenameCallback &&renameSymbolsCallback) = 0;
virtual void startGlobalRenaming(const CursorInEditor &data) = 0; virtual void globalRename(const CursorInEditor &data,
UsagesCallback &&renameCallback,
const QString &replacement) = 0;
virtual void findUsages(const CppTools::CursorInEditor &data, virtual void findUsages(const CppTools::CursorInEditor &data,
UsagesCallback &&showUsagesCallback) const = 0; UsagesCallback &&showUsagesCallback) const = 0;
virtual bool isRefactoringEngineAvailable() const { return true; } virtual bool isRefactoringEngineAvailable() const { return true; }

View File

@@ -115,6 +115,16 @@ TEST_F(RefactoringEngine, ExpectLocationsAtInFindUsages)
[](const CppTools::Usages &) {}); [](const CppTools::Usages &) {});
} }
TEST_F(RefactoringEngine, ExpectLocationsAtInGlobalRename)
{
cursor.setPosition(11);
EXPECT_CALL(mockSymbolQuery, locationsAt(_, 2, 5));
engine.globalRename(CppTools::CursorInEditor{cursor, filePath},
[](const CppTools::Usages &) {});
}
TEST_F(RefactoringEngine, EngineIsNotUsableForUnusableServer) TEST_F(RefactoringEngine, EngineIsNotUsableForUnusableServer)
{ {
ASSERT_FALSE(engine.isRefactoringEngineAvailable()); ASSERT_FALSE(engine.isRefactoringEngineAvailable());