aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2024-02-20 16:23:25 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2024-02-21 10:02:07 +0000
commit5956254e6f8676d3f409e1c55b0388cfdda3dd2e (patch)
tree5ed9e72bcc4740612d7c9b3da78447c8ebf970aa
parentb9e4c98f1d0c9aac74ada21e1bd43795063b92d5 (diff)
CppEditor: Make check for clangd more fine-grained
... in the quickfix factories. We want to be able to offer or not offer certain quickfixes based on the current clangd version. Change-Id: I7dca69ff990ab9f1a691785cd72e633f7882ae3d Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Christian Stenger <christian.stenger@qt.io> Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r--src/plugins/clangcodemodel/clangmodelmanagersupport.cpp7
-rw-r--r--src/plugins/clangcodemodel/clangmodelmanagersupport.h2
-rw-r--r--src/plugins/cppeditor/cppeditordocument.cpp2
-rw-r--r--src/plugins/cppeditor/cppmodelmanager.cpp2
-rw-r--r--src/plugins/cppeditor/cppmodelmanager.h4
-rw-r--r--src/plugins/cppeditor/cppmodelmanagersupport.h8
-rw-r--r--src/plugins/cppeditor/cppquickfix.h10
-rw-r--r--src/plugins/cppeditor/cppquickfix_test.cpp2
-rw-r--r--src/plugins/cppeditor/cppquickfixes.cpp9
-rw-r--r--src/plugins/cppeditor/cppquickfixes.h4
-rw-r--r--src/plugins/designer/qtcreatorintegration.cpp3
11 files changed, 36 insertions, 17 deletions
diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp
index 3c3fc18c91..ddb928f5e9 100644
--- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp
+++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp
@@ -428,9 +428,12 @@ void ClangModelManagerSupport::checkUnused(const Link &link, SearchResult *searc
CppModelManager::Backend::Builtin)->checkUnused(link, search, callback);
}
-bool ClangModelManagerSupport::usesClangd(const TextEditor::TextDocument *document) const
+std::optional<QVersionNumber> ClangModelManagerSupport::usesClangd(
+ const TextEditor::TextDocument *document) const
{
- return clientForFile(document->filePath());
+ if (const auto client = clientForFile(document->filePath()))
+ return client->versionNumber();
+ return {};
}
BaseEditorDocumentProcessor *ClangModelManagerSupport::createEditorDocumentProcessor(
diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.h b/src/plugins/clangcodemodel/clangmodelmanagersupport.h
index a598bea8bb..839e71deb6 100644
--- a/src/plugins/clangcodemodel/clangmodelmanagersupport.h
+++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.h
@@ -42,7 +42,7 @@ public:
CppEditor::BaseEditorDocumentProcessor *createEditorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) override;
- bool usesClangd(const TextEditor::TextDocument *document) const override;
+ std::optional<QVersionNumber> usesClangd(const TextEditor::TextDocument *document) const override;
static QList<LanguageClient::Client *> clientsForOpenProjects();
static ClangdClient *clientForProject(const ProjectExplorer::Project *project);
diff --git a/src/plugins/cppeditor/cppeditordocument.cpp b/src/plugins/cppeditor/cppeditordocument.cpp
index badd02b751..459ae32977 100644
--- a/src/plugins/cppeditor/cppeditordocument.cpp
+++ b/src/plugins/cppeditor/cppeditordocument.cpp
@@ -475,7 +475,7 @@ bool CppEditorDocument::saveImpl(QString *errorString, const FilePath &filePath,
bool CppEditorDocument::usesClangd() const
{
- return CppModelManager::usesClangd(this);
+ return CppModelManager::usesClangd(this).has_value();
}
void CppEditorDocument::onDiagnosticsChanged(const FilePath &fileName, const QString &kind)
diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp
index 27aab615b7..a6e6251898 100644
--- a/src/plugins/cppeditor/cppmodelmanager.cpp
+++ b/src/plugins/cppeditor/cppmodelmanager.cpp
@@ -1714,7 +1714,7 @@ bool CppModelManager::isCppEditor(IEditor *editor)
return editor->context().contains(ProjectExplorer::Constants::CXX_LANGUAGE_ID);
}
-bool CppModelManager::usesClangd(const TextEditor::TextDocument *document)
+std::optional<QVersionNumber> CppModelManager::usesClangd(const TextEditor::TextDocument *document)
{
return d->m_activeModelManagerSupport->usesClangd(document);
}
diff --git a/src/plugins/cppeditor/cppmodelmanager.h b/src/plugins/cppeditor/cppmodelmanager.h
index 0fe9e151ae..77cb212c6e 100644
--- a/src/plugins/cppeditor/cppmodelmanager.h
+++ b/src/plugins/cppeditor/cppmodelmanager.h
@@ -19,9 +19,11 @@
#include <QFuture>
#include <QObject>
#include <QStringList>
+#include <QVersionNumber>
#include <functional>
#include <memory>
+#include <optional>
#include <utility>
namespace Core {
@@ -132,7 +134,7 @@ public:
static void emitAbstractEditorSupportRemoved(const QString &filePath);
static bool isCppEditor(Core::IEditor *editor);
- static bool usesClangd(const TextEditor::TextDocument *document);
+ static std::optional<QVersionNumber> usesClangd(const TextEditor::TextDocument *document);
static bool isClangCodeModelActive();
static QSet<AbstractEditorSupport*> abstractEditorSupports();
diff --git a/src/plugins/cppeditor/cppmodelmanagersupport.h b/src/plugins/cppeditor/cppmodelmanagersupport.h
index c2c463df59..ca90d6758b 100644
--- a/src/plugins/cppeditor/cppmodelmanagersupport.h
+++ b/src/plugins/cppeditor/cppmodelmanagersupport.h
@@ -9,7 +9,10 @@
#include <utils/link.h>
+#include <QVersionNumber>
+
#include <functional>
+#include <optional>
namespace Core { class SearchResult; }
namespace TextEditor {
@@ -31,7 +34,10 @@ public:
virtual BaseEditorDocumentProcessor *createEditorDocumentProcessor(
TextEditor::TextDocument *baseTextDocument) = 0;
- virtual bool usesClangd(const TextEditor::TextDocument *) const { return false; }
+ virtual std::optional<QVersionNumber> usesClangd(const TextEditor::TextDocument *) const
+ {
+ return {};
+ }
virtual void followSymbol(const CursorInEditor &data,
const Utils::LinkHandler &processLinkCallback,
diff --git a/src/plugins/cppeditor/cppquickfix.h b/src/plugins/cppeditor/cppquickfix.h
index eab753ad6b..e901b2bd30 100644
--- a/src/plugins/cppeditor/cppquickfix.h
+++ b/src/plugins/cppeditor/cppquickfix.h
@@ -8,6 +8,10 @@
#include <texteditor/quickfix.h>
+#include <QVersionNumber>
+
+#include <optional>
+
namespace CppEditor {
namespace Internal {
class CppQuickFixInterface;
@@ -52,8 +56,8 @@ public:
static const QList<CppQuickFixFactory *> &cppQuickFixFactories();
- bool hasClangdReplacement() const { return m_hasClangdReplacement; }
- void setHasClangdReplacement() { m_hasClangdReplacement = true; }
+ std::optional<QVersionNumber> clangdReplacement() const { return m_clangdReplacement; }
+ void setClangdReplacement(const QVersionNumber &version) { m_clangdReplacement = version; }
private:
/*!
@@ -63,7 +67,7 @@ private:
virtual void doMatch(const Internal::CppQuickFixInterface &interface,
QuickFixOperations &result) = 0;
- bool m_hasClangdReplacement = false;
+ std::optional<QVersionNumber> m_clangdReplacement;
};
} // namespace CppEditor
diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp
index 56ae513a8a..d6de78b376 100644
--- a/src/plugins/cppeditor/cppquickfix_test.cpp
+++ b/src/plugins/cppeditor/cppquickfix_test.cpp
@@ -191,7 +191,7 @@ QuickFixOperationTest::QuickFixOperationTest(const QList<TestDocumentPtr> &testD
const QByteArray &clangFormatSettings)
: BaseQuickFixTestCase(testDocuments, headerPaths, clangFormatSettings)
{
- if (factory->hasClangdReplacement() && CppModelManager::isClangCodeModelActive())
+ if (factory->clangdReplacement() && CppModelManager::isClangCodeModelActive())
return;
QVERIFY(succeededSoFar());
diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp
index bf3f137511..df6c76bcf6 100644
--- a/src/plugins/cppeditor/cppquickfixes.cpp
+++ b/src/plugins/cppeditor/cppquickfixes.cpp
@@ -104,9 +104,12 @@ CppQuickFixFactory::~CppQuickFixFactory()
void CppQuickFixFactory::match(const Internal::CppQuickFixInterface &interface,
QuickFixOperations &result)
{
- if (m_hasClangdReplacement
- && CppModelManager::usesClangd(interface.currentFile()->editor()->textDocument())) {
- return;
+ if (m_clangdReplacement) {
+ if (const auto clangdVersion = CppModelManager::usesClangd(
+ interface.currentFile()->editor()->textDocument());
+ clangdVersion && clangdVersion >= m_clangdReplacement) {
+ return;
+ }
}
doMatch(interface, result);
diff --git a/src/plugins/cppeditor/cppquickfixes.h b/src/plugins/cppeditor/cppquickfixes.h
index 10f82c9dda..bd47b318c7 100644
--- a/src/plugins/cppeditor/cppquickfixes.h
+++ b/src/plugins/cppeditor/cppquickfixes.h
@@ -338,7 +338,7 @@ public:
class CompleteSwitchCaseStatement: public CppQuickFixFactory
{
public:
- CompleteSwitchCaseStatement() { setHasClangdReplacement(); }
+ CompleteSwitchCaseStatement() { setClangdReplacement({12}); }
private:
void doMatch(const CppQuickFixInterface &interface, QuickFixOperations &result) override;
@@ -580,7 +580,7 @@ public:
class RemoveUsingNamespace : public CppQuickFixFactory
{
public:
- RemoveUsingNamespace() { setHasClangdReplacement(); }
+ RemoveUsingNamespace() { setClangdReplacement({10}); }
private:
void doMatch(const CppQuickFixInterface &interface, TextEditor::QuickFixOperations &result) override;
diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp
index 267e0ddeeb..2da21f0e54 100644
--- a/src/plugins/designer/qtcreatorintegration.cpp
+++ b/src/plugins/designer/qtcreatorintegration.cpp
@@ -747,7 +747,8 @@ void QtCreatorIntegration::handleSymbolRenameStage2(
// In the case of clangd, this entails doing a "virtual rename" on the TextDocument,
// as the LanguageClient cannot be forced into taking a document and assuming a different
// file path.
- const bool usesClangd = CppEditor::CppModelManager::usesClangd(editorWidget->textDocument());
+ const bool usesClangd
+ = CppEditor::CppModelManager::usesClangd(editorWidget->textDocument()).has_value();
if (usesClangd)
editorWidget->textDocument()->setFilePath(uiHeader);
editorWidget->textDocument()->setPlainText(QString::fromUtf8(virtualContent));