On Tue, Oct 10, 2017 at 2:08 AM, Ilya Biryukov via cfe-commits <cfe-commits@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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits