[clang-tools-extra] r315287 - Revert "Revert r315214 since diff -Z isn't portable, this is breaking:"
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 10 16:39:16 PDT 2017
On Tue, Oct 10, 2017 at 2:08 AM, Ilya Biryukov via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
> Author: ibiryukov
> Date: Tue Oct 10 02:08:47 2017
> New Revision: 315287
>
> URL: http://llvm.org/viewvc/llvm-project?rev=315287&view=rev
> Log:
> Revert "Revert r315214 since diff -Z isn't portable, this is breaking:"
>
> This reverts commit r315242 and restores r315214.
>
> To fix original failure, replaced non-portable `diff -Z` with portable
> alternative: `diff -b`.
>
> Added:
> clang-tools-extra/trunk/test/clangd/input-mirror.test
> Modified:
> clang-tools-extra/trunk/clangd/JSONRPCDispatcher.cpp
> clang-tools-extra/trunk/clangd/JSONRPCDispatcher.h
> clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp
>
> Modified: clang-tools-extra/trunk/clangd/JSONRPCDispatcher.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/JSONRPCDispatcher.cpp?rev=315287&r1=315286&r2=315287&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/clangd/JSONRPCDispatcher.cpp (original)
> +++ clang-tools-extra/trunk/clangd/JSONRPCDispatcher.cpp Tue Oct 10 02:08:47 2017
> @@ -37,6 +37,14 @@ void JSONOutput::log(const Twine &Messag
> Logs.flush();
> }
>
> +void JSONOutput::mirrorInput(const Twine &Message) {
> + if (!InputMirror)
> + return;
> +
> + *InputMirror << Message;
> + InputMirror->flush();
> +}
> +
> void Handler::handleMethod(llvm::yaml::MappingNode *Params, StringRef ID) {
> Output.log("Method ignored.\n");
> // Return that this method is unsupported.
> @@ -147,6 +155,14 @@ void clangd::runLanguageServerLoop(std::
> continue;
> }
>
> + Out.mirrorInput(Line);
> + // Mirror '\n' that gets consumed by std::getline, but is not included in
> + // the resulting Line.
> + // Note that '\r' is part of Line, so we don't need to mirror it
> + // separately.
> + if (!In.eof())
> + Out.mirrorInput("\n");
> +
> llvm::StringRef LineRef(Line);
>
> // We allow YAML-style comments in headers. Technically this isn't part
> @@ -163,9 +179,8 @@ void clangd::runLanguageServerLoop(std::
> if (LineRef.consume_front("Content-Length: ")) {
> if (ContentLength != 0) {
> Out.log("Warning: Duplicate Content-Length header received. "
> - "The previous value for this message ("
> - + std::to_string(ContentLength)
> - + ") was ignored.\n");
> + "The previous value for this message (" +
> + std::to_string(ContentLength) + ") was ignored.\n");
> }
>
> llvm::getAsUnsignedInteger(LineRef.trim(), 0, ContentLength);
> @@ -185,15 +200,13 @@ void clangd::runLanguageServerLoop(std::
> // parser.
> std::vector<char> JSON(ContentLength + 1, '\0');
> In.read(JSON.data(), ContentLength);
> + Out.mirrorInput(StringRef(JSON.data(), In.gcount()));
>
> // If the stream is aborted before we read ContentLength bytes, In
> // will have eofbit and failbit set.
> if (!In) {
> - Out.log("Input was aborted. Read only "
> - + std::to_string(In.gcount())
> - + " bytes of expected "
> - + std::to_string(ContentLength)
> - + ".\n");
> + Out.log("Input was aborted. Read only " + std::to_string(In.gcount()) +
> + " bytes of expected " + std::to_string(ContentLength) + ".\n");
> break;
> }
>
> @@ -209,8 +222,8 @@ void clangd::runLanguageServerLoop(std::
> if (IsDone)
> break;
> } else {
> - Out.log( "Warning: Missing Content-Length header, or message has zero "
> - "length.\n" );
> + Out.log("Warning: Missing Content-Length header, or message has zero "
> + "length.\n");
> }
> }
> }
>
> Modified: clang-tools-extra/trunk/clangd/JSONRPCDispatcher.h
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/JSONRPCDispatcher.h?rev=315287&r1=315286&r2=315287&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/clangd/JSONRPCDispatcher.h (original)
> +++ clang-tools-extra/trunk/clangd/JSONRPCDispatcher.h Tue Oct 10 02:08:47 2017
> @@ -24,8 +24,9 @@ namespace clangd {
> /// them.
> class JSONOutput : public Logger {
> public:
> - JSONOutput(llvm::raw_ostream &Outs, llvm::raw_ostream &Logs)
> - : Outs(Outs), Logs(Logs) {}
> + JSONOutput(llvm::raw_ostream &Outs, llvm::raw_ostream &Logs,
> + llvm::raw_ostream *InputMirror = nullptr)
> + : Outs(Outs), Logs(Logs), InputMirror(InputMirror) {}
>
> /// Emit a JSONRPC message.
> void writeMessage(const Twine &Message);
> @@ -33,9 +34,15 @@ public:
> /// Write to the logging stream.
> void log(const Twine &Message) override;
>
> + /// Mirror \p Message into InputMirror stream. Does nothing if InputMirror is
> + /// null.
> + /// Unlike other methods of JSONOutput, mirrorInput is not thread-safe.
> + void mirrorInput(const Twine &Message);
> +
> private:
> llvm::raw_ostream &Outs;
> llvm::raw_ostream &Logs;
> + llvm::raw_ostream *InputMirror;
>
> std::mutex StreamMutex;
> };
>
> Modified: clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp?rev=315287&r1=315286&r2=315287&view=diff
> ==============================================================================
> --- clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp (original)
> +++ clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp Tue Oct 10 02:08:47 2017
> @@ -9,10 +9,12 @@
>
> #include "ClangdLSPServer.h"
> #include "JSONRPCDispatcher.h"
> +#include "Path.h"
> #include "llvm/Support/CommandLine.h"
> #include "llvm/Support/FileSystem.h"
> #include "llvm/Support/Path.h"
> #include "llvm/Support/Program.h"
> +#include "llvm/Support/raw_ostream.h"
> #include <iostream>
> #include <memory>
> #include <string>
> @@ -43,11 +45,17 @@ static llvm::cl::opt<bool> RunSynchronou
> llvm::cl::desc("Parse on main thread. If set, -j is ignored"),
> llvm::cl::init(false), llvm::cl::Hidden);
>
> -static llvm::cl::opt<std::string>
> +static llvm::cl::opt<Path>
> ResourceDir("resource-dir",
> llvm::cl::desc("Directory for system clang headers"),
> llvm::cl::init(""), llvm::cl::Hidden);
>
> +static llvm::cl::opt<Path> InputMirrorFile(
> + "input-mirror-file",
> + llvm::cl::desc(
> + "Mirror all LSP input to the specified file. Useful for debugging."),
> + llvm::cl::init(""), llvm::cl::Hidden);
> +
> int main(int argc, char *argv[]) {
> llvm::cl::ParseCommandLineOptions(argc, argv, "clangd");
>
> @@ -63,9 +71,21 @@ int main(int argc, char *argv[]) {
> WorkerThreadsCount = 0;
>
> /// Validate command line arguments.
> + llvm::Optional<llvm::raw_fd_ostream> InputMirrorStream;
> + if (!InputMirrorFile.empty()) {
> + std::error_code EC;
> + InputMirrorStream.emplace(InputMirrorFile, /*ref*/ EC, llvm::sys::fs::F_RW);
> + if (EC) {
> + InputMirrorStream.reset();
> + llvm::errs() << "Error while opening an input mirror file: "
> + << EC.message();
> + }
> + }
> +
> llvm::raw_ostream &Outs = llvm::outs();
> llvm::raw_ostream &Logs = llvm::errs();
> - JSONOutput Out(Outs, Logs);
> + JSONOutput Out(Outs, Logs,
> + InputMirrorStream ? InputMirrorStream.getPointer() : nullptr);
>
> // If --compile-commands-dir arg was invoked, check value and override default
> // path.
>
> Added: clang-tools-extra/trunk/test/clangd/input-mirror.test
> URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clangd/input-mirror.test?rev=315287&view=auto
> ==============================================================================
> --- clang-tools-extra/trunk/test/clangd/input-mirror.test (added)
> +++ clang-tools-extra/trunk/test/clangd/input-mirror.test Tue Oct 10 02:08:47 2017
> @@ -0,0 +1,154 @@
> +# RUN: clangd -run-synchronously -input-mirror-file %t < %s
> +# Note that we have to use '-Z' as -input-mirror-file does not have a newline at the end of file.
Maybe also update the comment above?
--
Bruno Cardoso Lopes
http://www.brunocardoso.cc
More information about the cfe-commits
mailing list