<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">You are very welcome. Sorry for the trouble!<div class=""><br class=""></div><div class="">Jan<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 28 Nov 2018, at 11:47, Tom Weaver via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">thanks for the fix!<div class=""><br class=""></div><div class="">TomW</div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Wed, 28 Nov 2018 at 11:33, Yvan Roux via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Wed, 28 Nov 2018 at 12:28, Yvan Roux <<a href="mailto:yvan.roux@linaro.org" target="_blank" class="">yvan.roux@linaro.org</a>> wrote:<br class="">
><br class="">
> On Wed, 28 Nov 2018 at 11:16, Mikael Holmén <<a href="mailto:mikael.holmen@ericsson.com" target="_blank" class="">mikael.holmen@ericsson.com</a>> wrote:<br class="">
> ><br class="">
> ><br class="">
> ><br class="">
> > On 11/28/18 11:09 AM, Jan Korous wrote:<br class="">
> > > Thanks for the notice and sorry for the delay! I somehow missed the<br class="">
> > > failure mails before I went offline yesterday.<br class="">
> > ><br class="">
> > > I am just running tests on my fix now and hopefully pushing shortly.<br class="">
> > ><br class="">
> > > Since I didn’t know we are using old compilers for these builds I am now<br class="">
> > > curious why. Is that intentional? For backward-compatibility?<br class="">
> ><br class="">
> > I can't speak for the ARM bots, but I myself is doing my development on<br class="">
> > ubuntu 14.04 and there I get clang 3.6.0.<br class="">
><br class="">
> ARM bots are running inside Ubuntu 16.04.1 LTS containers in which<br class="">
> default clang version is 3.8<br class="">
<br class="">
Bots fixed BTW, Thanks :)<br class="">
<br class="">
><br class="">
> > And<br class="">
> ><br class="">
> > <a href="https://llvm.org/docs/GettingStarted.html#host-c-toolchain-both-compiler-and-standard-library" rel="noreferrer" target="_blank" class="">https://llvm.org/docs/GettingStarted.html#host-c-toolchain-both-compiler-and-standard-library</a><br class="">
> ><br class="">
> > suggests that even clang 3.1 should work.<br class="">
> ><br class="">
> > /Mikael<br class="">
> ><br class="">
> > ><br class="">
> > > Thanks.<br class="">
> > ><br class="">
> > > Jan<br class="">
> > ><br class="">
> > >> On Nov 28, 2018, at 8:59 AM, Yvan Roux <<a href="mailto:yvan.roux@linaro.org" target="_blank" class="">yvan.roux@linaro.org</a><br class="">
> > >> <mailto:<a href="mailto:yvan.roux@linaro.org" target="_blank" class="">yvan.roux@linaro.org</a>>> wrote:<br class="">
> > >><br class="">
> > >> On Wed, 28 Nov 2018 at 09:56, Mikael Holmén via cfe-commits<br class="">
> > >> <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a> <mailto:<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>>> wrote:<br class="">
> > >>><br class="">
> > >>> Hi Jan,<br class="">
> > >>><br class="">
> > >>> This code doesn't compile with clang 3.6.0:<br class="">
> > >><br class="">
> > >> And broke ARM bots, logs available here:<br class="">
> > >><br class="">
> > >> <a href="http://lab.llvm.org:8011/builders/clang-cmake-armv7-quick/builds/5582/steps/build%20stage%201/logs/stdio" rel="noreferrer" target="_blank" class="">http://lab.llvm.org:8011/builders/clang-cmake-armv7-quick/builds/5582/steps/build%20stage%201/logs/stdio</a><br class="">
> > >><br class="">
> > >> Cheers,<br class="">
> > >> Yvan<br class="">
> > >><br class="">
> > >>> ../tools/clang/tools/extra/clangd/Protocol.cpp:456:10: error: no viable<br class="">
> > >>> conversion from 'json::Object' to 'llvm::json::Value'<br class="">
> > >>>   return result;<br class="">
> > >>>          ^~~~~~<br class="">
> > >>> ../include/llvm/Support/JSON.h:291:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'const<br class="">
> > >>> llvm::json::Value &' for 1st argument<br class="">
> > >>>   Value(const Value &M) { copyFrom(M); }<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:292:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'llvm::json::Value<br class="">
> > >>> &&' for 1st argument<br class="">
> > >>>   Value(Value &&M) { moveFrom(std::move(M)); }<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:293:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to<br class="">
> > >>> 'std::initializer_list<Value>' for 1st argument<br class="">
> > >>>   Value(std::initializer_list<Value> Elements);<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:294:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'json::Array &&' for<br class="">
> > >>> 1st argument<br class="">
> > >>>   Value(json::Array &&Elements) : Type(T_Array) {<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:299:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'json::Object &&' for<br class="">
> > >>> 1st argument<br class="">
> > >>>   Value(json::Object &&Properties) : Type(T_Object) {<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:305:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'std::string' (aka<br class="">
> > >>> 'basic_string<char>') for 1st argument<br class="">
> > >>>   Value(std::string V) : Type(T_String) {<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:312:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'const<br class="">
> > >>> llvm::SmallVectorImpl<char> &' for 1st argument<br class="">
> > >>>   Value(const llvm::SmallVectorImpl<char> &V)<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:314:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'const<br class="">
> > >>> llvm::formatv_object_base &' for 1st argument<br class="">
> > >>>   Value(const llvm::formatv_object_base &V) : Value(V.str()){};<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:316:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'llvm::StringRef' for<br class="">
> > >>> 1st argument<br class="">
> > >>>   Value(StringRef V) : Type(T_StringRef) {<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:323:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'const char *' for<br class="">
> > >>> 1st argument<br class="">
> > >>>   Value(const char *V) : Value(StringRef(V)) {}<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:324:3: note: candidate constructor not<br class="">
> > >>> viable: no known conversion from 'json::Object' to 'std::nullptr_t' (aka<br class="">
> > >>> 'nullptr_t') for 1st argument<br class="">
> > >>>   Value(std::nullptr_t) : Type(T_Null) {}<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:298:3: note: candidate template ignored:<br class="">
> > >>> could not match 'vector<type-parameter-0-0,<br class="">
> > >>> allocator<type-parameter-0-0> >' against 'llvm::json::Object'<br class="">
> > >>>   Value(const std::vector<Elt> &C) : Value(json::Array(C)) {}<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:303:3: note: candidate template ignored:<br class="">
> > >>> could not match 'map<std::basic_string<char>, type-parameter-0-0,<br class="">
> > >>> std::less<std::basic_string<char> >, allocator<pair<const<br class="">
> > >>> std::basic_string<char>, type-parameter-0-0> > >' against<br class="">
> > >>> 'llvm::json::Object'<br class="">
> > >>>   Value(const std::map<std::string, Elt> &C) : Value(json::Object(C)) {}<br class="">
> > >>>   ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:329:42: note: candidate template ignored:<br class="">
> > >>> disabled by 'enable_if' [with T = llvm::json::Object]<br class="">
> > >>>       typename = typename std::enable_if<std::is_same<T,<br class="">
> > >>> bool>::value>::type,<br class="">
> > >>>                                          ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:337:42: note: candidate template ignored:<br class="">
> > >>> disabled by 'enable_if' [with T = llvm::json::Object]<br class="">
> > >>>       typename = typename<br class="">
> > >>> std::enable_if<std::is_integral<T>::value>::type,<br class="">
> > >>>                                          ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:345:41: note: candidate template ignored:<br class="">
> > >>> disabled by 'enable_if' [with T = llvm::json::Object]<br class="">
> > >>>                 typename<br class="">
> > >>> std::enable_if<std::is_floating_point<T>::value>::type,<br class="">
> > >>>                                         ^<br class="">
> > >>> ../include/llvm/Support/JSON.h:355:3: note: candidate template ignored:<br class="">
> > >>> substitution failure [with T = llvm::json::Object]: no matching function<br class="">
> > >>> for call to 'toJSON'<br class="">
> > >>>   Value(const T &V) : Value(toJSON(V)) {}<br class="">
> > >>>   ^<br class="">
> > >>> 1 error generated.<br class="">
> > >>><br class="">
> > >>> ---<br class="">
> > >>><br class="">
> > >>> It looks very similar to a problem that was fixed in r347539:<br class="">
> > >>><br class="">
> > >>> -  return Result;<br class="">
> > >>> +  // Older gcc cannot compile 'return Result', even though it is legal.<br class="">
> > >>> +  return json::Value(std::move(Result));<br class="">
> > >>><br class="">
> > >>> Regards,<br class="">
> > >>> Mikael<br class="">
> > >>><br class="">
> > >>> On 11/27/18 5:40 PM, Jan Korous via cfe-commits wrote:<br class="">
> > >>>> Author: jkorous<br class="">
> > >>>> Date: Tue Nov 27 08:40:46 2018<br class="">
> > >>>> New Revision: 347675<br class="">
> > >>>><br class="">
> > >>>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=347675&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=347675&view=rev</a><br class="">
> > >>>> Log:<br class="">
> > >>>> [clangd] textDocument/SymbolInfo extension<br class="">
> > >>>><br class="">
> > >>>> New method returning symbol info for given source position.<br class="">
> > >>>><br class="">
> > >>>> Differential Revision: <a href="https://reviews.llvm.org/D54799" rel="noreferrer" target="_blank" class="">https://reviews.llvm.org/D54799</a><br class="">
> > >>>><br class="">
> > >>>> <a href="rdar://problem/46050281" class="">rdar://problem/46050281</a><br class="">
> > >>>><br class="">
> > >>>> Added:<br class="">
> > >>>>     clang-tools-extra/trunk/test/clangd/symbol-info.test<br class="">
> > >>>>     clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp<br class="">
> > >>>> Modified:<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/ClangdLSPServer.h<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/ClangdServer.cpp<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/ClangdServer.h<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/Protocol.cpp<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/Protocol.h<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/XRefs.cpp<br class="">
> > >>>>     clang-tools-extra/trunk/clangd/XRefs.h<br class="">
> > >>>>     clang-tools-extra/trunk/unittests/clangd/CMakeLists.txt<br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp Tue Nov 27<br class="">
> > >>>> 08:40:46 2018<br class="">
> > >>>> @@ -698,6 +698,12 @@ void ClangdLSPServer::onReference(const<br class="">
> > >>>>                           std::move(Reply));<br class="">
> > >>>>  }<br class="">
> > >>>><br class="">
> > >>>> +void ClangdLSPServer::onSymbolInfo(const TextDocumentPositionParams<br class="">
> > >>>> &Params,<br class="">
> > >>>> +<br class="">
> > >>>>                                   Callback<std::vector<SymbolDetails>><br class="">
> > >>>> Reply) {<br class="">
> > >>>> +  Server->symbolInfo(Params.textDocument.uri.file(), Params.position,<br class="">
> > >>>> +                     std::move(Reply));<br class="">
> > >>>> +}<br class="">
> > >>>> +<br class="">
> > >>>>  ClangdLSPServer::ClangdLSPServer(class Transport &Transp,<br class="">
> > >>>>                                   const clangd::CodeCompleteOptions<br class="">
> > >>>> &CCOpts,<br class="">
> > >>>>                                   Optional<Path> CompileCommandsDir,<br class="">
> > >>>> @@ -733,6 +739,7 @@ ClangdLSPServer::ClangdLSPServer(class T<br class="">
> > >>>>    MsgHandler->bind("textDocument/didChange",<br class="">
> > >>>> &ClangdLSPServer::onDocumentDidChange);<br class="">
> > >>>>    MsgHandler->bind("workspace/didChangeWatchedFiles",<br class="">
> > >>>> &ClangdLSPServer::onFileEvent);<br class="">
> > >>>>    MsgHandler->bind("workspace/didChangeConfiguration",<br class="">
> > >>>> &ClangdLSPServer::onChangeConfiguration);<br class="">
> > >>>> +  MsgHandler->bind("textDocument/symbolInfo",<br class="">
> > >>>> &ClangdLSPServer::onSymbolInfo);<br class="">
> > >>>>    // clang-format on<br class="">
> > >>>>  }<br class="">
> > >>>><br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/ClangdLSPServer.h<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.h?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.h?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/ClangdLSPServer.h (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/ClangdLSPServer.h Tue Nov 27<br class="">
> > >>>> 08:40:46 2018<br class="">
> > >>>> @@ -92,6 +92,8 @@ private:<br class="">
> > >>>>    void onHover(const TextDocumentPositionParams &,<br class="">
> > >>>>                 Callback<llvm::Optional<Hover>>);<br class="">
> > >>>>    void onChangeConfiguration(const DidChangeConfigurationParams &);<br class="">
> > >>>> +  void onSymbolInfo(const TextDocumentPositionParams &,<br class="">
> > >>>> +                    Callback<std::vector<SymbolDetails>>);<br class="">
> > >>>><br class="">
> > >>>>    std::vector<Fix> getFixes(StringRef File, const<br class="">
> > >>>> clangd::Diagnostic &D);<br class="">
> > >>>><br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Tue Nov 27<br class="">
> > >>>> 08:40:46 2018<br class="">
> > >>>> @@ -503,6 +503,18 @@ void ClangdServer::findReferences(PathRe<br class="">
> > >>>>    WorkScheduler.runWithAST("References", File, Bind(Action,<br class="">
> > >>>> std::move(CB)));<br class="">
> > >>>>  }<br class="">
> > >>>><br class="">
> > >>>> +void ClangdServer::symbolInfo(PathRef File, Position Pos,<br class="">
> > >>>> +                              Callback<std::vector<SymbolDetails>><br class="">
> > >>>> CB) {<br class="">
> > >>>> +  auto Action = [Pos](Callback<std::vector<SymbolDetails>> CB,<br class="">
> > >>>> +                      Expected<InputsAndAST> InpAST) {<br class="">
> > >>>> +    if (!InpAST)<br class="">
> > >>>> +      return CB(InpAST.takeError());<br class="">
> > >>>> +    CB(clangd::getSymbolInfo(InpAST->AST, Pos));<br class="">
> > >>>> +  };<br class="">
> > >>>> +<br class="">
> > >>>> +  WorkScheduler.runWithAST("SymbolInfo", File, Bind(Action,<br class="">
> > >>>> std::move(CB)));<br class="">
> > >>>> +}<br class="">
> > >>>> +<br class="">
> > >>>>  std::vector<std::pair<Path, std::size_t>><br class="">
> > >>>>  ClangdServer::getUsedBytesPerFile() const {<br class="">
> > >>>>    return WorkScheduler.getUsedBytesPerFile();<br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/ClangdServer.h<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.h?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.h?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/ClangdServer.h (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/ClangdServer.h Tue Nov 27<br class="">
> > >>>> 08:40:46 2018<br class="">
> > >>>> @@ -202,6 +202,11 @@ public:<br class="">
> > >>>>    /// Called when an event occurs for a watched file in the workspace.<br class="">
> > >>>>    void onFileEvent(const DidChangeWatchedFilesParams &Params);<br class="">
> > >>>><br class="">
> > >>>> +  /// Get symbol info for given position.<br class="">
> > >>>> +  /// Clangd extension - not part of official LSP.<br class="">
> > >>>> +  void symbolInfo(PathRef File, Position Pos,<br class="">
> > >>>> +                  Callback<std::vector<SymbolDetails>> CB);<br class="">
> > >>>> +<br class="">
> > >>>>    /// Returns estimated memory usage for each of the currently open<br class="">
> > >>>> files.<br class="">
> > >>>>    /// The order of results is unspecified.<br class="">
> > >>>>    /// Overall memory usage of clangd may be significantly more than<br class="">
> > >>>> reported<br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/Protocol.cpp<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.cpp?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.cpp?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/Protocol.cpp (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/Protocol.cpp Tue Nov 27 08:40:46 2018<br class="">
> > >>>> @@ -14,7 +14,9 @@<br class="">
> > >>>>  #include "Protocol.h"<br class="">
> > >>>>  #include "Logger.h"<br class="">
> > >>>>  #include "URI.h"<br class="">
> > >>>> +#include "index/Index.h"<br class="">
> > >>>>  #include "clang/Basic/LLVM.h"<br class="">
> > >>>> +#include "llvm/ADT/Hashing.h"<br class="">
> > >>>>  #include "llvm/ADT/SmallString.h"<br class="">
> > >>>>  #include "llvm/Support/Format.h"<br class="">
> > >>>>  #include "llvm/Support/FormatVariadic.h"<br class="">
> > >>>> @@ -428,6 +430,44 @@ raw_ostream &operator<<(raw_ostream &O,<br class="">
> > >>>>    return O;<br class="">
> > >>>>  }<br class="">
> > >>>><br class="">
> > >>>> +bool operator==(const SymbolDetails &LHS, const SymbolDetails &RHS) {<br class="">
> > >>>> +  return LHS.name == RHS.name && LHS.containerName ==<br class="">
> > >>>> RHS.containerName &&<br class="">
> > >>>> +         LHS.USR == RHS.USR && <a href="http://lhs.id/" rel="noreferrer" target="_blank" class="">LHS.ID</a> == <a href="http://rhs.id/" rel="noreferrer" target="_blank" class="">RHS.ID</a>;<br class="">
> > >>>> +}<br class="">
> > >>>> +<br class="">
> > >>>> +llvm::json::Value toJSON(const SymbolDetails &P) {<br class="">
> > >>>> +  json::Object result{{"name", llvm::json::Value(nullptr)},<br class="">
> > >>>> +                      {"containerName", llvm::json::Value(nullptr)},<br class="">
> > >>>> +                      {"usr", llvm::json::Value(nullptr)},<br class="">
> > >>>> +                      {"id", llvm::json::Value(nullptr)}};<br class="">
> > >>>> +<br class="">
> > >>>> +  if (!P.name.empty())<br class="">
> > >>>> +    result["name"] = P.name;<br class="">
> > >>>> +<br class="">
> > >>>> +  if (!P.containerName.empty())<br class="">
> > >>>> +    result["containerName"] = P.containerName;<br class="">
> > >>>> +<br class="">
> > >>>> +  if (!P.USR.empty())<br class="">
> > >>>> +    result["usr"] = P.USR;<br class="">
> > >>>> +<br class="">
> > >>>> +  if (P.ID.hasValue())<br class="">
> > >>>> +    result["id"] = P.ID.getValue().str();<br class="">
> > >>>> +<br class="">
> > >>>> +  return result;<br class="">
> > >>>> +}<br class="">
> > >>>> +<br class="">
> > >>>> +llvm::raw_ostream &operator<<(llvm::raw_ostream &O, const<br class="">
> > >>>> SymbolDetails &S) {<br class="">
> > >>>> +  if (!S.containerName.empty()) {<br class="">
> > >>>> +    O << S.containerName;<br class="">
> > >>>> +    StringRef ContNameRef;<br class="">
> > >>>> +    if (!ContNameRef.endswith("::")) {<br class="">
> > >>>> +      O << " ";<br class="">
> > >>>> +    }<br class="">
> > >>>> +  }<br class="">
> > >>>> +  O << S.name << " - " << toJSON(S);<br class="">
> > >>>> +  return O;<br class="">
> > >>>> +}<br class="">
> > >>>> +<br class="">
> > >>>>  bool fromJSON(const json::Value &Params, WorkspaceSymbolParams &R) {<br class="">
> > >>>>    json::ObjectMapper O(Params);<br class="">
> > >>>>    return O && O.map("query", R.query);<br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/Protocol.h<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.h?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.h?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/Protocol.h (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/Protocol.h Tue Nov 27 08:40:46 2018<br class="">
> > >>>> @@ -713,6 +713,26 @@ struct SymbolInformation {<br class="">
> > >>>>  llvm::json::Value toJSON(const SymbolInformation &);<br class="">
> > >>>>  llvm::raw_ostream &operator<<(llvm::raw_ostream &, const<br class="">
> > >>>> SymbolInformation &);<br class="">
> > >>>><br class="">
> > >>>> +/// Represents information about identifier.<br class="">
> > >>>> +/// This is returned from textDocument/symbolInfo, which is a<br class="">
> > >>>> clangd extension.<br class="">
> > >>>> +struct SymbolDetails {<br class="">
> > >>>> +  std::string name;<br class="">
> > >>>> +<br class="">
> > >>>> +  std::string containerName;<br class="">
> > >>>> +<br class="">
> > >>>> +  /// Unified Symbol Resolution identifier<br class="">
> > >>>> +  /// This is an opaque string uniquely identifying a symbol.<br class="">
> > >>>> +  /// Unlike SymbolID, it is variable-length and somewhat<br class="">
> > >>>> human-readable.<br class="">
> > >>>> +  /// It is a common representation across several clang tools.<br class="">
> > >>>> +  /// (See USRGeneration.h)<br class="">
> > >>>> +  std::string USR;<br class="">
> > >>>> +<br class="">
> > >>>> +  llvm::Optional<SymbolID> ID;<br class="">
> > >>>> +};<br class="">
> > >>>> +llvm::json::Value toJSON(const SymbolDetails &);<br class="">
> > >>>> +llvm::raw_ostream &operator<<(llvm::raw_ostream &, const<br class="">
> > >>>> SymbolDetails &);<br class="">
> > >>>> +bool operator==(const SymbolDetails &, const SymbolDetails &);<br class="">
> > >>>> +<br class="">
> > >>>>  /// The parameters of a Workspace Symbol Request.<br class="">
> > >>>>  struct WorkspaceSymbolParams {<br class="">
> > >>>>    /// A non-empty query string<br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/XRefs.cpp<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.cpp?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.cpp?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/XRefs.cpp (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/XRefs.cpp Tue Nov 27 08:40:46 2018<br class="">
> > >>>> @@ -750,5 +750,48 @@ std::vector<Location> findReferences(Par<br class="">
> > >>>>    return Results;<br class="">
> > >>>>  }<br class="">
> > >>>><br class="">
> > >>>> +std::vector<SymbolDetails> getSymbolInfo(ParsedAST &AST, Position<br class="">
> > >>>> Pos) {<br class="">
> > >>>> +  const SourceManager &SM = AST.getASTContext().getSourceManager();<br class="">
> > >>>> +<br class="">
> > >>>> +  auto Loc = getBeginningOfIdentifier(AST, Pos, SM.getMainFileID());<br class="">
> > >>>> +  auto Symbols = getSymbolAtPosition(AST, Loc);<br class="">
> > >>>> +<br class="">
> > >>>> +  std::vector<SymbolDetails> Results;<br class="">
> > >>>> +<br class="">
> > >>>> +  for (const auto &Sym : Symbols.Decls) {<br class="">
> > >>>> +    SymbolDetails NewSymbol;<br class="">
> > >>>> +    if (const NamedDecl *ND = dyn_cast<NamedDecl>(Sym.D)) {<br class="">
> > >>>> +      std::string QName = printQualifiedName(*ND);<br class="">
> > >>>> +      std::tie(NewSymbol.containerName, NewSymbol.name) =<br class="">
> > >>>> +          splitQualifiedName(QName);<br class="">
> > >>>> +<br class="">
> > >>>> +      if (NewSymbol.containerName.empty()) {<br class="">
> > >>>> +        if (const auto *ParentND =<br class="">
> > >>>> +                dyn_cast_or_null<NamedDecl>(ND->getDeclContext()))<br class="">
> > >>>> +          NewSymbol.containerName = printQualifiedName(*ParentND);<br class="">
> > >>>> +      }<br class="">
> > >>>> +    }<br class="">
> > >>>> +    llvm::SmallString<32> USR;<br class="">
> > >>>> +    if (!index::generateUSRForDecl(Sym.D, USR)) {<br class="">
> > >>>> +      NewSymbol.USR = USR.str();<br class="">
> > >>>> +      NewSymbol.ID = SymbolID(NewSymbol.USR);<br class="">
> > >>>> +    }<br class="">
> > >>>> +    Results.push_back(std::move(NewSymbol));<br class="">
> > >>>> +  }<br class="">
> > >>>> +<br class="">
> > >>>> +  for (const auto &Macro : Symbols.Macros) {<br class="">
> > >>>> +    SymbolDetails NewMacro;<br class="">
> > >>>> +    NewMacro.name = Macro.Name;<br class="">
> > >>>> +    llvm::SmallString<32> USR;<br class="">
> > >>>> +    if (!index::generateUSRForMacro(NewMacro.name, Loc, SM, USR)) {<br class="">
> > >>>> +      NewMacro.USR = USR.str();<br class="">
> > >>>> +      NewMacro.ID = SymbolID(NewMacro.USR);<br class="">
> > >>>> +    }<br class="">
> > >>>> +    Results.push_back(std::move(NewMacro));<br class="">
> > >>>> +  }<br class="">
> > >>>> +<br class="">
> > >>>> +  return Results;<br class="">
> > >>>> +}<br class="">
> > >>>> +<br class="">
> > >>>>  } // namespace clangd<br class="">
> > >>>>  } // namespace clang<br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/clangd/XRefs.h<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.h?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.h?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/clangd/XRefs.h (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/clangd/XRefs.h Tue Nov 27 08:40:46 2018<br class="">
> > >>>> @@ -38,6 +38,9 @@ llvm::Optional<Hover> getHover(ParsedAST<br class="">
> > >>>>  std::vector<Location> findReferences(ParsedAST &AST, Position Pos,<br class="">
> > >>>>                                       const SymbolIndex *Index =<br class="">
> > >>>> nullptr);<br class="">
> > >>>><br class="">
> > >>>> +/// Get info about symbols at \p Pos.<br class="">
> > >>>> +std::vector<SymbolDetails> getSymbolInfo(ParsedAST &AST, Position Pos);<br class="">
> > >>>> +<br class="">
> > >>>>  } // namespace clangd<br class="">
> > >>>>  } // namespace clang<br class="">
> > >>>><br class="">
> > >>>><br class="">
> > >>>> Added: clang-tools-extra/trunk/test/clangd/symbol-info.test<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clangd/symbol-info.test?rev=347675&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clangd/symbol-info.test?rev=347675&view=auto</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/test/clangd/symbol-info.test (added)<br class="">
> > >>>> +++ clang-tools-extra/trunk/test/clangd/symbol-info.test Tue Nov 27<br class="">
> > >>>> 08:40:46 2018<br class="">
> > >>>> @@ -0,0 +1,14 @@<br class="">
> > >>>> +# RUN: clangd -lit-test < %s | FileCheck %s<br class="">
> > >>>> +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}<br class="">
> > >>>> +---<br class="">
> > >>>> +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"<a href="test:///simple.cpp" class="">test:///simple.cpp</a>","languageId":"cpp","version":1,"text":"void<br class="">
> > >>>> foo(); int main() { foo(); }\n"}}}<br class="">
> > >>>> +---<br class="">
> > >>>> +{"jsonrpc":"2.0","id":1,"method":"textDocument/symbolInfo","params":{"textDocument":{"uri":"<a href="test:///simple.cpp" class="">test:///simple.cpp</a>"},"position":{"line":0,"character":27}}}<br class="">
> > >>>> +#      CHECK:    "containerName": null,<br class="">
> > >>>> +# CHECK-NEXT:    "id": "CA2EBE44A1D76D2A",<br class="">
> > >>>> +# CHECK-NEXT:    "name": "foo",<br class="">
> > >>>> +# CHECK-NEXT:    "usr": "c:@F@foo#"<br class="">
> > >>>> +---<br class="">
> > >>>> +{"jsonrpc":"2.0","id":3,"method":"shutdown"}<br class="">
> > >>>> +---<br class="">
> > >>>> +{"jsonrpc":"2.0","method":"exit"}<br class="">
> > >>>><br class="">
> > >>>> Modified: clang-tools-extra/trunk/unittests/clangd/CMakeLists.txt<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/CMakeLists.txt?rev=347675&r1=347674&r2=347675&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/CMakeLists.txt?rev=347675&r1=347674&r2=347675&view=diff</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/unittests/clangd/CMakeLists.txt (original)<br class="">
> > >>>> +++ clang-tools-extra/trunk/unittests/clangd/CMakeLists.txt Tue Nov<br class="">
> > >>>> 27 08:40:46 2018<br class="">
> > >>>> @@ -35,6 +35,7 @@ add_extra_unittest(ClangdTests<br class="">
> > >>>>    SerializationTests.cpp<br class="">
> > >>>>    SourceCodeTests.cpp<br class="">
> > >>>>    SymbolCollectorTests.cpp<br class="">
> > >>>> +  SymbolInfoTests.cpp<br class="">
> > >>>>    SyncAPI.cpp<br class="">
> > >>>>    TUSchedulerTests.cpp<br class="">
> > >>>>    TestFS.cpp<br class="">
> > >>>><br class="">
> > >>>> Added: clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp<br class="">
> > >>>> URL:<br class="">
> > >>>> <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp?rev=347675&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp?rev=347675&view=auto</a><br class="">
> > >>>> ==============================================================================<br class="">
> > >>>> --- clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp (added)<br class="">
> > >>>> +++ clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp Tue<br class="">
> > >>>> Nov 27 08:40:46 2018<br class="">
> > >>>> @@ -0,0 +1,357 @@<br class="">
> > >>>> +//===-- SymbolInfoTests.cpp  -----------------------*- C++<br class="">
> > >>>> -*--------------===//<br class="">
> > >>>> +//<br class="">
> > >>>> +//                     The LLVM Compiler Infrastructure<br class="">
> > >>>> +//<br class="">
> > >>>> +// This file is distributed under the University of Illinois Open<br class="">
> > >>>> Source<br class="">
> > >>>> +// License. See LICENSE.TXT for details.<br class="">
> > >>>> +//<br class="">
> > >>>> +//===----------------------------------------------------------------------===//<br class="">
> > >>>> +#include "Annotations.h"<br class="">
> > >>>> +#include "ClangdUnit.h"<br class="">
> > >>>> +#include "Compiler.h"<br class="">
> > >>>> +#include "Matchers.h"<br class="">
> > >>>> +#include "SyncAPI.h"<br class="">
> > >>>> +#include "TestFS.h"<br class="">
> > >>>> +#include "TestTU.h"<br class="">
> > >>>> +#include "XRefs.h"<br class="">
> > >>>> +#include "index/FileIndex.h"<br class="">
> > >>>> +#include "index/SymbolCollector.h"<br class="">
> > >>>> +#include "clang/Index/IndexingAction.h"<br class="">
> > >>>> +#include "llvm/Support/Path.h"<br class="">
> > >>>> +#include "gmock/gmock.h"<br class="">
> > >>>> +#include "gtest/gtest.h"<br class="">
> > >>>> +<br class="">
> > >>>> +using namespace llvm;<br class="">
> > >>>> +namespace clang {<br class="">
> > >>>> +namespace clangd {<br class="">
> > >>>> +namespace {<br class="">
> > >>>> +<br class="">
> > >>>> +using testing::ElementsAreArray;<br class="">
> > >>>> +<br class="">
> > >>>> +auto CreateExpectedSymbolDetails = [](const std::string &name,<br class="">
> > >>>> +                                      const std::string &container,<br class="">
> > >>>> +                                      const std::string &USR) {<br class="">
> > >>>> +  return SymbolDetails{name, container, USR, SymbolID(USR)};<br class="">
> > >>>> +};<br class="">
> > >>>> +<br class="">
> > >>>> +TEST(SymbolInfoTests, All) {<br class="">
> > >>>> +  std::pair<const char *, std::vector<SymbolDetails>><br class="">
> > >>>> +      TestInputExpectedOutput[] = {<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Simple function reference - declaration<br class="">
> > >>>> +          void foo();<br class="">
> > >>>> +          int bar() {<br class="">
> > >>>> +            fo^o();<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@F@foo#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Simple function reference - definition<br class="">
> > >>>> +          void foo() {}<br class="">
> > >>>> +          int bar() {<br class="">
> > >>>> +            fo^o();<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@F@foo#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Function in namespace reference<br class="">
> > >>>> +          namespace bar {<br class="">
> > >>>> +            void foo();<br class="">
> > >>>> +            int baz() {<br class="">
> > >>>> +              fo^o();<br class="">
> > >>>> +            }<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "bar::",<br class="">
> > >>>> "c:@N@bar@F@foo#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Function in different namespace reference<br class="">
> > >>>> +          namespace bar {<br class="">
> > >>>> +            void foo();<br class="">
> > >>>> +          }<br class="">
> > >>>> +          namespace barbar {<br class="">
> > >>>> +            int baz() {<br class="">
> > >>>> +              bar::fo^o();<br class="">
> > >>>> +            }<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "bar::",<br class="">
> > >>>> "c:@N@bar@F@foo#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Function in global namespace reference<br class="">
> > >>>> +          void foo();<br class="">
> > >>>> +          namespace Nbar {<br class="">
> > >>>> +            namespace Nbaz {<br class="">
> > >>>> +              int baz() {<br class="">
> > >>>> +                ::fo^o();<br class="">
> > >>>> +              }<br class="">
> > >>>> +            }<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@F@foo#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Function in anonymous namespace reference<br class="">
> > >>>> +          namespace {<br class="">
> > >>>> +            void foo();<br class="">
> > >>>> +          }<br class="">
> > >>>> +          namespace barbar {<br class="">
> > >>>> +            int baz() {<br class="">
> > >>>> +              fo^o();<br class="">
> > >>>> +            }<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "(anonymous)",<br class="">
> > >>>> "c:TestTU.cpp@aN@F@foo#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Function reference - ADL<br class="">
> > >>>> +          namespace bar {<br class="">
> > >>>> +            struct BarType {};<br class="">
> > >>>> +            void foo(const BarType&);<br class="">
> > >>>> +          }<br class="">
> > >>>> +          namespace barbar {<br class="">
> > >>>> +            int baz() {<br class="">
> > >>>> +              bar::BarType b;<br class="">
> > >>>> +              fo^o(b);<br class="">
> > >>>> +            }<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "bar::",<br class="">
> > >>>> "c:@N@bar@F@foo#&1$@N@bar@S@BarType#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Global value reference<br class="">
> > >>>> +          int value;<br class="">
> > >>>> +          void foo(int) { }<br class="">
> > >>>> +          void bar() {<br class="">
> > >>>> +            foo(val^ue);<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("value", "", "c:@value")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Local value reference<br class="">
> > >>>> +          void foo() { int aaa; int bbb = aa^a; }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("aaa", "foo",<br class="">
> > >>>> "c:TestTU.cpp@49@F@foo#@aaa")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Function param<br class="">
> > >>>> +          void bar(int aaa) {<br class="">
> > >>>> +            int bbb = a^aa;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("aaa", "bar",<br class="">
> > >>>> "c:TestTU.cpp@38@F@bar#I#@aaa")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Lambda capture<br class="">
> > >>>> +          int ii;<br class="">
> > >>>> +          auto lam = [ii]() {<br class="">
> > >>>> +            return i^i;<br class="">
> > >>>> +          };<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("ii", "", "c:@ii")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Macro reference<br class="">
> > >>>> +          #define MACRO 5\nint i = MAC^RO;<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("MACRO", "",<br class="">
> > >>>> "c:TestTU.cpp@55@macro@MACRO")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Multiple symbols returned - using overloaded<br class="">
> > >>>> function name<br class="">
> > >>>> +          void foo() {}<br class="">
> > >>>> +          void foo(bool) {}<br class="">
> > >>>> +          void foo(int) {}<br class="">
> > >>>> +          namespace bar {<br class="">
> > >>>> +            using ::fo^o;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {<br class="">
> > >>>> +          CreateExpectedSymbolDetails("foo", "", "c:@F@foo#"),<br class="">
> > >>>> +          CreateExpectedSymbolDetails("foo", "", "c:@F@foo#b#"),<br class="">
> > >>>> +          CreateExpectedSymbolDetails("foo", "", "c:@F@foo#I#")<br class="">
> > >>>> +        }<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Multiple symbols returned - implicit conversion<br class="">
> > >>>> +          struct foo {};<br class="">
> > >>>> +          struct bar {<br class="">
> > >>>> +            bar(const foo&) {}<br class="">
> > >>>> +          };<br class="">
> > >>>> +          void func_baz1(bar) {}<br class="">
> > >>>> +          void func_baz2() {<br class="">
> > >>>> +            foo ff;<br class="">
> > >>>> +            func_baz1(f^f);<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {<br class="">
> > >>>> +          CreateExpectedSymbolDetails("ff", "func_baz2",<br class="">
> > >>>> "c:TestTU.cpp@218@F@func_baz2#@ff"),<br class="">
> > >>>> +          CreateExpectedSymbolDetails("bar", "bar::",<br class="">
> > >>>> "c:@S@bar@F@bar#&1$@S@foo#"),<br class="">
> > >>>> +        }<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Type reference - declaration<br class="">
> > >>>> +          struct foo;<br class="">
> > >>>> +          void bar(fo^o*);<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@S@foo")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Type reference - definition<br class="">
> > >>>> +          struct foo {};<br class="">
> > >>>> +          void bar(fo^o*);<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@S@foo")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Type Reference - template argumen<br class="">
> > >>>> +          struct foo {};<br class="">
> > >>>> +          template<class T> struct bar {};<br class="">
> > >>>> +          void baz() {<br class="">
> > >>>> +            bar<fo^o> b;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@S@foo")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Template parameter reference - type param<br class="">
> > >>>> +          template<class TT> struct bar {<br class="">
> > >>>> +            T^T t;<br class="">
> > >>>> +          };<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        { /* not implemented */ }<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Template parameter reference - type param<br class="">
> > >>>> +          template<int NN> struct bar {<br class="">
> > >>>> +            int a = N^N;<br class="">
> > >>>> +          };<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        { /* not implemented */ }<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Class member reference - objec<br class="">
> > >>>> +          struct foo {<br class="">
> > >>>> +            int aa;<br class="">
> > >>>> +          };<br class="">
> > >>>> +          void bar() {<br class="">
> > >>>> +            foo f;<br class="">
> > >>>> +            f.a^a;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("aa", "foo::", "c:@S@foo@FI@aa")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Class member reference - pointer<br class="">
> > >>>> +          struct foo {<br class="">
> > >>>> +            int aa;<br class="">
> > >>>> +          };<br class="">
> > >>>> +          void bar() {<br class="">
> > >>>> +            &foo::a^a;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("aa", "foo::", "c:@S@foo@FI@aa")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Class method reference - objec<br class="">
> > >>>> +          struct foo {<br class="">
> > >>>> +            void aa() {}<br class="">
> > >>>> +          };<br class="">
> > >>>> +          void bar() {<br class="">
> > >>>> +            foo f;<br class="">
> > >>>> +            f.a^a();<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("aa", "foo::", "c:@S@foo@F@aa#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Class method reference - pointer<br class="">
> > >>>> +          struct foo {<br class="">
> > >>>> +            void aa() {}<br class="">
> > >>>> +          };<br class="">
> > >>>> +          void bar() {<br class="">
> > >>>> +            &foo::a^a;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("aa", "foo::", "c:@S@foo@F@aa#")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Typedef<br class="">
> > >>>> +          typedef int foo;<br class="">
> > >>>> +          void bar() {<br class="">
> > >>>> +            fo^o a;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:TestTU.cpp@T@foo")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Type alias<br class="">
> > >>>> +          using foo = int;<br class="">
> > >>>> +          void bar() {<br class="">
> > >>>> +            fo^o a;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@foo")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Namespace reference<br class="">
> > >>>> +          namespace foo {}<br class="">
> > >>>> +          using namespace fo^o;<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("foo", "", "c:@N@foo")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Enum value reference<br class="">
> > >>>> +          enum foo { bar, baz };<br class="">
> > >>>> +          void f() {<br class="">
> > >>>> +            foo fff = ba^r;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("bar", "foo", "c:@E@foo@bar")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Enum class value reference<br class="">
> > >>>> +          enum class foo { bar, baz };<br class="">
> > >>>> +          void f() {<br class="">
> > >>>> +            foo fff = foo::ba^r;<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {CreateExpectedSymbolDetails("bar", "foo::", "c:@E@foo@bar")}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // Type inferrence with auto keyword<br class="">
> > >>>> +          struct foo {};<br class="">
> > >>>> +          foo getfoo() { return foo{}; }<br class="">
> > >>>> +          void f() {<br class="">
> > >>>> +            au^to a = getfoo();<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {/* not implemented */}<br class="">
> > >>>> +      },<br class="">
> > >>>> +      {<br class="">
> > >>>> +        R"cpp( // decltype<br class="">
> > >>>> +          struct foo {};<br class="">
> > >>>> +          void f() {<br class="">
> > >>>> +            foo f;<br class="">
> > >>>> +            declt^ype(f);<br class="">
> > >>>> +          }<br class="">
> > >>>> +        )cpp",<br class="">
> > >>>> +        {/* not implemented */}<br class="">
> > >>>> +      },<br class="">
> > >>>> +  };<br class="">
> > >>>> +<br class="">
> > >>>> +  for (const auto &T : TestInputExpectedOutput) {<br class="">
> > >>>> +    Annotations TestInput(T.first);<br class="">
> > >>>> +    auto AST = TestTU::withCode(TestInput.code()).build();<br class="">
> > >>>> +<br class="">
> > >>>> +    EXPECT_THAT(getSymbolInfo(AST, TestInput.point()),<br class="">
> > >>>> +                ElementsAreArray(T.second))<br class="">
> > >>>> +        << T.first;<br class="">
> > >>>> +  }<br class="">
> > >>>> +}<br class="">
> > >>>> +<br class="">
> > >>>> +} // namespace<br class="">
> > >>>> +} // namespace clangd<br class="">
> > >>>> +} // namespace clang<br class="">
> > >>>><br class="">
> > >>>><br class="">
> > >>>> _______________________________________________<br class="">
> > >>>> cfe-commits mailing list<br class="">
> > >>>> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a><br class="">
> > >>>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="">
> > >>>><br class="">
> > >>> _______________________________________________<br class="">
> > >>> cfe-commits mailing list<br class="">
> > >>> <a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a> <mailto:<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a>><br class="">
> > >>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="">
> > ><br class="">
> ><br class="">
_______________________________________________<br class="">
cfe-commits mailing list<br class="">
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank" class="">cfe-commits@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="">
</blockquote></div>
_______________________________________________<br class="">cfe-commits mailing list<br class=""><a href="mailto:cfe-commits@lists.llvm.org" class="">cfe-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits<br class=""></div></blockquote></div><br class=""></div></body></html>