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