thanks for the fix!

TomW

On Wed, 28 Nov 2018 at 11:33, Yvan Roux via cfe-commits <
cfe-commits@lists.llvm.org> wrote:

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

Reply via email to