From b09e2b77c4c692a05c03e851430e8fc3efd27071 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 28 Apr 2022 17:56:39 +0200 Subject: [PATCH] ClangCodeModel: Remove backend communication facilities Change-Id: I3d10b33cb641a49e8b79272d754fbeece23fb249 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/CMakeLists.txt | 4 - .../clangbackendcommunicator.cpp | 433 ------------------ .../clangcodemodel/clangbackendcommunicator.h | 118 ----- .../clangcodemodel/clangbackendlogging.cpp | 34 -- .../clangcodemodel/clangbackendlogging.h | 35 -- .../clangcodemodel/clangbackendreceiver.cpp | 267 ----------- .../clangcodemodel/clangbackendreceiver.h | 85 ---- .../clangcodemodel/clangbackendsender.cpp | 131 ------ .../clangcodemodel/clangbackendsender.h | 61 --- src/plugins/clangcodemodel/clangcodemodel.qbs | 8 - 10 files changed, 1176 deletions(-) delete mode 100644 src/plugins/clangcodemodel/clangbackendcommunicator.cpp delete mode 100644 src/plugins/clangcodemodel/clangbackendcommunicator.h delete mode 100644 src/plugins/clangcodemodel/clangbackendlogging.cpp delete mode 100644 src/plugins/clangcodemodel/clangbackendlogging.h delete mode 100644 src/plugins/clangcodemodel/clangbackendreceiver.cpp delete mode 100644 src/plugins/clangcodemodel/clangbackendreceiver.h delete mode 100644 src/plugins/clangcodemodel/clangbackendsender.cpp delete mode 100644 src/plugins/clangcodemodel/clangbackendsender.h diff --git a/src/plugins/clangcodemodel/CMakeLists.txt b/src/plugins/clangcodemodel/CMakeLists.txt index 27f7f1b2a4e..5fe46c44097 100644 --- a/src/plugins/clangcodemodel/CMakeLists.txt +++ b/src/plugins/clangcodemodel/CMakeLists.txt @@ -11,10 +11,6 @@ add_qtc_plugin(ClangCodeModel SOURCES clangactivationsequencecontextprocessor.cpp clangactivationsequencecontextprocessor.h clangactivationsequenceprocessor.cpp clangactivationsequenceprocessor.h - clangbackendcommunicator.cpp clangbackendcommunicator.h - clangbackendlogging.cpp clangbackendlogging.h - clangbackendreceiver.cpp clangbackendreceiver.h - clangbackendsender.cpp clangbackendsender.h clangcodemodelplugin.cpp clangcodemodelplugin.h clangcompletioncontextanalyzer.cpp clangcompletioncontextanalyzer.h clangconstants.h diff --git a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp b/src/plugins/clangcodemodel/clangbackendcommunicator.cpp deleted file mode 100644 index c1b3ace7d22..00000000000 --- a/src/plugins/clangcodemodel/clangbackendcommunicator.cpp +++ /dev/null @@ -1,433 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 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 "clangbackendcommunicator.h" - -#include "clangbackendlogging.h" -#include "clangmodelmanagersupport.h" -#include "clangutils.h" - -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include - -#include -#include -#include - -using namespace CPlusPlus; -using namespace ClangBackEnd; -using namespace TextEditor; -using namespace Utils; - -enum { backEndStartTimeOutInMs = 10000 }; - -static QString backendProcessPath() -{ - return Core::ICore::libexecPath("clangbackend" QTC_HOST_EXE_SUFFIX).toString(); -} - -namespace ClangCodeModel { -namespace Internal { - -class DummyBackendSender : public ClangBackEnd::ClangCodeModelServerInterface -{ -public: - void end() override {} - - void documentsOpened(const DocumentsOpenedMessage &) override {} - void documentsChanged(const DocumentsChangedMessage &) override {} - void documentsClosed(const DocumentsClosedMessage &) override {} - void documentVisibilityChanged(const DocumentVisibilityChangedMessage &) override {} - - void unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &) override {} - void unsavedFilesRemoved(const UnsavedFilesRemovedMessage &) override {} - - void requestCompletions(const RequestCompletionsMessage &) override {} - void requestAnnotations(const RequestAnnotationsMessage &) override {} - void requestReferences(const RequestReferencesMessage &) override {} - void requestFollowSymbol(const RequestFollowSymbolMessage &) override {} - void requestToolTip(const RequestToolTipMessage &) override {} -}; - -BackendCommunicator::BackendCommunicator() - : m_connection(&m_receiver) - , m_sender(new DummyBackendSender()) -{ - m_backendStartTimeOut.setSingleShot(true); - connect(&m_backendStartTimeOut, &QTimer::timeout, - this, &BackendCommunicator::logStartTimeOut); - - m_receiver.setAliveHandler([this]() { m_connection.resetProcessAliveTimer(); }); - - connect(Core::ICore::instance(), &Core::ICore::coreAboutToClose, - this, &BackendCommunicator::setupDummySender); - auto globalFCB = GlobalFileChangeBlocker::instance(); - m_postponeBackendJobs = globalFCB->isBlocked(); - connect(globalFCB, &GlobalFileChangeBlocker::stateChanged, - this, &BackendCommunicator::setBackendJobsPostponed); - - initializeBackend(); -} - -BackendCommunicator::~BackendCommunicator() -{ - disconnect(&m_connection, nullptr, this, nullptr); -} - -void BackendCommunicator::initializeBackend() -{ - const QString clangBackEndProcessPath = backendProcessPath(); - if (!QFileInfo::exists(clangBackEndProcessPath)) { - logExecutableDoesNotExist(); - return; - } - qCDebug(ipcLog) << "Starting" << clangBackEndProcessPath; - - m_connection.setProcessAliveTimerInterval(30 * 1000); - m_connection.setProcessPath(clangBackEndProcessPath); - - connect(&m_connection, &ConnectionClient::connectedToLocalSocket, - this, &BackendCommunicator::onConnectedToBackend); - connect(&m_connection, &ConnectionClient::disconnectedFromLocalSocket, - this, &BackendCommunicator::setupDummySender); - - m_connection.startProcessAndConnectToServerAsynchronously(); - m_backendStartTimeOut.start(backEndStartTimeOutInMs); -} - -namespace { -void removeDuplicates(Utf8StringVector &visibleEditorDocumentsFilePaths) -{ - std::sort(visibleEditorDocumentsFilePaths.begin(), - visibleEditorDocumentsFilePaths.end()); - const auto end = std::unique(visibleEditorDocumentsFilePaths.begin(), - visibleEditorDocumentsFilePaths.end()); - visibleEditorDocumentsFilePaths.erase(end, - visibleEditorDocumentsFilePaths.end()); -} - -void removeNonCppEditors(QList &visibleEditors) -{ - const auto isNotCppEditor = [] (Core::IEditor *editor) { - return !CppEditor::CppModelManager::isCppEditor(editor); - }; - - const auto end = std::remove_if(visibleEditors.begin(), - visibleEditors.end(), - isNotCppEditor); - - visibleEditors.erase(end, visibleEditors.end()); -} - -Utf8StringVector visibleCppEditorDocumentsFilePaths() -{ - auto visibleEditors = Core::EditorManager::visibleEditors(); - - removeNonCppEditors(visibleEditors); - - Utf8StringVector visibleCppEditorDocumentsFilePaths; - visibleCppEditorDocumentsFilePaths.reserve(visibleEditors.size()); - - const auto editorFilePaths = [] (Core::IEditor *editor) { - return Utf8String(editor->document()->filePath().toString()); - }; - - std::transform(visibleEditors.begin(), - visibleEditors.end(), - std::back_inserter(visibleCppEditorDocumentsFilePaths), - editorFilePaths); - - removeDuplicates(visibleCppEditorDocumentsFilePaths); - - return visibleCppEditorDocumentsFilePaths; -} - -} - -void BackendCommunicator::documentVisibilityChanged() -{ - documentVisibilityChanged(currentCppEditorDocumentFilePath(), - visibleCppEditorDocumentsFilePaths()); -} - -void BackendCommunicator::setBackendJobsPostponed(bool postponed) -{ - if (postponed) { - documentVisibilityChanged(Utf8String(), {}); - m_postponeBackendJobs = postponed; - } else { - m_postponeBackendJobs = postponed; - documentVisibilityChanged(); - } -} - -void BackendCommunicator::documentVisibilityChanged(const Utf8String ¤tEditorFilePath, - const Utf8StringVector &visibleEditorsFilePaths) -{ - if (m_postponeBackendJobs) - return; - - const DocumentVisibilityChangedMessage message(currentEditorFilePath, visibleEditorsFilePaths); - m_sender->documentVisibilityChanged(message); -} - -void BackendCommunicator::restoreCppEditorDocuments() -{ - resetCppEditorDocumentProcessors(); - CppEditor::CppModelManager::instance()->updateCppEditorDocuments(); -} - -void BackendCommunicator::resetCppEditorDocumentProcessors() -{ - using namespace CppEditor; - - const auto cppEditorDocuments = CppModelManager::instance()->cppEditorDocuments(); - foreach (CppEditorDocumentHandle *cppEditorDocument, cppEditorDocuments) - cppEditorDocument->resetProcessor(); -} - -void BackendCommunicator::unsavedFilesUpdatedForUiHeaders() -{ - using namespace CppEditor; - - const auto editorSupports = CppModelManager::instance()->abstractEditorSupports(); - foreach (const AbstractEditorSupport *es, editorSupports) { - const QString mappedPath - = ClangModelManagerSupport::instance()->dummyUiHeaderOnDiskPath(es->fileName()); - unsavedFilesUpdated(mappedPath, es->contents(), es->revision()); - } -} - -void BackendCommunicator::documentsChangedFromCppEditorDocument(const QString &filePath) -{ - const CppEditor::CppEditorDocumentHandle *document = cppDocument(filePath); - QTC_ASSERT(document, return); - documentsChanged(filePath, document->contents(), document->revision()); -} - -void BackendCommunicator::unsavedFilesUpdatedFromCppEditorDocument(const QString &filePath) -{ - const CppEditor::CppEditorDocumentHandle *document = cppDocument(filePath); - QTC_ASSERT(document, return); - unsavedFilesUpdated(filePath, document->contents(), document->revision()); -} - -void BackendCommunicator::documentsChanged(const QString &filePath, - const QByteArray &contents, - uint documentRevision) -{ - const bool hasUnsavedContent = true; - - documentsChanged({{filePath, - Utf8String::fromByteArray(contents), - hasUnsavedContent, - documentRevision}}); -} - -void BackendCommunicator::unsavedFilesUpdated(const QString &filePath, - const QByteArray &contents, - uint documentRevision) -{ - const bool hasUnsavedContent = true; - - // TODO: Send new only if changed - unsavedFilesUpdated({{filePath, - Utf8String::fromByteArray(contents), - hasUnsavedContent, - documentRevision}}); -} - -static bool documentHasChanged(const QString &filePath, uint revision) -{ - if (CppEditor::CppEditorDocumentHandle *document = cppDocument(filePath)) - return document->sendTracker().shouldSendRevision(revision); - - return true; -} - -void BackendCommunicator::documentsChangedWithRevisionCheck(const FileContainer &fileContainer) -{ - if (documentHasChanged(fileContainer.filePath, fileContainer.documentRevision)) { - documentsChanged({fileContainer}); - setLastSentDocumentRevision(fileContainer.filePath, - fileContainer.documentRevision); - } -} - -void BackendCommunicator::documentsChangedWithRevisionCheck(Core::IDocument *document) -{ - const auto textDocument = qobject_cast(document); - const auto filePath = textDocument->filePath().toString(); - - documentsChangedWithRevisionCheck( - FileContainer(filePath, {}, {}, textDocument->document()->revision())); -} - -void BackendCommunicator::updateChangeContentStartPosition(const QString &filePath, int position) -{ - if (CppEditor::CppEditorDocumentHandle *document = cppDocument(filePath)) - document->sendTracker().applyContentChange(position); -} - -void BackendCommunicator::documentsChangedIfNotCurrentDocument(Core::IDocument *document) -{ - QTC_ASSERT(document, return); - if (Core::EditorManager::currentDocument() != document) - documentsChanged(document); -} - -void BackendCommunicator::documentsChanged(Core::IDocument *document) -{ - documentsChangedFromCppEditorDocument(document->filePath().toString()); -} - -void BackendCommunicator::unsavedFilesUpdated(Core::IDocument *document) -{ - QTC_ASSERT(document, return); - - unsavedFilesUpdatedFromCppEditorDocument(document->filePath().toString()); -} - -void BackendCommunicator::onConnectedToBackend() -{ - m_backendStartTimeOut.stop(); - - ++m_connectedCount; - if (m_connectedCount > 1) - logRestartedDueToUnexpectedFinish(); - - m_receiver.reset(); - m_sender.reset(new BackendSender(&m_connection)); - - initializeBackendWithCurrentData(); -} - -void BackendCommunicator::setupDummySender() -{ - m_sender.reset(new DummyBackendSender); -} - -void BackendCommunicator::logExecutableDoesNotExist() -{ - const QString msg - = tr("Clang Code Model: Error: " - "The clangbackend executable \"%1\" does not exist.") - .arg(QDir::toNativeSeparators(backendProcessPath())); - - logError(msg); -} - -void BackendCommunicator::logStartTimeOut() -{ - const QString msg - = tr("Clang Code Model: Error: " - "The clangbackend executable \"%1\" could not be started (timeout after %2ms).") - .arg(QDir::toNativeSeparators(backendProcessPath())) - .arg(backEndStartTimeOutInMs); - - logError(msg); -} - -void BackendCommunicator::logRestartedDueToUnexpectedFinish() -{ - const QString msg - = tr("Clang Code Model: Error: " - "The clangbackend process has finished unexpectedly and was restarted."); - - logError(msg); -} - -void BackendCommunicator::logError(const QString &text) -{ - const QString textWithTimestamp = QDateTime::currentDateTime().toString(Qt::ISODate) - + ' ' + text; - Core::MessageManager::writeFlashing(textWithTimestamp); - qWarning("%s", qPrintable(textWithTimestamp)); -} - -void BackendCommunicator::initializeBackendWithCurrentData() -{ - unsavedFilesUpdatedForUiHeaders(); - restoreCppEditorDocuments(); - documentVisibilityChanged(); -} - -void BackendCommunicator::documentsOpened(const FileContainers &fileContainers) -{ - Utf8String currentDocument; - Utf8StringVector visibleDocuments; - if (!m_postponeBackendJobs) { - currentDocument = currentCppEditorDocumentFilePath(); - visibleDocuments = visibleCppEditorDocumentsFilePaths(); - } - - const DocumentsOpenedMessage message(fileContainers, currentDocument, visibleDocuments); - m_sender->documentsOpened(message); -} - -void BackendCommunicator::documentsChanged(const FileContainers &fileContainers) -{ - const DocumentsChangedMessage message(fileContainers); - m_sender->documentsChanged(message); -} - -void BackendCommunicator::documentsClosed(const FileContainers &fileContainers) -{ - const DocumentsClosedMessage message(fileContainers); - m_sender->documentsClosed(message); - documentVisibilityChanged(); // QTCREATORBUG-25193 -} - -void BackendCommunicator::unsavedFilesUpdated(const FileContainers &fileContainers) -{ - const UnsavedFilesUpdatedMessage message(fileContainers); - m_sender->unsavedFilesUpdated(message); -} - -void BackendCommunicator::unsavedFilesRemoved(const FileContainers &fileContainers) -{ - const UnsavedFilesRemovedMessage message(fileContainers); - m_sender->unsavedFilesRemoved(message); -} - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangbackendcommunicator.h b/src/plugins/clangcodemodel/clangbackendcommunicator.h deleted file mode 100644 index 969427a2b01..00000000000 --- a/src/plugins/clangcodemodel/clangbackendcommunicator.h +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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. -** -****************************************************************************/ - -#pragma once - -#include "clangbackendreceiver.h" -#include "clangbackendsender.h" - -#include - -#include -#include - -#include -#include -#include -#include - -namespace Core { -class IEditor; -class IDocument; -} - -namespace TextEditor { class IAssistProcessor; } - -namespace ClangCodeModel { -namespace Internal { - -class BackendCommunicator : public QObject -{ - Q_OBJECT - -public: - using FileContainer = ClangBackEnd::FileContainer; - using FileContainers = QVector; - using LocalUseMap = CppEditor::SemanticInfo::LocalUseMap; - -public: - BackendCommunicator(); - ~BackendCommunicator() override; - - void documentsOpened(const FileContainers &fileContainers); - void documentsChanged(Core::IDocument *document); - void documentsChanged(const QString &filePath, - const QByteArray &contents, - uint documentRevision); - void documentsChanged(const FileContainers &fileContainers); - void documentsChangedFromCppEditorDocument(const QString &filePath); - void documentsChangedIfNotCurrentDocument(Core::IDocument *document); - void documentsChangedWithRevisionCheck(const ClangBackEnd::FileContainer &fileContainer); - void documentsChangedWithRevisionCheck(Core::IDocument *document); - void documentsClosed(const FileContainers &fileContainers); - void documentVisibilityChanged(); - - void unsavedFilesUpdated(Core::IDocument *document); - void unsavedFilesUpdated(const QString &filePath, - const QByteArray &contents, - uint documentRevision); - void unsavedFilesUpdated(const FileContainers &fileContainers); - void unsavedFilesUpdatedFromCppEditorDocument(const QString &filePath); - void unsavedFilesRemoved(const FileContainers &fileContainers); - - void updateChangeContentStartPosition(const QString &filePath, int position); - - void setBackendJobsPostponed(bool postponed); - -private: - void initializeBackend(); - void initializeBackendWithCurrentData(); - void restoreCppEditorDocuments(); - void resetCppEditorDocumentProcessors(); - void unsavedFilesUpdatedForUiHeaders(); - - void setupDummySender(); - - void onConnectedToBackend(); - - void logExecutableDoesNotExist(); - void logRestartedDueToUnexpectedFinish(); - void logStartTimeOut(); - void logError(const QString &text); - - void documentVisibilityChanged(const Utf8String ¤tEditorFilePath, - const Utf8StringVector &visibleEditorsFilePaths); - -private: - BackendReceiver m_receiver; - ClangBackEnd::ClangCodeModelConnectionClient m_connection; - QTimer m_backendStartTimeOut; - QScopedPointer m_sender; - int m_connectedCount = 0; - bool m_postponeBackendJobs = false; -}; - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangbackendlogging.cpp b/src/plugins/clangcodemodel/clangbackendlogging.cpp deleted file mode 100644 index e7074fe0415..00000000000 --- a/src/plugins/clangcodemodel/clangbackendlogging.cpp +++ /dev/null @@ -1,34 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 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 "clangbackendlogging.h" - -namespace ClangCodeModel { -namespace Internal { - -Q_LOGGING_CATEGORY(ipcLog, "qtc.clangcodemodel.ipc", QtWarningMsg) - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangbackendlogging.h b/src/plugins/clangcodemodel/clangbackendlogging.h deleted file mode 100644 index 6e2e3ec6893..00000000000 --- a/src/plugins/clangcodemodel/clangbackendlogging.h +++ /dev/null @@ -1,35 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 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. -** -****************************************************************************/ - -#pragma once - -#include - -namespace ClangCodeModel { namespace Internal { - -Q_DECLARE_LOGGING_CATEGORY(ipcLog) - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.cpp b/src/plugins/clangcodemodel/clangbackendreceiver.cpp deleted file mode 100644 index c1b435de4a8..00000000000 --- a/src/plugins/clangcodemodel/clangbackendreceiver.cpp +++ /dev/null @@ -1,267 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 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 "clangbackendreceiver.h" - -#include "clangbackendlogging.h" - -#include "clangeditordocumentprocessor.h" - -#include - -#include -#include - -#include - -#define qCDebugIpc() qCDebug(ipcLog) << "<====" - -namespace ClangCodeModel { -namespace Internal { - -static bool printAliveMessageHelper() -{ - const bool print = qEnvironmentVariableIntValue("QTC_CLANG_FORCE_VERBOSE_ALIVE"); - if (!print) { - qCDebug(ipcLog) << "Hint: AliveMessage will not be printed. " - "Force it by setting QTC_CLANG_FORCE_VERBOSE_ALIVE=1."; - } - - return print; -} - -static bool printAliveMessage() -{ - static bool print = ipcLog().isDebugEnabled() ? printAliveMessageHelper() : false; - return print; -} - -BackendReceiver::BackendReceiver() = default; - -BackendReceiver::~BackendReceiver() -{ - reset(); -} - -void BackendReceiver::setAliveHandler(const BackendReceiver::AliveHandler &handler) -{ - m_aliveHandler = handler; -} - -void BackendReceiver::reset() -{ - // Clean up futures for references; TODO: Remove duplication - for (ReferencesEntry &entry : m_referencesTable) { - entry.futureInterface.cancel(); - entry.futureInterface.reportFinished(); - } - m_referencesTable.clear(); - for (QFutureInterface &futureInterface : m_followTable) { - futureInterface.cancel(); - futureInterface.reportFinished(); - } - m_followTable.clear(); - for (QFutureInterface &futureInterface : m_toolTipsTable) { - futureInterface.cancel(); - futureInterface.reportFinished(); - } - m_toolTipsTable.clear(); -} - -void BackendReceiver::alive() -{ - if (printAliveMessage()) - qCDebugIpc() << "AliveMessage"; - QTC_ASSERT(m_aliveHandler, return); - m_aliveHandler(); -} - -void BackendReceiver::echo(const ClangBackEnd::EchoMessage &message) -{ - qCDebugIpc() << message; -} - -void BackendReceiver::completions(const ClangBackEnd::CompletionsMessage &message) -{ - qCDebugIpc() << "CompletionsMessage with" << message.codeCompletions.size() - << "items"; -} - -void BackendReceiver::annotations(const ClangBackEnd::AnnotationsMessage &message) -{ - qCDebugIpc() << "AnnotationsMessage" - << "for" << QFileInfo(message.fileContainer.filePath).fileName() << "with" - << message.diagnostics.size() << "diagnostics" << message.tokenInfos.size() - << "token infos" << message.skippedPreprocessorRanges.size() - << "skipped preprocessor ranges"; -} - -static -CppEditor::CursorInfo::Range toCursorInfoRange(const ClangBackEnd::SourceRangeContainer &sourceRange) -{ - const ClangBackEnd::SourceLocationContainer &start = sourceRange.start; - const ClangBackEnd::SourceLocationContainer &end = sourceRange.end; - const int length = end.column - start.column; - - return {start.line, start.column, length}; -} - -static -CppEditor::CursorInfo toCursorInfo(const CppEditor::SemanticInfo::LocalUseMap &localUses, - const ClangBackEnd::ReferencesMessage &message) -{ - CppEditor::CursorInfo result; - const QVector &references = message.references; - - result.areUseRangesForLocalVariable = message.isLocalVariable; - for (const ClangBackEnd::SourceRangeContainer &reference : references) - result.useRanges.append(toCursorInfoRange(reference)); - - result.useRanges.reserve(references.size()); - result.localUses = localUses; - - return result; -} - -static -CppEditor::SymbolInfo toSymbolInfo(const ClangBackEnd::FollowSymbolMessage &message) -{ - CppEditor::SymbolInfo result; - const ClangBackEnd::SourceRangeContainer &range = message.result.range; - - const ClangBackEnd::SourceLocationContainer &start = range.start; - const ClangBackEnd::SourceLocationContainer &end = range.end; - result.startLine = start.line; - result.startColumn = start.column; - result.endLine = end.line; - result.endColumn = end.column; - result.fileName = start.filePath; - - result.isResultOnlyForFallBack = message.result.isResultOnlyForFallBack; - - return result; -} - -void BackendReceiver::references(const ClangBackEnd::ReferencesMessage &message) -{ - qCDebugIpc() << "ReferencesMessage with" - << message.references.size() << "references"; - - const quint64 ticket = message.ticketNumber; - const ReferencesEntry entry = m_referencesTable.take(ticket); - QFutureInterface futureInterface = entry.futureInterface; - QTC_CHECK(futureInterface != QFutureInterface()); - - if (futureInterface.isCanceled()) - return; // Editor document closed or a new request was issued making this result outdated. - - futureInterface.reportResult(toCursorInfo(entry.localUses, message)); - futureInterface.reportFinished(); -} - -static Core::HelpItem::Category toHelpItemCategory(ClangBackEnd::ToolTipInfo::QdocCategory category) -{ - switch (category) { - case ClangBackEnd::ToolTipInfo::Unknown: - return Core::HelpItem::Unknown; - case ClangBackEnd::ToolTipInfo::ClassOrNamespace: - return Core::HelpItem::ClassOrNamespace; - case ClangBackEnd::ToolTipInfo::Enum: - return Core::HelpItem::Enum; - case ClangBackEnd::ToolTipInfo::Typedef: - return Core::HelpItem::Typedef; - case ClangBackEnd::ToolTipInfo::Macro: - return Core::HelpItem::Macro; - case ClangBackEnd::ToolTipInfo::Brief: - return Core::HelpItem::Brief; - case ClangBackEnd::ToolTipInfo::Function: - return Core::HelpItem::Function; - } - - return Core::HelpItem::Unknown; -} - -static QStringList toStringList(const Utf8StringVector &utf8StringVector) -{ - QStringList list; - list.reserve(utf8StringVector.size()); - - for (const Utf8String &utf8String : utf8StringVector) - list << utf8String.toString(); - - return list; -} - -static CppEditor::ToolTipInfo toToolTipInfo(const ClangBackEnd::ToolTipMessage &message) -{ - CppEditor::ToolTipInfo info; - - const ClangBackEnd::ToolTipInfo &backendInfo = message.toolTipInfo; - - info.text = backendInfo.text; - info.briefComment = backendInfo.briefComment; - - info.qDocIdCandidates = toStringList(backendInfo.qdocIdCandidates); - info.qDocMark = backendInfo.qdocMark; - info.qDocCategory = toHelpItemCategory(backendInfo.qdocCategory); - info.value = backendInfo.value; - info.sizeInBytes = backendInfo.sizeInBytes; - - return info; -} - -void BackendReceiver::tooltip(const ClangBackEnd::ToolTipMessage &message) -{ - qCDebugIpc() << "ToolTipMessage" << message.toolTipInfo.text; - - const quint64 ticket = message.ticketNumber; - QFutureInterface futureInterface = m_toolTipsTable.take(ticket); - QTC_CHECK(futureInterface != QFutureInterface()); - - if (futureInterface.isCanceled()) - return; // A new request was issued making this one outdated. - - futureInterface.reportResult(toToolTipInfo(message)); - futureInterface.reportFinished(); -} - -void BackendReceiver::followSymbol(const ClangBackEnd::FollowSymbolMessage &message) -{ - qCDebugIpc() << "FollowSymbolMessage with" - << message.result; - - const quint64 ticket = message.ticketNumber; - QFutureInterface futureInterface = m_followTable.take(ticket); - QTC_CHECK(futureInterface != QFutureInterface()); - - if (futureInterface.isCanceled()) - return; // Editor document closed or a new request was issued making this result outdated. - - futureInterface.reportResult(toSymbolInfo(message)); - futureInterface.reportFinished(); -} - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangbackendreceiver.h b/src/plugins/clangcodemodel/clangbackendreceiver.h deleted file mode 100644 index beab2f611e6..00000000000 --- a/src/plugins/clangcodemodel/clangbackendreceiver.h +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 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. -** -****************************************************************************/ - -#pragma once - -#include -#include -#include - -#include - -#include -#include -#include - -namespace TextEditor { -class IAssistProcessor; -class TextEditorWidget; -} // namespace TextEditor - -namespace ClangCodeModel { -namespace Internal { - -class BackendReceiver : public ClangBackEnd::ClangCodeModelClientInterface -{ -public: - BackendReceiver(); - ~BackendReceiver() override; - - using AliveHandler = std::function; - void setAliveHandler(const AliveHandler &handler); - - void reset(); - -private: - void alive() override; - void echo(const ClangBackEnd::EchoMessage &message) override; - void completions(const ClangBackEnd::CompletionsMessage &message) override; - - void annotations(const ClangBackEnd::AnnotationsMessage &message) override; - void references(const ClangBackEnd::ReferencesMessage &message) override; - void tooltip(const ClangBackEnd::ToolTipMessage &message) override; - void followSymbol(const ClangBackEnd::FollowSymbolMessage &message) override; - -private: - AliveHandler m_aliveHandler; - - struct ReferencesEntry { - ReferencesEntry() = default; - ReferencesEntry(QFutureInterface futureInterface, - const CppEditor::SemanticInfo::LocalUseMap &localUses) - : futureInterface(futureInterface) - , localUses(localUses) {} - QFutureInterface futureInterface; - CppEditor::SemanticInfo::LocalUseMap localUses; - }; - QHash m_referencesTable; - QHash> m_toolTipsTable; - QHash> m_followTable; -}; - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangbackendsender.cpp b/src/plugins/clangcodemodel/clangbackendsender.cpp deleted file mode 100644 index 17f68ae1d73..00000000000 --- a/src/plugins/clangcodemodel/clangbackendsender.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 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 "clangbackendsender.h" - -#include "clangbackendlogging.h" - -#include -#include - -#include - -#define qCDebugIpc() qCDebug(ipcLog) << "====>" - -using namespace ClangBackEnd; - -namespace ClangCodeModel { -namespace Internal { - -BackendSender::BackendSender(ClangCodeModelConnectionClient *connectionClient) - : m_connection(connectionClient) -{} - -void BackendSender::end() -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << ClangBackEnd::EndMessage(); - m_connection->sendEndMessage(); -} - -void BackendSender::documentsOpened(const DocumentsOpenedMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().documentsOpened(message); -} - -void BackendSender::documentsChanged(const DocumentsChangedMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().documentsChanged(message); -} - -void BackendSender::documentsClosed(const DocumentsClosedMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().documentsClosed(message); -} - -void BackendSender::unsavedFilesUpdated(const UnsavedFilesUpdatedMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().unsavedFilesUpdated(message); -} - -void BackendSender::unsavedFilesRemoved(const UnsavedFilesRemovedMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().unsavedFilesRemoved(message); -} - -void BackendSender::requestCompletions(const RequestCompletionsMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().requestCompletions(message); -} - -void BackendSender::requestAnnotations(const RequestAnnotationsMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().requestAnnotations(message); -} - -void BackendSender::requestReferences(const RequestReferencesMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().requestReferences(message); -} - -void BackendSender::requestToolTip(const RequestToolTipMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebug(ipcLog) << ">>>" << message; - m_connection->serverProxy().requestToolTip(message); -} - -void BackendSender::requestFollowSymbol(const RequestFollowSymbolMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().requestFollowSymbol(message); -} - -void BackendSender::documentVisibilityChanged(const DocumentVisibilityChangedMessage &message) -{ - QTC_CHECK(m_connection->isConnected()); - qCDebugIpc() << message; - m_connection->serverProxy().documentVisibilityChanged(message); -} - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangbackendsender.h b/src/plugins/clangcodemodel/clangbackendsender.h deleted file mode 100644 index 5e4f14f9379..00000000000 --- a/src/plugins/clangcodemodel/clangbackendsender.h +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 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. -** -****************************************************************************/ - -#pragma once - -#include - -namespace ClangBackEnd { class ClangCodeModelConnectionClient; } - -namespace ClangCodeModel { -namespace Internal { - -class BackendSender : public ClangBackEnd::ClangCodeModelServerInterface -{ -public: - BackendSender(ClangBackEnd::ClangCodeModelConnectionClient *connectionClient); - - void end() override; - - void documentsOpened(const ClangBackEnd::DocumentsOpenedMessage &message) override; - void documentsChanged(const ClangBackEnd::DocumentsChangedMessage &message) override; - void documentsClosed(const ClangBackEnd::DocumentsClosedMessage &message) override; - void documentVisibilityChanged(const ClangBackEnd::DocumentVisibilityChangedMessage &message) override; - - void unsavedFilesUpdated(const ClangBackEnd::UnsavedFilesUpdatedMessage &message) override; - void unsavedFilesRemoved(const ClangBackEnd::UnsavedFilesRemovedMessage &message) override; - - void requestCompletions(const ClangBackEnd::RequestCompletionsMessage &message) override; - void requestAnnotations(const ClangBackEnd::RequestAnnotationsMessage &message) override; - void requestReferences(const ClangBackEnd::RequestReferencesMessage &message) override; - void requestToolTip(const ClangBackEnd::RequestToolTipMessage &message) override; - void requestFollowSymbol(const ClangBackEnd::RequestFollowSymbolMessage &message) override; - -private: - ClangBackEnd::ClangCodeModelConnectionClient *m_connection = nullptr; -}; - -} // namespace Internal -} // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangcodemodel.qbs b/src/plugins/clangcodemodel/clangcodemodel.qbs index 68158e9d1af..eec97a45257 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.qbs +++ b/src/plugins/clangcodemodel/clangcodemodel.qbs @@ -29,14 +29,6 @@ QtcPlugin { "clangactivationsequencecontextprocessor.h", "clangactivationsequenceprocessor.cpp", "clangactivationsequenceprocessor.h", - "clangbackendcommunicator.cpp", - "clangbackendcommunicator.h", - "clangbackendlogging.cpp", - "clangbackendlogging.h", - "clangbackendreceiver.cpp", - "clangbackendreceiver.h", - "clangbackendsender.cpp", - "clangbackendsender.h", "clangcodemodelplugin.cpp", "clangcodemodelplugin.h", "clangcompletioncontextanalyzer.cpp",