<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="">Thanks for the notice and sorry for the delay! I somehow missed the failure mails before I went offline yesterday.<div class=""><br class=""></div><div class="">I am just running tests on my fix now and hopefully pushing shortly.</div><div class=""><br class=""></div><div class="">Since I didn’t know we are using old compilers for these builds I am now curious why. Is that intentional? For backward-compatibility?</div><div class=""><br class=""></div><div class="">Thanks.</div><div class=""><br class=""></div><div class="">Jan</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Nov 28, 2018, at 8:59 AM, Yvan Roux <<a href="mailto:yvan.roux@linaro.org" class="">yvan.roux@linaro.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">On Wed, 28 Nov 2018 at 09:56, Mikael Holmén via cfe-commits</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class=""><</span><a href="mailto:cfe-commits@lists.llvm.org" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">cfe-commits@lists.llvm.org</a><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">> wrote:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br class="">Hi Jan,<br class=""><br class="">This code doesn't compile with clang 3.6.0:<br class=""></blockquote><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">And broke ARM bots, logs available here:</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><a href="http://lab.llvm.org:8011/builders/clang-cmake-armv7-quick/builds/5582/steps/build%20stage%201/logs/stdio" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">http://lab.llvm.org:8011/builders/clang-cmake-armv7-quick/builds/5582/steps/build%20stage%201/logs/stdio</a><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Cheers,</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><span style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none; float: none; display: inline !important;" class="">Yvan</span><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><br style="caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 13px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; text-decoration: none;" 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 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=""><blockquote type="cite" 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" 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" 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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp?rev=347675&r1=347674&r2=347675&view=diff<br class="">==============================================================================<br class="">--- clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp (original)<br class="">+++ clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp Tue Nov 27 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 &Params,<br class="">+                                   Callback<std::vector<SymbolDetails>> 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 &CCOpts,<br class="">                                  Optional<Path> CompileCommandsDir,<br class="">@@ -733,6 +739,7 @@ ClangdLSPServer::ClangdLSPServer(class T<br class="">   MsgHandler->bind("textDocument/didChange", &ClangdLSPServer::onDocumentDidChange);<br class="">   MsgHandler->bind("workspace/didChangeWatchedFiles", &ClangdLSPServer::onFileEvent);<br class="">   MsgHandler->bind("workspace/didChangeConfiguration", &ClangdLSPServer::onChangeConfiguration);<br class="">+  MsgHandler->bind("textDocument/symbolInfo", &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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.h?rev=347675&r1=347674&r2=347675&view=diff<br class="">==============================================================================<br class="">--- clang-tools-extra/trunk/clangd/ClangdLSPServer.h (original)<br class="">+++ clang-tools-extra/trunk/clangd/ClangdLSPServer.h Tue Nov 27 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 clangd::Diagnostic &D);<br class=""><br class=""><br class="">Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp<br class="">URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=347675&r1=347674&r2=347675&view=diff<br class="">==============================================================================<br class="">--- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original)<br class="">+++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Tue Nov 27 08:40:46 2018<br class="">@@ -503,6 +503,18 @@ void ClangdServer::findReferences(PathRe<br class="">   WorkScheduler.runWithAST("References", File, Bind(Action, std::move(CB)));<br class=""> }<br class=""><br class="">+void ClangdServer::symbolInfo(PathRef File, Position Pos,<br class="">+                              Callback<std::vector<SymbolDetails>> 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, 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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.h?rev=347675&r1=347674&r2=347675&view=diff<br class="">==============================================================================<br class="">--- clang-tools-extra/trunk/clangd/ClangdServer.h (original)<br class="">+++ clang-tools-extra/trunk/clangd/ClangdServer.h Tue Nov 27 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 files.<br class="">   /// The order of results is unspecified.<br class="">   /// Overall memory usage of clangd may be significantly more than reported<br class=""><br class="">Modified: clang-tools-extra/trunk/clangd/Protocol.cpp<br class="">URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.cpp?rev=347675&r1=347674&r2=347675&view=diff<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 == RHS.containerName &&<br class="">+         LHS.USR == RHS.USR && LHS.ID == RHS.ID;<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 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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.h?rev=347675&r1=347674&r2=347675&view=diff<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 SymbolInformation &);<br class=""><br class="">+/// Represents information about identifier.<br class="">+/// This is returned from textDocument/symbolInfo, which is a 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 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 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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.cpp?rev=347675&r1=347674&r2=347675&view=diff<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 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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.h?rev=347675&r1=347674&r2=347675&view=diff<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 = 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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clangd/symbol-info.test?rev=347675&view=auto<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 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":"test:///simple.cpp","languageId":"cpp","version":1,"text":"void foo(); int main() { foo(); }\n"}}}<br class="">+---<br class="">+{"jsonrpc":"2.0","id":1,"method":"textDocument/symbolInfo","params":{"textDocument":{"uri":"test:///simple.cpp"},"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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/CMakeLists.txt?rev=347675&r1=347674&r2=347675&view=diff<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 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: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp?rev=347675&view=auto<br class="">==============================================================================<br class="">--- clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp (added)<br class="">+++ clang-tools-extra/trunk/unittests/clangd/SymbolInfoTests.cpp Tue Nov 27 08:40:46 2018<br class="">@@ -0,0 +1,357 @@<br class="">+//===-- SymbolInfoTests.cpp  -----------------------*- C++ -*--------------===//<br class="">+//<br class="">+//                     The LLVM Compiler Infrastructure<br class="">+//<br class="">+// This file is distributed under the University of Illinois Open 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::", "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::", "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)", "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::", "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", "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", "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", "", "c:TestTU.cpp@55@macro@MACRO")}<br class="">+      },<br class="">+      {<br class="">+        R"cpp( // Multiple symbols returned - using overloaded 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", "c:TestTU.cpp@218@F@func_baz2#@ff"),<br class="">+          CreateExpectedSymbolDetails("bar", "bar::", "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="">cfe-commits@lists.llvm.org<br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits<br class=""><br class=""></blockquote>_______________________________________________<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=""><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a></blockquote></div></blockquote></div><br class=""></div></body></html>