diff --git a/src/libs/clangbackendipc/clangbackendipc-lib.pri b/src/libs/clangbackendipc/clangbackendipc-lib.pri index 3f3758772de..c9aa23d82b4 100644 --- a/src/libs/clangbackendipc/clangbackendipc-lib.pri +++ b/src/libs/clangbackendipc/clangbackendipc-lib.pri @@ -38,6 +38,7 @@ SOURCES += \ $$PWD/filecontainerv2.cpp \ $$PWD/filepath.cpp \ $$PWD/fixitcontainer.cpp \ + $$PWD/followsymbolmessage.cpp \ $$PWD/highlightingmarkcontainer.cpp \ $$PWD/ipcclientinterface.cpp \ $$PWD/ipcinterface.cpp \ @@ -62,6 +63,7 @@ SOURCES += \ $$PWD/registerunsavedfilesforeditormessage.cpp \ $$PWD/removepchprojectpartsmessage.cpp \ $$PWD/requestdocumentannotations.cpp \ + $$PWD/requestfollowsymbolmessage.cpp \ $$PWD/requestreferencesmessage.cpp \ $$PWD/requestsourcelocationforrenamingmessage.cpp \ $$PWD/requestsourcerangesanddiagnosticsforquerymessage.cpp \ @@ -82,7 +84,7 @@ SOURCES += \ $$PWD/updatepchprojectpartsmessage.cpp \ $$PWD/updatetranslationunitsforeditormessage.cpp \ $$PWD/updatevisibletranslationunitsmessage.cpp \ - $$PWD/writemessageblock.cpp \ + $$PWD/writemessageblock.cpp HEADERS += \ $$PWD/cancelmessage.h \ @@ -121,6 +123,7 @@ HEADERS += \ $$PWD/filecontainerv2.h \ $$PWD/filepath.h \ $$PWD/fixitcontainer.h \ + $$PWD/followsymbolmessage.h \ $$PWD/highlightingmarkcontainer.h \ $$PWD/ipcclientinterface.h \ $$PWD/ipcinterface.h \ @@ -145,6 +148,7 @@ HEADERS += \ $$PWD/registerunsavedfilesforeditormessage.h \ $$PWD/removepchprojectpartsmessage.h \ $$PWD/requestdocumentannotations.h \ + $$PWD/requestfollowsymbolmessage.h \ $$PWD/requestreferencesmessage.h \ $$PWD/requestsourcelocationforrenamingmessage.h \ $$PWD/requestsourcerangesanddiagnosticsforquerymessage.h \ @@ -166,6 +170,6 @@ HEADERS += \ $$PWD/updatepchprojectpartsmessage.h \ $$PWD/updatetranslationunitsforeditormessage.h \ $$PWD/updatevisibletranslationunitsmessage.h \ - $$PWD/writemessageblock.h \ + $$PWD/writemessageblock.h contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols diff --git a/src/libs/clangbackendipc/clangbackendipc_global.h b/src/libs/clangbackendipc/clangbackendipc_global.h index e48a05e7d99..ec22645db56 100644 --- a/src/libs/clangbackendipc/clangbackendipc_global.h +++ b/src/libs/clangbackendipc/clangbackendipc_global.h @@ -116,6 +116,9 @@ enum class MessageType : quint8 { RequestReferencesMessage, ReferencesMessage, + RequestFollowSymbolMessage, + FollowSymbolMessage, + UpdateVisibleTranslationUnitsMessage, CompleteCodeMessage, diff --git a/src/libs/clangbackendipc/clangcodemodelclientinterface.cpp b/src/libs/clangbackendipc/clangcodemodelclientinterface.cpp index 6fa2b25d476..77bd1a589ea 100644 --- a/src/libs/clangbackendipc/clangcodemodelclientinterface.cpp +++ b/src/libs/clangbackendipc/clangcodemodelclientinterface.cpp @@ -56,6 +56,9 @@ void ClangCodeModelClientInterface::dispatch(const MessageEnvelop &messageEnvelo case MessageType::ReferencesMessage: references(messageEnvelop.message()); break; + case MessageType::FollowSymbolMessage: + followSymbol(messageEnvelop.message()); + break; default: qWarning() << "Unknown ClangCodeModelClientMessage"; } diff --git a/src/libs/clangbackendipc/clangcodemodelclientinterface.h b/src/libs/clangbackendipc/clangcodemodelclientinterface.h index d526b98228f..04682ff4830 100644 --- a/src/libs/clangbackendipc/clangcodemodelclientinterface.h +++ b/src/libs/clangbackendipc/clangcodemodelclientinterface.h @@ -37,11 +37,13 @@ class DocumentAnnotationsChangedMessage; class EchoMessage; class ProjectPartsDoNotExistMessage; class ReferencesMessage; +class FollowSymbolMessage; class RegisterProjectPartsForEditorMessage; class RegisterTranslationUnitForEditorMessage; class RegisterUnsavedFilesForEditorMessage; class RequestDocumentAnnotationsMessage; class RequestReferencesMessage; +class RequestFollowSymbolMessage; class TranslationUnitDoesNotExistMessage; class UnregisterProjectPartsForEditorMessage; class UnregisterTranslationUnitsForEditorMessage; @@ -61,6 +63,7 @@ public: virtual void projectPartsDoNotExist(const ProjectPartsDoNotExistMessage &message) = 0; virtual void documentAnnotationsChanged(const DocumentAnnotationsChangedMessage &message) = 0; virtual void references(const ReferencesMessage &message) = 0; + virtual void followSymbol(const FollowSymbolMessage &message) = 0; }; } // namespace ClangBackEnd diff --git a/src/libs/clangbackendipc/clangcodemodelclientmessages.h b/src/libs/clangbackendipc/clangcodemodelclientmessages.h index 9f75d6a9ff2..99f9a41c054 100644 --- a/src/libs/clangbackendipc/clangcodemodelclientmessages.h +++ b/src/libs/clangbackendipc/clangcodemodelclientmessages.h @@ -31,4 +31,5 @@ #include "documentannotationschangedmessage.h" #include "projectpartsdonotexistmessage.h" #include "referencesmessage.h" +#include "followsymbolmessage.h" #include "translationunitdoesnotexistmessage.h" diff --git a/src/libs/clangbackendipc/clangcodemodelclientproxy.cpp b/src/libs/clangbackendipc/clangcodemodelclientproxy.cpp index f9786092bb9..b9ec51cac96 100644 --- a/src/libs/clangbackendipc/clangcodemodelclientproxy.cpp +++ b/src/libs/clangbackendipc/clangcodemodelclientproxy.cpp @@ -100,6 +100,11 @@ void ClangCodeModelClientProxy::references(const ReferencesMessage &message) m_writeMessageBlock.write(message); } +void ClangCodeModelClientProxy::followSymbol(const FollowSymbolMessage &message) +{ + m_writeMessageBlock.write(message); +} + void ClangCodeModelClientProxy::readMessages() { for (const MessageEnvelop &message : m_readMessageBlock.readAll()) diff --git a/src/libs/clangbackendipc/clangcodemodelclientproxy.h b/src/libs/clangbackendipc/clangcodemodelclientproxy.h index 689f9684768..9c2c58c6ebf 100644 --- a/src/libs/clangbackendipc/clangcodemodelclientproxy.h +++ b/src/libs/clangbackendipc/clangcodemodelclientproxy.h @@ -58,6 +58,7 @@ public: void projectPartsDoNotExist(const ProjectPartsDoNotExistMessage &message) override; void documentAnnotationsChanged(const DocumentAnnotationsChangedMessage &message) override; void references(const ReferencesMessage &message) override; + void followSymbol(const FollowSymbolMessage &message) override; void readMessages(); diff --git a/src/libs/clangbackendipc/clangcodemodelserverinterface.cpp b/src/libs/clangbackendipc/clangcodemodelserverinterface.cpp index 67090e2c54b..bdaa802a47e 100644 --- a/src/libs/clangbackendipc/clangcodemodelserverinterface.cpp +++ b/src/libs/clangbackendipc/clangcodemodelserverinterface.cpp @@ -68,6 +68,9 @@ void ClangCodeModelServerInterface::dispatch(const MessageEnvelop &messageEnvelo case MessageType::RequestReferencesMessage: requestReferences(messageEnvelop.message()); break; + case MessageType::RequestFollowSymbolMessage: + requestFollowSymbol(messageEnvelop.message()); + break; case MessageType::UpdateVisibleTranslationUnitsMessage: updateVisibleTranslationUnits(messageEnvelop.message()); break; diff --git a/src/libs/clangbackendipc/clangcodemodelserverinterface.h b/src/libs/clangbackendipc/clangcodemodelserverinterface.h index e25b9ef66b5..9e8dbd30846 100644 --- a/src/libs/clangbackendipc/clangcodemodelserverinterface.h +++ b/src/libs/clangbackendipc/clangcodemodelserverinterface.h @@ -49,6 +49,7 @@ public: virtual void completeCode(const CompleteCodeMessage &message) = 0; virtual void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) = 0; virtual void requestReferences(const RequestReferencesMessage &message) = 0; + virtual void requestFollowSymbol(const RequestFollowSymbolMessage &message) = 0; virtual void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) = 0; }; diff --git a/src/libs/clangbackendipc/clangcodemodelservermessages.h b/src/libs/clangbackendipc/clangcodemodelservermessages.h index 8d8cb037b7a..b1ba7a07016 100644 --- a/src/libs/clangbackendipc/clangcodemodelservermessages.h +++ b/src/libs/clangbackendipc/clangcodemodelservermessages.h @@ -35,6 +35,7 @@ #include "registerunsavedfilesforeditormessage.h" #include "requestdocumentannotations.h" #include "requestreferencesmessage.h" +#include "requestfollowsymbolmessage.h" #include "unregisterunsavedfilesforeditormessage.h" #include "updatetranslationunitsforeditormessage.h" #include "updatevisibletranslationunitsmessage.h" diff --git a/src/libs/clangbackendipc/clangcodemodelserverproxy.cpp b/src/libs/clangbackendipc/clangcodemodelserverproxy.cpp index 9b6a2141608..a5b6411e752 100644 --- a/src/libs/clangbackendipc/clangcodemodelserverproxy.cpp +++ b/src/libs/clangbackendipc/clangcodemodelserverproxy.cpp @@ -110,6 +110,11 @@ void ClangCodeModelServerProxy::requestReferences(const RequestReferencesMessage m_writeMessageBlock.write(message); } +void ClangCodeModelServerProxy::requestFollowSymbol(const RequestFollowSymbolMessage &message) +{ + m_writeMessageBlock.write(message); +} + void ClangCodeModelServerProxy::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) { m_writeMessageBlock.write(message); diff --git a/src/libs/clangbackendipc/clangcodemodelserverproxy.h b/src/libs/clangbackendipc/clangcodemodelserverproxy.h index a854225ffc0..c43c9cd01d6 100644 --- a/src/libs/clangbackendipc/clangcodemodelserverproxy.h +++ b/src/libs/clangbackendipc/clangcodemodelserverproxy.h @@ -60,6 +60,7 @@ public: void completeCode(const CompleteCodeMessage &message) override; void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override; void requestReferences(const RequestReferencesMessage &message) override; + void requestFollowSymbol(const RequestFollowSymbolMessage &message) override; void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override; void readMessages(); diff --git a/src/libs/clangbackendipc/followsymbolmessage.cpp b/src/libs/clangbackendipc/followsymbolmessage.cpp new file mode 100644 index 00000000000..929199bef5b --- /dev/null +++ b/src/libs/clangbackendipc/followsymbolmessage.cpp @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** 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 "followsymbolmessage.h" + +#include + +#include + +namespace ClangBackEnd { + +QDebug operator<<(QDebug debug, const FollowSymbolMessage &message) +{ + debug.nospace() << "FollowSymbolMessage(" + << message.m_fileContainer + << ", " << message.m_ticketNumber + << ", " << message.m_sourceRange + << ", " << message.m_failedToFollow; + + debug.nospace() << ")"; + + return debug; +} + +std::ostream &operator<<(std::ostream &os, const FollowSymbolMessage &message) +{ + os << "(" + << message.m_fileContainer << ", " + << message.m_ticketNumber << ", " + << message.m_sourceRange << ", " + << message.m_failedToFollow << ", " + << ")"; + + return os; +} + +} // namespace ClangBackEnd diff --git a/src/libs/clangbackendipc/followsymbolmessage.h b/src/libs/clangbackendipc/followsymbolmessage.h new file mode 100644 index 00000000000..ad8f7348f39 --- /dev/null +++ b/src/libs/clangbackendipc/followsymbolmessage.h @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** 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 "filecontainer.h" +#include "sourcerangecontainer.h" + +#include +#include + +namespace ClangBackEnd { + +class FollowSymbolMessage +{ +public: + FollowSymbolMessage() = default; + FollowSymbolMessage(const FileContainer &fileContainer, + const SourceRangeContainer &range, + bool failedToFollow, + quint64 ticketNumber) + : m_fileContainer(fileContainer) + , m_sourceRange(range) + , m_ticketNumber(ticketNumber) + , m_failedToFollow(failedToFollow) + { + } + const FileContainer &fileContainer() const + { + return m_fileContainer; + } + + const SourceRangeContainer &sourceRange() const + { + return m_sourceRange; + } + + bool failedToFollow() const + { + return m_failedToFollow; + } + + quint64 ticketNumber() const + { + return m_ticketNumber; + } + + friend QDataStream &operator<<(QDataStream &out, const FollowSymbolMessage &message) + { + out << message.m_fileContainer; + out << message.m_sourceRange; + out << message.m_ticketNumber; + out << message.m_failedToFollow; + return out; + } + + friend QDataStream &operator>>(QDataStream &in, FollowSymbolMessage &message) + { + in >> message.m_fileContainer; + in >> message.m_sourceRange; + in >> message.m_ticketNumber; + in >> message.m_failedToFollow; + return in; + } + + friend bool operator==(const FollowSymbolMessage &first, const FollowSymbolMessage &second) + { + return first.m_ticketNumber == second.m_ticketNumber + && first.m_fileContainer == second.m_fileContainer + && first.m_sourceRange == second.m_sourceRange + && first.m_failedToFollow == second.m_failedToFollow; + } + + friend CMBIPC_EXPORT QDebug operator<<(QDebug debug, const FollowSymbolMessage &message); + friend std::ostream &operator<<(std::ostream &os, const FollowSymbolMessage &message); +private: + FileContainer m_fileContainer; + SourceRangeContainer m_sourceRange; + quint64 m_ticketNumber = 0; + bool m_failedToFollow = false; +}; + +DECLARE_MESSAGE(FollowSymbolMessage); + +} // namespace ClangBackEnd diff --git a/src/libs/clangbackendipc/requestfollowsymbolmessage.cpp b/src/libs/clangbackendipc/requestfollowsymbolmessage.cpp new file mode 100644 index 00000000000..af302a7680c --- /dev/null +++ b/src/libs/clangbackendipc/requestfollowsymbolmessage.cpp @@ -0,0 +1,64 @@ +/**************************************************************************** +** +** 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 "requestfollowsymbolmessage.h" + +#include + +#include + +namespace ClangBackEnd { + +quint64 RequestFollowSymbolMessage::ticketCounter = 0; + +QDebug operator<<(QDebug debug, const RequestFollowSymbolMessage &message) +{ + debug.nospace() << "RequestFollowSymbolMessage("; + + debug.nospace() << message.m_fileContainer << ", "; + debug.nospace() << message.m_ticketNumber << ", "; + debug.nospace() << message.m_line << ", "; + debug.nospace() << message.m_column << ", "; + debug.nospace() << message.m_resolveTarget << ", "; + + debug.nospace() << ")"; + + return debug; +} + +std::ostream &operator<<(std::ostream &os, const RequestFollowSymbolMessage &message) +{ + os << "(" + << message.m_fileContainer << ", " + << message.m_ticketNumber << ", " + << message.m_line << ", " + << message.m_column << ", " + << message.m_resolveTarget << ", " + << ")"; + + return os; +} + +} // namespace ClangBackEnd diff --git a/src/libs/clangbackendipc/requestfollowsymbolmessage.h b/src/libs/clangbackendipc/requestfollowsymbolmessage.h new file mode 100644 index 00000000000..1f7e348300b --- /dev/null +++ b/src/libs/clangbackendipc/requestfollowsymbolmessage.h @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** 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 "clangbackendipc_global.h" + +#include "filecontainer.h" + +#include + +namespace ClangBackEnd { + +class RequestFollowSymbolMessage +{ +public: + RequestFollowSymbolMessage() = default; + RequestFollowSymbolMessage(const FileContainer &fileContainer, + quint32 line, + quint32 column, + bool resolveTarget = true) + : m_fileContainer(fileContainer) + , m_ticketNumber(++ticketCounter) + , m_line(line) + , m_column(column) + , m_resolveTarget(resolveTarget) + { + } + + const FileContainer &fileContainer() const + { + return m_fileContainer; + } + + quint32 line() const + { + return m_line; + } + + quint32 column() const + { + return m_column; + } + + bool resolveTarget() const + { + return m_resolveTarget; + } + + quint64 ticketNumber() const + { + return m_ticketNumber; + } + + friend QDataStream &operator<<(QDataStream &out, const RequestFollowSymbolMessage &message) + { + out << message.m_fileContainer; + out << message.m_ticketNumber; + out << message.m_line; + out << message.m_column; + out << message.m_resolveTarget; + + return out; + } + + friend QDataStream &operator>>(QDataStream &in, RequestFollowSymbolMessage &message) + { + in >> message.m_fileContainer; + in >> message.m_ticketNumber; + in >> message.m_line; + in >> message.m_column; + in >> message.m_resolveTarget; + + return in; + } + + friend bool operator==(const RequestFollowSymbolMessage &first, + const RequestFollowSymbolMessage &second) + { + return first.m_ticketNumber == second.m_ticketNumber + && first.m_line == second.m_line + && first.m_column == second.m_column + && first.m_fileContainer == second.m_fileContainer + && first.m_resolveTarget == second.m_resolveTarget; + } + + friend CMBIPC_EXPORT QDebug operator<<(QDebug debug, const RequestFollowSymbolMessage &message); + friend std::ostream &operator<<(std::ostream &os, const RequestFollowSymbolMessage &message); +private: + FileContainer m_fileContainer; + quint64 m_ticketNumber = 0; + quint32 m_line = 0; + quint32 m_column = 0; + bool m_resolveTarget = true; + static CMBIPC_EXPORT quint64 ticketCounter; +}; + +DECLARE_MESSAGE(RequestFollowSymbolMessage); +} // namespace ClangBackEnd diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp index cfb52f15283..a04c1c7c371 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.cpp +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.cpp @@ -261,6 +261,15 @@ void IpcReceiver::references(const ReferencesMessage &message) futureInterface.reportFinished(); } +void IpcReceiver::followSymbol(const ClangBackEnd::FollowSymbolMessage &message) +{ + qCDebug(log) << "<<< FollowSymbolMessage with" + << message.sourceRange() << "range"; + + const quint64 ticket = message.ticketNumber(); + // TODO: add implementation +} + class IpcSender : public IpcSenderInterface { public: @@ -279,6 +288,7 @@ public: void completeCode(const ClangBackEnd::CompleteCodeMessage &message) override; void requestDocumentAnnotations(const ClangBackEnd::RequestDocumentAnnotationsMessage &message) override; void requestReferences(const ClangBackEnd::RequestReferencesMessage &message) override; + void requestFollowSymbol(const ClangBackEnd::RequestFollowSymbolMessage &message) override; void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override; private: @@ -362,6 +372,13 @@ void IpcSender::requestReferences(const RequestReferencesMessage &message) m_connection.serverProxy().requestReferences(message); } +void IpcSender::requestFollowSymbol(const RequestFollowSymbolMessage &message) +{ + QTC_CHECK(m_connection.isConnected()); + qCDebug(log) << ">>>" << message; + m_connection.serverProxy().requestFollowSymbol(message); +} + void IpcSender::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) { QTC_CHECK(m_connection.isConnected()); @@ -383,6 +400,7 @@ public: void completeCode(const ClangBackEnd::CompleteCodeMessage &) override {} void requestDocumentAnnotations(const ClangBackEnd::RequestDocumentAnnotationsMessage &) override {} void requestReferences(const ClangBackEnd::RequestReferencesMessage &) override {} + void requestFollowSymbol(const RequestFollowSymbolMessage &) override {} void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &) override {} }; diff --git a/src/plugins/clangcodemodel/clangbackendipcintegration.h b/src/plugins/clangcodemodel/clangbackendipcintegration.h index e98565f48c1..f040afe9331 100644 --- a/src/plugins/clangcodemodel/clangbackendipcintegration.h +++ b/src/plugins/clangcodemodel/clangbackendipcintegration.h @@ -88,6 +88,7 @@ private: void documentAnnotationsChanged(const ClangBackEnd::DocumentAnnotationsChangedMessage &message) override; void references(const ClangBackEnd::ReferencesMessage &message) override; + void followSymbol(const ClangBackEnd::FollowSymbolMessage &message) override; void translationUnitDoesNotExist(const ClangBackEnd::TranslationUnitDoesNotExistMessage &) override {} void projectPartsDoNotExist(const ClangBackEnd::ProjectPartsDoNotExistMessage &) override {} @@ -124,6 +125,7 @@ public: virtual void completeCode(const ClangBackEnd::CompleteCodeMessage &message) = 0; virtual void requestDocumentAnnotations(const ClangBackEnd::RequestDocumentAnnotationsMessage &message) = 0; virtual void requestReferences(const ClangBackEnd::RequestReferencesMessage &message) = 0; + virtual void requestFollowSymbol(const ClangBackEnd::RequestFollowSymbolMessage &message) = 0; virtual void updateVisibleTranslationUnits(const ClangBackEnd::UpdateVisibleTranslationUnitsMessage &message) = 0; }; diff --git a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp index 368d209e154..06ab0df02b6 100644 --- a/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp +++ b/src/plugins/clangcodemodel/test/clangcodecompletion_test.cpp @@ -324,6 +324,11 @@ QString toString(const RequestReferencesMessage &) return QStringLiteral("RequestReferencesMessage\n"); } +QString toString(const RequestFollowSymbolMessage &) +{ + return QStringLiteral("RequestFollowSymbolMessage\n"); +} + QString toString(const UpdateVisibleTranslationUnitsMessage &) { return QStringLiteral("UpdateVisibleTranslationUnitsMessage\n"); @@ -365,6 +370,9 @@ public: void requestReferences(const RequestReferencesMessage &message) override { senderLog.append(toString(message)); } + void requestFollowSymbol(const RequestFollowSymbolMessage &message) override + { senderLog.append(toString(message)); } + void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override { senderLog.append(toString(message)); } diff --git a/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri b/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri index 06be9be18de..2207748065c 100644 --- a/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri +++ b/src/tools/clangbackend/ipcsource/clangbackendclangipc-source.pri @@ -53,6 +53,7 @@ HEADERS += \ $$PWD/unsavedfile.h \ $$PWD/unsavedfiles.h \ $$PWD/utf8positionfromlinecolumn.h \ + $$PWD/clangfollowsymboljob.h SOURCES += \ $$PWD/clangcodecompleteresults.cpp \ @@ -101,3 +102,4 @@ SOURCES += \ $$PWD/unsavedfile.cpp \ $$PWD/unsavedfiles.cpp \ $$PWD/utf8positionfromlinecolumn.cpp \ + $$PWD/clangfollowsymboljob.cpp diff --git a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp index ffbf7fd94c5..3da0575c058 100644 --- a/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp +++ b/src/tools/clangbackend/ipcsource/clangcodemodelserver.cpp @@ -233,6 +233,17 @@ void ClangCodeModelServer::requestDocumentAnnotations(const RequestDocumentAnnot } } +template +static void fillJobRequest(JobRequest &jobRequest, const MessageType &message) +{ + jobRequest.line = message.line(); + jobRequest.column = message.column(); + jobRequest.ticketNumber = message.ticketNumber(); + // The unsaved files might get updater later, so take the current + // revision for the request. + jobRequest.documentRevision = message.fileContainer().documentRevision(); +} + void ClangCodeModelServer::requestReferences(const RequestReferencesMessage &message) { TIME_SCOPE_DURATION("ClangCodeModelServer::requestReferences"); @@ -243,13 +254,7 @@ void ClangCodeModelServer::requestReferences(const RequestReferencesMessage &mes DocumentProcessor processor = documentProcessors().processor(document); JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::RequestReferences); - jobRequest.line = message.line(); - jobRequest.column = message.column(); - jobRequest.ticketNumber = message.ticketNumber(); - // The unsaved files might get updater later, so take the current - // revision for the request. - jobRequest.documentRevision = message.fileContainer().documentRevision(); - + fillJobRequest(jobRequest, message); processor.addJob(jobRequest); processor.process(); } catch (const std::exception &exception) { @@ -257,6 +262,26 @@ void ClangCodeModelServer::requestReferences(const RequestReferencesMessage &mes } } +void ClangCodeModelServer::requestFollowSymbol(const RequestFollowSymbolMessage &message) +{ + TIME_SCOPE_DURATION("ClangCodeModelServer::followSymbol"); + + try { + auto projectPartId = message.fileContainer().projectPartId(); + Document document = documents.document(message.fileContainer().filePath(), + projectPartId); + DocumentProcessor processor = documentProcessors().processor(document); + + JobRequest jobRequest = processor.createJobRequest(JobRequest::Type::FollowSymbol); + fillJobRequest(jobRequest, message); + jobRequest.resolveTarget = message.resolveTarget(); + processor.addJob(jobRequest); + processor.process(); + } catch (const std::exception &exception) { + qWarning() << "Error in ClangCodeModelServer::followSymbol:" << exception.what(); + } +} + void ClangCodeModelServer::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) { TIME_SCOPE_DURATION("ClangCodeModelServer::updateVisibleTranslationUnits"); diff --git a/src/tools/clangbackend/ipcsource/clangcodemodelserver.h b/src/tools/clangbackend/ipcsource/clangcodemodelserver.h index 70d99b5afa3..352eb1f9322 100644 --- a/src/tools/clangbackend/ipcsource/clangcodemodelserver.h +++ b/src/tools/clangbackend/ipcsource/clangcodemodelserver.h @@ -59,6 +59,7 @@ public: void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override; void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override; void requestReferences(const RequestReferencesMessage &message) override; + void requestFollowSymbol(const RequestFollowSymbolMessage &message) override; public: // for tests const Documents &documentsForTestOnly() const; diff --git a/src/tools/clangbackend/ipcsource/clangfollowsymboljob.cpp b/src/tools/clangbackend/ipcsource/clangfollowsymboljob.cpp new file mode 100644 index 00000000000..19c94f6f690 --- /dev/null +++ b/src/tools/clangbackend/ipcsource/clangfollowsymboljob.cpp @@ -0,0 +1,85 @@ +/**************************************************************************** +** +** 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 "clangfollowsymboljob.h" + +#include +#include +#include + +#include + +namespace ClangBackEnd { + +static FollowSymbolJob::AsyncResult runAsyncHelperFollow(const TranslationUnit &translationUnit, + quint32 line, + quint32 column, + bool resolveTarget) +{ + TIME_SCOPE_DURATION("FollowSymbolJobRunner"); + + return FollowSymbolResult(); +} + +IAsyncJob::AsyncPrepareResult FollowSymbolJob::prepareAsyncRun() +{ + const JobRequest jobRequest = context().jobRequest; + QTC_ASSERT(jobRequest.type == JobRequest::Type::FollowSymbol, + return AsyncPrepareResult()); + + try { + m_pinnedDocument = context().documentForJobRequest(); + m_pinnedFileContainer = m_pinnedDocument.fileContainer(); + + const TranslationUnit translationUnit + = m_pinnedDocument.translationUnit(jobRequest.preferredTranslationUnit); + const quint32 line = jobRequest.line; + const quint32 column = jobRequest.column; + const bool resolveTarget = jobRequest.resolveTarget; + setRunner([translationUnit, line, column, resolveTarget]() { + return runAsyncHelperFollow(translationUnit, line, column, resolveTarget); + }); + return AsyncPrepareResult{translationUnit.id()}; + + } catch (const std::exception &exception) { + qWarning() << "Error in FollowSymbolJob::prepareAsyncRun:" << exception.what(); + return AsyncPrepareResult(); + } +} + +void FollowSymbolJob::finalizeAsyncRun() +{ + if (!context().isOutdated()) { + const AsyncResult result = asyncResult(); + + const FollowSymbolMessage message(m_pinnedFileContainer, + result.m_range, + result.m_failedToFollow, + context().jobRequest.ticketNumber); + context().client->followSymbol(message); + } +} + +} // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/clangfollowsymboljob.h b/src/tools/clangbackend/ipcsource/clangfollowsymboljob.h new file mode 100644 index 00000000000..3c0086f4ec7 --- /dev/null +++ b/src/tools/clangbackend/ipcsource/clangfollowsymboljob.h @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** 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 "clangasyncjob.h" +#include "clangdocument.h" + +#include + +namespace ClangBackEnd { + +class FollowSymbolResult +{ +public: + FollowSymbolResult() = default; + FollowSymbolResult(SourceRangeContainer &range, bool failedToFollow = false) + : m_range(range) + , m_failedToFollow(failedToFollow) + {} + + SourceRangeContainer m_range; + bool m_failedToFollow = false; +}; + +class FollowSymbolJob : public AsyncJob +{ +public: + using AsyncResult = FollowSymbolResult; + + AsyncPrepareResult prepareAsyncRun() override; + void finalizeAsyncRun() override; + +private: + Document m_pinnedDocument; + FileContainer m_pinnedFileContainer; +}; +} // namespace ClangBackEnd diff --git a/src/tools/clangbackend/ipcsource/clangiasyncjob.cpp b/src/tools/clangbackend/ipcsource/clangiasyncjob.cpp index 14de731eb62..4e4718ba3a5 100644 --- a/src/tools/clangbackend/ipcsource/clangiasyncjob.cpp +++ b/src/tools/clangbackend/ipcsource/clangiasyncjob.cpp @@ -31,6 +31,7 @@ #include "clangreparsesupportivetranslationunitjob.h" #include "clangrequestdocumentannotationsjob.h" #include "clangrequestreferencesjob.h" +#include "clangfollowsymboljob.h" #include "clangupdatedocumentannotationsjob.h" Q_LOGGING_CATEGORY(jobsLog, "qtc.clangbackend.jobs"); @@ -54,6 +55,8 @@ IAsyncJob *IAsyncJob::create(JobRequest::Type type) return new RequestDocumentAnnotationsJob(); case JobRequest::Type::RequestReferences: return new RequestReferencesJob(); + case JobRequest::Type::FollowSymbol: + return new FollowSymbolJob(); } return nullptr; diff --git a/src/tools/clangbackend/ipcsource/clangjobrequest.cpp b/src/tools/clangbackend/ipcsource/clangjobrequest.cpp index bb9eb9bb993..204c66e7508 100644 --- a/src/tools/clangbackend/ipcsource/clangjobrequest.cpp +++ b/src/tools/clangbackend/ipcsource/clangjobrequest.cpp @@ -40,6 +40,7 @@ static const char *JobRequestTypeToText(JobRequest::Type type) RETURN_TEXT_FOR_CASE(CompleteCode); RETURN_TEXT_FOR_CASE(RequestDocumentAnnotations); RETURN_TEXT_FOR_CASE(RequestReferences); + RETURN_TEXT_FOR_CASE(FollowSymbol); } return "UnhandledJobRequestType"; @@ -112,6 +113,7 @@ JobRequest::ExpirationReasons JobRequest::expirationReasonsForType(Type type) return JobRequest::ExpirationReasons(JobRequest::AnythingChanged); case JobRequest::Type::RequestReferences: case JobRequest::Type::RequestDocumentAnnotations: + case JobRequest::Type::FollowSymbol: return JobRequest::ExpirationReasons(JobRequest::DocumentClosed |JobRequest::DocumentRevisionChanged); case JobRequest::Type::CompleteCode: diff --git a/src/tools/clangbackend/ipcsource/clangjobrequest.h b/src/tools/clangbackend/ipcsource/clangjobrequest.h index a931514e854..53dca6087cb 100644 --- a/src/tools/clangbackend/ipcsource/clangjobrequest.h +++ b/src/tools/clangbackend/ipcsource/clangjobrequest.h @@ -53,6 +53,7 @@ public: CompleteCode, RequestDocumentAnnotations, RequestReferences, + FollowSymbol, }; enum class Condition { @@ -102,6 +103,7 @@ public: quint32 line = 0; quint32 column = 0; quint64 ticketNumber = 0; + bool resolveTarget = true; }; using JobRequests = QVector; diff --git a/tests/unit/echoserver/echoclangcodemodelserver.cpp b/tests/unit/echoserver/echoclangcodemodelserver.cpp index 0764cf7af13..c4a761b19fc 100644 --- a/tests/unit/echoserver/echoclangcodemodelserver.cpp +++ b/tests/unit/echoserver/echoclangcodemodelserver.cpp @@ -95,6 +95,11 @@ void EchoClangCodeModelServer::requestReferences(const RequestReferencesMessage echoMessage(message); } +void EchoClangCodeModelServer::requestFollowSymbol(const RequestFollowSymbolMessage &message) +{ + echoMessage(message); +} + void EchoClangCodeModelServer::updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) { echoMessage(message); diff --git a/tests/unit/echoserver/echoclangcodemodelserver.h b/tests/unit/echoserver/echoclangcodemodelserver.h index d381c0bdea0..32696c24d1f 100644 --- a/tests/unit/echoserver/echoclangcodemodelserver.h +++ b/tests/unit/echoserver/echoclangcodemodelserver.h @@ -44,6 +44,7 @@ public: void completeCode(const CompleteCodeMessage &message) override; void requestDocumentAnnotations(const RequestDocumentAnnotationsMessage &message) override; void requestReferences(const RequestReferencesMessage &message) override; + void requestFollowSymbol(const RequestFollowSymbolMessage &message) override; void updateVisibleTranslationUnits(const UpdateVisibleTranslationUnitsMessage &message) override; private: diff --git a/tests/unit/unittest/dummyclangipcclient.h b/tests/unit/unittest/dummyclangipcclient.h index a9dca6ead60..027182bfdb7 100644 --- a/tests/unit/unittest/dummyclangipcclient.h +++ b/tests/unit/unittest/dummyclangipcclient.h @@ -39,4 +39,5 @@ public: void projectPartsDoNotExist(const ClangBackEnd::ProjectPartsDoNotExistMessage &) override {} void documentAnnotationsChanged(const ClangBackEnd::DocumentAnnotationsChangedMessage &) override {} void references(const ClangBackEnd::ReferencesMessage &) override {} + void followSymbol(const ClangBackEnd::FollowSymbolMessage &) override {} }; diff --git a/tests/unit/unittest/mockclangcodemodelclient.h b/tests/unit/unittest/mockclangcodemodelclient.h index 0f5a8693bcb..44283378520 100644 --- a/tests/unit/unittest/mockclangcodemodelclient.h +++ b/tests/unit/unittest/mockclangcodemodelclient.h @@ -47,4 +47,6 @@ public: void(const ClangBackEnd::DocumentAnnotationsChangedMessage &message)); MOCK_METHOD1(references, void(const ClangBackEnd::ReferencesMessage &message)); + MOCK_METHOD1(followSymbol, + void(const ClangBackEnd::FollowSymbolMessage &message)); }; diff --git a/tests/unit/unittest/mockclangcodemodelserver.h b/tests/unit/unittest/mockclangcodemodelserver.h index 6285c48d2c2..d1f895d667c 100644 --- a/tests/unit/unittest/mockclangcodemodelserver.h +++ b/tests/unit/unittest/mockclangcodemodelserver.h @@ -56,6 +56,8 @@ public: void(const ClangBackEnd::RequestDocumentAnnotationsMessage &message)); MOCK_METHOD1(requestReferences, void(const ClangBackEnd::RequestReferencesMessage &message)); + MOCK_METHOD1(requestFollowSymbol, + void(const ClangBackEnd::RequestFollowSymbolMessage &message)); MOCK_METHOD1(updateVisibleTranslationUnits, void(const ClangBackEnd::UpdateVisibleTranslationUnitsMessage &message)); };