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