From 5956254e6f8676d3f409e1c55b0388cfdda3dd2e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 20 Feb 2024 16:23:25 +0100 Subject: 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: Reviewed-by: Christian Stenger Reviewed-by: Qt CI Bot --- src/plugins/clangcodemodel/clangmodelmanagersupport.cpp | 7 +++++-- src/plugins/clangcodemodel/clangmodelmanagersupport.h | 2 +- src/plugins/cppeditor/cppeditordocument.cpp | 2 +- src/plugins/cppeditor/cppmodelmanager.cpp | 2 +- src/plugins/cppeditor/cppmodelmanager.h | 4 +++- src/plugins/cppeditor/cppmodelmanagersupport.h | 8 +++++++- src/plugins/cppeditor/cppquickfix.h | 10 +++++++--- src/plugins/cppeditor/cppquickfix_test.cpp | 2 +- src/plugins/cppeditor/cppquickfixes.cpp | 9 ++++++--- src/plugins/cppeditor/cppquickfixes.h | 4 ++-- src/plugins/designer/qtcreatorintegration.cpp | 3 ++- 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 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 usesClangd(const TextEditor::TextDocument *document) const override; static QList 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 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 #include #include +#include #include #include +#include #include 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 usesClangd(const TextEditor::TextDocument *document); static bool isClangCodeModelActive(); static QSet 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 +#include + #include +#include 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 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 +#include + +#include + namespace CppEditor { namespace Internal { class CppQuickFixInterface; @@ -52,8 +56,8 @@ public: static const QList &cppQuickFixFactories(); - bool hasClangdReplacement() const { return m_hasClangdReplacement; } - void setHasClangdReplacement() { m_hasClangdReplacement = true; } + std::optional 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 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 &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)); -- cgit v1.2.3