//===--- JSONTransport.cpp - sending and receiving LSP messages over JSON -===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "Protocol.h" // For LSPError #include "Transport.h" #include "support/Cancellation.h" #include "support/Logger.h" #include "support/Shutdown.h" #include "support/ThreadCrashReporter.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/Error.h" #include <optional> #include <system_error> namespace clang { namespace clangd { namespace { llvm::json::Object encodeError(llvm::Error E) { … } llvm::Error decodeError(const llvm::json::Object &O) { … } class JSONTransport : public Transport { … }; bool JSONTransport::handleMessage(llvm::json::Value Message, MessageHandler &Handler) { … } // Tries to read a line up to and including \n. // If failing, feof(), ferror(), or shutdownRequested() will be set. bool readLine(std::FILE *In, llvm::SmallVectorImpl<char> &Out) { … } // Returns None when: // - ferror(), feof(), or shutdownRequested() are set. // - Content-Length is missing or empty (protocol error) bool JSONTransport::readStandardMessage(std::string &JSON) { … } // For lit tests we support a simplified syntax: // - messages are delimited by '---' on a line by itself // - lines starting with # are ignored. // This is a testing path, so favor simplicity over performance here. // When returning false: feof(), ferror(), or shutdownRequested() will be set. bool JSONTransport::readDelimitedMessage(std::string &JSON) { … } } // namespace std::unique_ptr<Transport> newJSONTransport(std::FILE *In, llvm::raw_ostream &Out, llvm::raw_ostream *InMirror, bool Pretty, JSONStreamStyle Style) { … } } // namespace clangd } // namespace clang