diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2021-05-18 12:59:15 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2021-05-19 07:58:04 +0000 |
commit | 12fd21a88015d3e6e89bfeb8dd16b271e163da4a (patch) | |
tree | 4b5a814dc0750f671607c01ac24f481f9a72c1ae /src/plugins/cpptools/cppfindreferences.cpp | |
parent | 78274956d097603e164311db1fd448dc0df1eee9 (diff) | |
download | qt-creator-12fd21a88015d3e6e89bfeb8dd16b271e163da4a.tar.gz |
ClangCodeModel: Implement global renaming via clangd
Note that we do not use the LSP rename functionality. We do "manual"
renaming the same way as in the built-in code model, but based on the
references found by clangd.
Change-Id: Ifa5597efe5c89c8f9204a4f5323bc755544696cf
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Schulz <david.schulz@qt.io>
Diffstat (limited to 'src/plugins/cpptools/cppfindreferences.cpp')
-rw-r--r-- | src/plugins/cpptools/cppfindreferences.cpp | 95 |
1 files changed, 48 insertions, 47 deletions
diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 2ffb129adb..e93fc545ea 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -59,6 +59,8 @@ using namespace ProjectExplorer; namespace CppTools { +namespace { static bool isAllLowerCase(const QString &text) { return text.toLower() == text; } } + SearchResultColor::Style colorStyleForUsageType(CPlusPlus::Usage::Type type) { switch (type) { @@ -75,6 +77,51 @@ SearchResultColor::Style colorStyleForUsageType(CPlusPlus::Usage::Type type) return SearchResultColor::Style::Default; // For dumb compilers. } +void renameFilesForSymbol(const QString &oldSymbolName, const QString &newSymbolName, + const QVector<Node *> &files) +{ + Internal::CppFileSettings settings; + settings.fromSettings(Core::ICore::settings()); + + const QStringList newPaths = + Utils::transform<QList>(files, + [&oldSymbolName, newSymbolName, &settings](const Node *node) -> QString { + const QFileInfo fi = node->filePath().toFileInfo(); + const QString oldBaseName = fi.baseName(); + QString newBaseName = newSymbolName; + + // 1) new symbol lowercase: new base name lowercase + if (isAllLowerCase(newSymbolName)) { + newBaseName = newSymbolName; + + // 2) old base name mixed case: new base name is verbatim symbol name + } else if (!isAllLowerCase(oldBaseName)) { + newBaseName = newSymbolName; + + // 3) old base name lowercase, old symbol mixed case: new base name lowercase + } else if (!isAllLowerCase(oldSymbolName)) { + newBaseName = newSymbolName.toLower(); + + // 4) old base name lowercase, old symbol lowercase, new symbol mixed case: + // use the preferences setting for new base name case + } else if (settings.lowerCaseFiles) { + newBaseName = newSymbolName.toLower(); + } + + if (newBaseName == oldBaseName) + return QString(); + + return fi.absolutePath() + "/" + newBaseName + '.' + fi.completeSuffix(); + }); + + for (int i = 0; i < files.size(); ++i) { + if (!newPaths.at(i).isEmpty()) { + Node *node = files.at(i); + ProjectExplorerPlugin::renameFile(node, newPaths.at(i)); + } + } +} + QWidget *CppSearchResultFilter::createWidget() { const auto widget = new QWidget; @@ -469,11 +516,6 @@ void CppFindReferences::findAll_helper(SearchResult *search, CPlusPlus::Symbol * connect(progress, &FutureProgress::clicked, search, &SearchResult::popup); } -static bool isAllLowerCase(const QString &text) -{ - return text.toLower() == text; -} - void CppFindReferences::onReplaceButtonClicked(const QString &text, const QList<SearchResultItem> &items, bool preserveCase) @@ -495,48 +537,7 @@ void CppFindReferences::onReplaceButtonClicked(const QString &text, if (!renameFilesCheckBox || !renameFilesCheckBox->isChecked()) return; - CppFileSettings settings; - settings.fromSettings(Core::ICore::settings()); - - const QStringList newPaths = - Utils::transform<QList>(parameters.filesToRename, - [¶meters, text, &settings](const Node *node) -> QString { - const QFileInfo fi = node->filePath().toFileInfo(); - const QString oldSymbolName = parameters.prettySymbolName; - const QString oldBaseName = fi.baseName(); - const QString newSymbolName = text; - QString newBaseName = newSymbolName; - - // 1) new symbol lowercase: new base name lowercase - if (isAllLowerCase(newSymbolName)) { - newBaseName = newSymbolName; - - // 2) old base name mixed case: new base name is verbatim symbol name - } else if (!isAllLowerCase(oldBaseName)) { - newBaseName = newSymbolName; - - // 3) old base name lowercase, old symbol mixed case: new base name lowercase - } else if (!isAllLowerCase(oldSymbolName)) { - newBaseName = newSymbolName.toLower(); - - // 4) old base name lowercase, old symbol lowercase, new symbol mixed case: - // use the preferences setting for new base name case - } else if (settings.lowerCaseFiles) { - newBaseName = newSymbolName.toLower(); - } - - if (newBaseName == oldBaseName) - return QString(); - - return fi.absolutePath() + "/" + newBaseName + '.' + fi.completeSuffix(); - }); - - for (int i = 0; i < parameters.filesToRename.size(); ++i) { - if (!newPaths.at(i).isEmpty()) { - Node *node = parameters.filesToRename.at(i); - ProjectExplorerPlugin::renameFile(node, newPaths.at(i)); - } - } + renameFilesForSymbol(parameters.prettySymbolName, text, parameters.filesToRename); } void CppFindReferences::searchAgain() |