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 > 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