<div dir="ltr">Sorry about that, `diff -b` seems to work. Restored commit and changed to `diff -b` in r315287.<br><div>Thanks for spotting and reverting this.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Oct 9, 2017 at 8:45 PM, Bruno Cardoso Lopes <span dir="ltr"><<a href="mailto:bruno.cardoso@gmail.com" target="_blank">bruno.cardoso@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<div><div class="h5"><br>
On Mon, Oct 9, 2017 at 9:58 AM, Ilya Biryukov via cfe-commits<br>
<<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br>
> Author: ibiryukov<br>
> Date: Mon Oct  9 09:58:16 2017<br>
> New Revision: 315214<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=315214&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=315214&view=rev</a><br>
> Log:<br>
> [clangd] Added a command-line arg to mirror clangd input into a file.<br>
><br>
> Summary: The arg is useful for debugging and creating test cases.<br>
><br>
> Reviewers: bkramer, krasimir<br>
><br>
> Reviewed By: bkramer<br>
><br>
> Subscribers: klimek, cfe-commits<br>
><br>
> Differential Revision: <a href="https://reviews.llvm.org/D37970" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D37970</a><br>
><br>
> Added:<br>
>     clang-tools-extra/trunk/test/<wbr>clangd/input-mirror.test<br>
> Modified:<br>
>     clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.cpp<br>
>     clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.h<br>
>     clang-tools-extra/trunk/<wbr>clangd/tool/ClangdMain.cpp<br>
><br>
> Modified: clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/JSONRPCDispatcher.cpp?rev=315214&r1=315213&r2=315214&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/clangd/<wbr>JSONRPCDispatcher.cpp?rev=<wbr>315214&r1=315213&r2=315214&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.cpp (original)<br>
> +++ clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.cpp Mon Oct  9 09:58:16 2017<br>
> @@ -37,6 +37,14 @@ void JSONOutput::log(const Twine &Messag<br>
>    Logs.flush();<br>
>  }<br>
><br>
> +void JSONOutput::mirrorInput(const Twine &Message) {<br>
> +  if (!InputMirror)<br>
> +    return;<br>
> +<br>
> +  *InputMirror << Message;<br>
> +  InputMirror->flush();<br>
> +}<br>
> +<br>
>  void Handler::handleMethod(llvm::<wbr>yaml::MappingNode *Params, StringRef ID) {<br>
>    Output.log("Method ignored.\n");<br>
>    // Return that this method is unsupported.<br>
> @@ -147,6 +155,14 @@ void clangd::runLanguageServerLoop(<wbr>std::<br>
>          continue;<br>
>        }<br>
><br>
> +      Out.mirrorInput(Line);<br>
> +      // Mirror '\n' that gets consumed by std::getline, but is not included in<br>
> +      // the resulting Line.<br>
> +      // Note that '\r' is part of Line, so we don't need to mirror it<br>
> +      // separately.<br>
> +      if (!In.eof())<br>
> +        Out.mirrorInput("\n");<br>
> +<br>
>        llvm::StringRef LineRef(Line);<br>
><br>
>        // We allow YAML-style comments in headers. Technically this isn't part<br>
> @@ -163,9 +179,8 @@ void clangd::runLanguageServerLoop(<wbr>std::<br>
>        if (LineRef.consume_front("<wbr>Content-Length: ")) {<br>
>          if (ContentLength != 0) {<br>
>            Out.log("Warning: Duplicate Content-Length header received. "<br>
> -                  "The previous value for this message ("<br>
> -                  + std::to_string(ContentLength)<br>
> -                  + ") was ignored.\n");<br>
> +                  "The previous value for this message (" +<br>
> +                  std::to_string(ContentLength) + ") was ignored.\n");<br>
>          }<br>
><br>
>          llvm::getAsUnsignedInteger(<wbr>LineRef.trim(), 0, ContentLength);<br>
> @@ -185,15 +200,13 @@ void clangd::runLanguageServerLoop(<wbr>std::<br>
>        // parser.<br>
>        std::vector<char> JSON(ContentLength + 1, '\0');<br>
>        In.read(JSON.data(), ContentLength);<br>
> +      Out.mirrorInput(StringRef(<wbr>JSON.data(), In.gcount()));<br>
><br>
>        // If the stream is aborted before we read ContentLength bytes, In<br>
>        // will have eofbit and failbit set.<br>
>        if (!In) {<br>
> -        Out.log("Input was aborted. Read only "<br>
> -                + std::to_string(In.gcount())<br>
> -                + " bytes of expected "<br>
> -                + std::to_string(ContentLength)<br>
> -                + ".\n");<br>
> +        Out.log("Input was aborted. Read only " + std::to_string(In.gcount()) +<br>
> +                " bytes of expected " + std::to_string(ContentLength) + ".\n");<br>
>          break;<br>
>        }<br>
><br>
> @@ -209,8 +222,8 @@ void clangd::runLanguageServerLoop(<wbr>std::<br>
>        if (IsDone)<br>
>          break;<br>
>      } else {<br>
> -      Out.log( "Warning: Missing Content-Length header, or message has zero "<br>
> -               "length.\n" );<br>
> +      Out.log("Warning: Missing Content-Length header, or message has zero "<br>
> +              "length.\n");<br>
>      }<br>
>    }<br>
>  }<br>
><br>
> Modified: clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/JSONRPCDispatcher.h?rev=315214&r1=315213&r2=315214&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/clangd/<wbr>JSONRPCDispatcher.h?rev=<wbr>315214&r1=315213&r2=315214&<wbr>view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.h (original)<br>
> +++ clang-tools-extra/trunk/<wbr>clangd/JSONRPCDispatcher.h Mon Oct  9 09:58:16 2017<br>
> @@ -24,8 +24,9 @@ namespace clangd {<br>
>  /// them.<br>
>  class JSONOutput : public Logger {<br>
>  public:<br>
> -  JSONOutput(llvm::raw_ostream &Outs, llvm::raw_ostream &Logs)<br>
> -      : Outs(Outs), Logs(Logs) {}<br>
> +  JSONOutput(llvm::raw_ostream &Outs, llvm::raw_ostream &Logs,<br>
> +             llvm::raw_ostream *InputMirror = nullptr)<br>
> +      : Outs(Outs), Logs(Logs), InputMirror(InputMirror) {}<br>
><br>
>    /// Emit a JSONRPC message.<br>
>    void writeMessage(const Twine &Message);<br>
> @@ -33,9 +34,15 @@ public:<br>
>    /// Write to the logging stream.<br>
>    void log(const Twine &Message) override;<br>
><br>
> +  /// Mirror \p Message into InputMirror stream. Does nothing if InputMirror is<br>
> +  /// null.<br>
> +  /// Unlike other methods of JSONOutput, mirrorInput is not thread-safe.<br>
> +  void mirrorInput(const Twine &Message);<br>
> +<br>
>  private:<br>
>    llvm::raw_ostream &Outs;<br>
>    llvm::raw_ostream &Logs;<br>
> +  llvm::raw_ostream *InputMirror;<br>
><br>
>    std::mutex StreamMutex;<br>
>  };<br>
><br>
> Modified: clang-tools-extra/trunk/<wbr>clangd/tool/ClangdMain.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/tool/ClangdMain.cpp?rev=315214&r1=315213&r2=315214&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/clangd/tool/ClangdMain.<wbr>cpp?rev=315214&r1=315213&r2=<wbr>315214&view=diff</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- clang-tools-extra/trunk/<wbr>clangd/tool/ClangdMain.cpp (original)<br>
> +++ clang-tools-extra/trunk/<wbr>clangd/tool/ClangdMain.cpp Mon Oct  9 09:58:16 2017<br>
> @@ -9,10 +9,12 @@<br>
><br>
>  #include "ClangdLSPServer.h"<br>
>  #include "JSONRPCDispatcher.h"<br>
> +#include "Path.h"<br>
>  #include "llvm/Support/CommandLine.h"<br>
>  #include "llvm/Support/FileSystem.h"<br>
>  #include "llvm/Support/Path.h"<br>
>  #include "llvm/Support/Program.h"<br>
> +#include "llvm/Support/raw_ostream.h"<br>
>  #include <iostream><br>
>  #include <memory><br>
>  #include <string><br>
> @@ -43,11 +45,17 @@ static llvm::cl::opt<bool> RunSynchronou<br>
>      llvm::cl::desc("Parse on main thread. If set, -j is ignored"),<br>
>      llvm::cl::init(false), llvm::cl::Hidden);<br>
><br>
> -static llvm::cl::opt<std::string><br>
> +static llvm::cl::opt<Path><br>
>      ResourceDir("resource-dir",<br>
>                  llvm::cl::desc("Directory for system clang headers"),<br>
>                  llvm::cl::init(""), llvm::cl::Hidden);<br>
><br>
> +static llvm::cl::opt<Path> InputMirrorFile(<br>
> +    "input-mirror-file",<br>
> +    llvm::cl::desc(<br>
> +        "Mirror all LSP input to the specified file. Useful for debugging."),<br>
> +    llvm::cl::init(""), llvm::cl::Hidden);<br>
> +<br>
>  int main(int argc, char *argv[]) {<br>
>    llvm::cl::<wbr>ParseCommandLineOptions(argc, argv, "clangd");<br>
><br>
> @@ -63,9 +71,21 @@ int main(int argc, char *argv[]) {<br>
>      WorkerThreadsCount = 0;<br>
><br>
>    /// Validate command line arguments.<br>
> +  llvm::Optional<llvm::raw_fd_<wbr>ostream> InputMirrorStream;<br>
> +  if (!InputMirrorFile.empty()) {<br>
> +    std::error_code EC;<br>
> +    InputMirrorStream.emplace(<wbr>InputMirrorFile, /*ref*/ EC, llvm::sys::fs::F_RW);<br>
> +    if (EC) {<br>
> +      InputMirrorStream.reset();<br>
> +      llvm::errs() << "Error while opening an input mirror file: "<br>
> +                   << EC.message();<br>
> +    }<br>
> +  }<br>
> +<br>
>    llvm::raw_ostream &Outs = llvm::outs();<br>
>    llvm::raw_ostream &Logs = llvm::errs();<br>
> -  JSONOutput Out(Outs, Logs);<br>
> +  JSONOutput Out(Outs, Logs,<br>
> +                 InputMirrorStream ? InputMirrorStream.getPointer() : nullptr);<br>
><br>
>    // If --compile-commands-dir arg was invoked, check value and override default<br>
>    // path.<br>
><br>
> Added: clang-tools-extra/trunk/test/<wbr>clangd/input-mirror.test<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clangd/input-mirror.test?rev=315214&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/clang-tools-extra/<wbr>trunk/test/clangd/input-<wbr>mirror.test?rev=315214&view=<wbr>auto</a><br>
> ==============================<wbr>==============================<wbr>==================<br>
> --- clang-tools-extra/trunk/test/<wbr>clangd/input-mirror.test (added)<br>
> +++ clang-tools-extra/trunk/test/<wbr>clangd/input-mirror.test Mon Oct  9 09:58:16 2017<br>
> @@ -0,0 +1,154 @@<br>
> +# RUN: clangd -run-synchronously -input-mirror-file %t < %s<br>
> +# Note that we have to use '-Z' as -input-mirror-file does not have a newline at the end of file.<br>
<br>
</div></div>"-Z" isn't supported in some versions of diff, I tested "-b" and it<br>
seems to do the job here, can you change that?<br>
<br>
Thanks,<br>
<div class="HOEnZb"><div class="h5"><br>
> +# RUN: diff -Z %t %s<br>
> +# It is absolutely vital that this file has CRLF line endings.<br>
> +#<br>
> +Content-Length: 125<br>
> +<br>
> +{"jsonrpc":"2.0","id":0,"<wbr>method":"initialize","params":<wbr>{"processId":123,"rootPath":"<wbr>clangd","capabilities":{},"<wbr>trace":"off"}}<br>
> +<br>
> +Content-Length: 172<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didOpen","params"<wbr>:{"textDocument":{"uri":"file:<wbr>///main.cpp","languageId":"<wbr>cpp","version":1,"text":"int main() {\nint a;\na;\n}\n"}}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>2,"character":0}}}<br>
> +# Go to local variable<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>2,"character":1}}}<br>
> +# Go to local variable, end of token<br>
> +<br>
> +Content-Length: 214<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>2},"contentChanges":[{"text":"<wbr>struct Foo {\nint x;\n};\nint main() {\n  Foo bar = { x : 1 };\n}\n"}]}}<br>
> +<br>
> +Content-Length: 149<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>4,"character":14}}}<br>
> +# Go to field, GNU old-style field designator<br>
> +<br>
> +Content-Length: 215<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>3},"contentChanges":[{"text":"<wbr>struct Foo {\nint x;\n};\nint main() {\n  Foo baz = { .x = 2 };\n}\n"}]}}<br>
> +<br>
> +Content-Length: 149<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>4,"character":15}}}<br>
> +# Go to field, field designator<br>
> +<br>
> +Content-Length: 187<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>4},"contentChanges":[{"text":"<wbr>int main() {\n   main();\n   return 0;\n}"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>1,"character":3}}}<br>
> +# Go to function declaration, function call<br>
> +<br>
> +Content-Length: 208<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>5},"contentChanges":[{"text":"<wbr>struct Foo {\n};\nint main() {\n   Foo bar;\n   return 0;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>3,"character":3}}}<br>
> +# Go to struct declaration, new struct instance<br>
> +<br>
> +Content-Length: 231<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>5},"contentChanges":[{"text":"<wbr>namespace n1 {\nstruct Foo {\n};\n}\nint main() {\n   n1::Foo bar;\n   return 0;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>5,"character":4}}}<br>
> +# Go to struct declaration, new struct instance, qualified name<br>
> +<br>
> +Content-Length: 215<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>6},"contentChanges":[{"text":"<wbr>struct Foo {\n  int x;\n};\nint main() {\n   Foo bar;\n   bar.x;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>5,"character":7}}}<br>
> +# Go to field declaration, field reference<br>
> +<br>
> +Content-Length: 220<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>7},"contentChanges":[{"text":"<wbr>struct Foo {\n  void x();\n};\nint main() {\n   Foo bar;\n   bar.x();\n}\n"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>5,"character":7}}}<br>
> +# Go to method declaration, method call<br>
> +<br>
> +Content-Length: 240<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>7},"contentChanges":[{"text":"<wbr>struct Foo {\n};\ntypedef Foo TypedefFoo;\nint main() {\n   TypedefFoo bar;\n   return 0;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 149<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>4,"character":10}}}<br>
> +# Go to typedef<br>
> +<br>
> +Content-Length: 254<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>7},"contentChanges":[{"text":"<wbr>template <typename MyTemplateParam>\nvoid foo() {\n MyTemplateParam a;\n}\nint main() {\n   return 0;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 149<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>2,"character":13}}}<br>
> +# Go to template type parameter. Fails until clangIndex is modified to handle those.<br>
> +# no-CHECK: {"jsonrpc":"2.0","id":1,"<wbr>result":[{"uri": "file:///main.cpp", "range": {"start": {"line": 0, "character": 10}, "end": {"line": 0, "character": 34}}}]}<br>
> +<br>
> +Content-Length: 256<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>7},"contentChanges":[{"text":"<wbr>namespace ns {\nstruct Foo {\nstatic void bar() {}\n};\n}\nint main() {\n   ns::Foo::bar();\n   return 0;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>6,"character":4}}}<br>
> +# Go to namespace, static method call<br>
> +<br>
> +Content-Length: 265<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>7},"contentChanges":[{"text":"<wbr>namespace ns {\nstruct Foo {\n  int field;\n  Foo(int param) : field(param) {}\n};\n}\nint main() {\n   return 0;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 149<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>3,"character":21}}}<br>
> +# Go to field, member initializer<br>
> +<br>
> +Content-Length: 204<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>7},"contentChanges":[{"text":"<wbr>#define MY_MACRO 0\nint main() {\n  return MY_MACRO;\n}\n"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>2,"character":9}}}<br>
> +# Go to macro.<br>
> +<br>
> +Content-Length: 217<br>
> +<br>
> +{"jsonrpc":"2.0","method":"<wbr>textDocument/didChange","<wbr>params":{"textDocument":{"uri"<wbr>:"file:///main.cpp","version":<wbr>7},"contentChanges":[{"text":"<wbr>#define FOO 1\nint a = FOO;\n#define FOO 2\nint b = FOO;\n#undef FOO\n"}]}}<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>1,"character":8}}}<br>
> +# Go to macro, re-defined later<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>3,"character":8}}}<br>
> +# Go to macro, undefined later<br>
> +<br>
> +Content-Length: 148<br>
> +<br>
> +{"jsonrpc":"2.0","id":1,"<wbr>method":"textDocument/<wbr>definition","params":{"<wbr>textDocument":{"uri":"file:///<wbr>main.cpp"},"position":{"line":<wbr>4,"character":7}}}<br>
> +# Go to macro, being undefined<br>
> +<br>
> +Content-Length: 44<br>
> +<br>
> +{"jsonrpc":"2.0","id":3,"<wbr>method":"shutdown"}<br>
><br>
><br>
> ______________________________<wbr>_________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
<br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Bruno Cardoso Lopes<br>
<a href="http://www.brunocardoso.cc" rel="noreferrer" target="_blank">http://www.brunocardoso.cc</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div>Regards,</div><div>Ilya Biryukov</div></div></div></div></div>
</div>