diff options
author | Christian Kandeler <[email protected]> | 2022-07-07 15:21:31 +0200 |
---|---|---|
committer | Christian Kandeler <[email protected]> | 2022-07-08 07:45:30 +0000 |
commit | 1fb4737d0d64019169ac69e8cf66b24acfbba5aa (patch) | |
tree | 569b1eae72cfd12522649c3340c96ceeaa644bff /src/plugins/clangcodemodel/clangdquickfixes.cpp | |
parent | 14216fdf7327cd0ee228eefb6a80b85834cb1c20 (diff) |
ClangCodeModel: Move quickfix functionality to dedicated set of files
Change-Id: I7cc55afa7aa50ba584593457b6c1393794866c56
Reviewed-by: <[email protected]>
Reviewed-by: David Schulz <[email protected]>
Diffstat (limited to 'src/plugins/clangcodemodel/clangdquickfixes.cpp')
-rw-r--r-- | src/plugins/clangcodemodel/clangdquickfixes.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/plugins/clangcodemodel/clangdquickfixes.cpp b/src/plugins/clangcodemodel/clangdquickfixes.cpp new file mode 100644 index 00000000000..556835b34dd --- /dev/null +++ b/src/plugins/clangcodemodel/clangdquickfixes.cpp @@ -0,0 +1,125 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "clangdquickfixes.h" + +#include "clangdclient.h" +#include "clangmodelmanagersupport.h" + +#include <texteditor/codeassist/genericproposal.h> + +using namespace LanguageClient; +using namespace LanguageServerProtocol; +using namespace TextEditor; + +namespace ClangCodeModel { +namespace Internal { + +ClangdQuickFixFactory::ClangdQuickFixFactory() = default; + +void ClangdQuickFixFactory::match(const CppEditor::Internal::CppQuickFixInterface &interface, + QuickFixOperations &result) +{ + const auto client = ClangModelManagerSupport::instance()->clientForFile(interface.filePath()); + if (!client) + return; + + const auto uri = DocumentUri::fromFilePath(interface.filePath()); + QTextCursor cursor(interface.textDocument()); + cursor.setPosition(interface.position()); + cursor.select(QTextCursor::LineUnderCursor); + const QList<Diagnostic> &diagnostics = client->diagnosticsAt(uri, cursor); + for (const Diagnostic &diagnostic : diagnostics) { + ClangdDiagnostic clangdDiagnostic(diagnostic); + if (const auto actions = clangdDiagnostic.codeActions()) { + for (const CodeAction &action : *actions) + result << new LanguageClient::CodeActionQuickFixOperation(action, client); + } + } +} + +class ClangdQuickFixProcessor : public LanguageClientQuickFixAssistProcessor +{ +public: + ClangdQuickFixProcessor(LanguageClient::Client *client) + : LanguageClientQuickFixAssistProcessor(client) + { + } + +private: + IAssistProposal *perform(const AssistInterface *interface) override + { + m_interface = interface; + + // Step 1: Collect clangd code actions asynchronously + LanguageClientQuickFixAssistProcessor::perform(interface); + + // Step 2: Collect built-in quickfixes synchronously + m_builtinOps = CppEditor::quickFixOperations(interface); + + return nullptr; + } + + TextEditor::GenericProposal *handleCodeActionResult(const CodeActionResult &result) override + { + auto toOperation = + [=](const Utils::variant<Command, CodeAction> &item) -> QuickFixOperation * { + if (auto action = Utils::get_if<CodeAction>(&item)) { + const Utils::optional<QList<Diagnostic>> diagnostics = action->diagnostics(); + if (!diagnostics.has_value() || diagnostics->isEmpty()) + return new CodeActionQuickFixOperation(*action, client()); + } + if (auto command = Utils::get_if<Command>(&item)) + return new CommandQuickFixOperation(*command, client()); + return nullptr; + }; + + if (auto list = Utils::get_if<QList<Utils::variant<Command, CodeAction>>>(&result)) { + QuickFixOperations ops; + for (const Utils::variant<Command, CodeAction> &item : *list) { + if (QuickFixOperation *op = toOperation(item)) { + op->setDescription("clangd: " + op->description()); + ops << op; + } + } + return GenericProposal::createProposal(m_interface, ops + m_builtinOps); + } + return nullptr; + } + + QuickFixOperations m_builtinOps; + const AssistInterface *m_interface = nullptr; +}; + +ClangdQuickFixProvider::ClangdQuickFixProvider(ClangdClient *client) + : LanguageClientQuickFixProvider(client) {} + +IAssistProcessor *ClangdQuickFixProvider::createProcessor(const AssistInterface *) const +{ + return new ClangdQuickFixProcessor(client()); +} + +} // namespace Internal +} // namespace ClangCodeModel |