Hi Nathan, This is causing a test failure on Windows: http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/26909
Please can you take a look? Thanks Russ [ RUN ] Subtypes.LazyResolution Preamble for file C:\clangd-test\TestTU.cpp cannot be reused. Attempting to rebuild it. Built preamble of size 210988 for file C:\clangd-test\TestTU.cpp Preamble for file C:\clangd-test\TestTU.cpp cannot be reused. Attempting to rebuild it. Built preamble of size 210988 for file C:\clangd-test\TestTU.cpp index AST for C:\clangd-test\TestTU.cpp (main=false): symbol slab: 4 symbols, 5152 bytes ref slab: 0 symbols, 0 refs, 136 bytes relations slab: 3 relations, 84 bytes index AST for C:\clangd-test\TestTU.cpp (main=true): symbol slab: 4 symbols, 5152 bytes ref slab: 0 symbols, 0 refs, 136 bytes relations slab: 3 relations, 84 bytes Expected<T> must be checked before access or destruction. Unchecked Expected<T> contained error: Hint path doesn't start with test root: /clangd-test/TestTU.cpp 0x00007FF7486D1B25 (0x0000000000000016 0x00007FF7486D1B20 0x00007FF700000006 0x00007FF748680AF4) 0x00007FFF3F0EE19D (0x000001CDE35AA701 0x000001CD00000000 0x000001CDE35AA7B0 0x000001CDE35AB111), raise() + 0x1DD bytes(s) 0x00007FFF3F0EF071 (0x0000000000000003 0x0000002900000003 0x000001CDE35AB111 0x000000294FD8E330), abort() + 0x31 bytes(s) ... On Fri, 12 Jul 2019 at 04:26, Nathan Ridge via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: nridge > Date: Thu Jul 11 20:26:32 2019 > New Revision: 365867 > > URL: http://llvm.org/viewvc/llvm-project?rev=365867&view=rev > Log: > [clangd] Implement typeHierarchy/resolve for subtypes > > Summary: > This allows the client to resolve subtypes one level at a time. > > For supertypes, this is not necessary, because we eagerly compute > supertypes and return all levels. > > Reviewers: sammccall > > Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, > cfe-commits > > Tags: #clang > > Differential Revision: https://reviews.llvm.org/D64308 > > 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/clangd/test/type-hierarchy.test > clang-tools-extra/trunk/clangd/unittests/TypeHierarchyTests.cpp > > Modified: clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp (original) > +++ clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp Thu Jul 11 20:26:32 > 2019 > @@ -926,6 +926,13 @@ void ClangdLSPServer::onTypeHierarchy( > Params.resolve, Params.direction, > std::move(Reply)); > } > > +void ClangdLSPServer::onResolveTypeHierarchy( > + const ResolveTypeHierarchyItemParams &Params, > + Callback<Optional<TypeHierarchyItem>> Reply) { > + Server->resolveTypeHierarchy(Params.item, Params.resolve, > Params.direction, > + std::move(Reply)); > +} > + > void ClangdLSPServer::applyConfiguration( > const ConfigurationSettings &Settings) { > // Per-file update to the compilation database. > @@ -1021,6 +1028,7 @@ ClangdLSPServer::ClangdLSPServer( > MsgHandler->bind("workspace/didChangeConfiguration", > &ClangdLSPServer::onChangeConfiguration); > MsgHandler->bind("textDocument/symbolInfo", > &ClangdLSPServer::onSymbolInfo); > MsgHandler->bind("textDocument/typeHierarchy", > &ClangdLSPServer::onTypeHierarchy); > + MsgHandler->bind("typeHierarchy/resolve", > &ClangdLSPServer::onResolveTypeHierarchy); > // 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=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/ClangdLSPServer.h (original) > +++ clang-tools-extra/trunk/clangd/ClangdLSPServer.h Thu Jul 11 20:26:32 > 2019 > @@ -100,6 +100,8 @@ private: > Callback<llvm::Optional<Hover>>); > void onTypeHierarchy(const TypeHierarchyParams &, > Callback<llvm::Optional<TypeHierarchyItem>>); > + void onResolveTypeHierarchy(const ResolveTypeHierarchyItemParams &, > + > Callback<llvm::Optional<TypeHierarchyItem>>); > void onChangeConfiguration(const DidChangeConfigurationParams &); > void onSymbolInfo(const TextDocumentPositionParams &, > Callback<std::vector<SymbolDetails>>); > > Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original) > +++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Thu Jul 11 20:26:32 > 2019 > @@ -101,8 +101,7 @@ ClangdServer::ClangdServer(const GlobalC > : nullptr), > GetClangTidyOptions(Opts.GetClangTidyOptions), > SuggestMissingIncludes(Opts.SuggestMissingIncludes), > - EnableHiddenFeatures(Opts.HiddenFeatures), > - TweakFilter(Opts.TweakFilter), > + EnableHiddenFeatures(Opts.HiddenFeatures), > TweakFilter(Opts.TweakFilter), > WorkspaceRoot(Opts.WorkspaceRoot), > // Pass a callback into `WorkScheduler` to extract symbols from a > newly > // parsed file and rebuild the file index synchronously each time > an AST > @@ -528,6 +527,13 @@ void ClangdServer::typeHierarchy(PathRef > WorkScheduler.runWithAST("Type Hierarchy", File, Bind(Action, > std::move(CB))); > } > > +void ClangdServer::resolveTypeHierarchy( > + TypeHierarchyItem Item, int Resolve, TypeHierarchyDirection Direction, > + Callback<llvm::Optional<TypeHierarchyItem>> CB) { > + clangd::resolveTypeHierarchy(Item, Resolve, Direction, Index); > + CB(Item); > +} > + > void ClangdServer::onFileEvent(const DidChangeWatchedFilesParams &Params) > { > // FIXME: Do nothing for now. This will be used for indexing and > potentially > // invalidating other caches. > > Modified: clang-tools-extra/trunk/clangd/ClangdServer.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.h?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/ClangdServer.h (original) > +++ clang-tools-extra/trunk/clangd/ClangdServer.h Thu Jul 11 20:26:32 2019 > @@ -138,7 +138,8 @@ public: > bool SemanticHighlighting = false; > > /// Returns true if the StringRef is a tweak that should be enabled > - std::function<bool(llvm::StringRef)> TweakFilter = [](llvm::StringRef > TweakToSearch) {return true;}; > + std::function<bool(llvm::StringRef)> TweakFilter = > + [](llvm::StringRef TweakToSearch) { return true; }; > }; > // Sensible default options for use in tests. > // Features like indexing must be enabled if desired. > @@ -212,6 +213,11 @@ public: > TypeHierarchyDirection Direction, > Callback<llvm::Optional<TypeHierarchyItem>> CB); > > + /// Resolve type hierarchy item in the given direction. > + void resolveTypeHierarchy(TypeHierarchyItem Item, int Resolve, > + TypeHierarchyDirection Direction, > + Callback<llvm::Optional<TypeHierarchyItem>> > CB); > + > /// Retrieve the top symbols from the workspace matching a query. > void workspaceSymbols(StringRef Query, int Limit, > Callback<std::vector<SymbolInformation>> CB); > @@ -315,7 +321,7 @@ private: > // can be caused by missing includes (e.g. member access in incomplete > type). > bool SuggestMissingIncludes = false; > bool EnableHiddenFeatures = false; > - > + > std::function<bool(llvm::StringRef)> TweakFilter; > > // GUARDED_BY(CachedCompletionFuzzyFindRequestMutex) > > Modified: clang-tools-extra/trunk/clangd/Protocol.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.cpp?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/Protocol.cpp (original) > +++ clang-tools-extra/trunk/clangd/Protocol.cpp Thu Jul 11 20:26:32 2019 > @@ -422,8 +422,7 @@ bool fromJSON(const llvm::json::Value &P > bool fromJSON(const llvm::json::Value &Params, > DocumentRangeFormattingParams &R) { > llvm::json::ObjectMapper O(Params); > - return O && O.map("textDocument", R.textDocument) && > - O.map("range", R.range); > + return O && O.map("textDocument", R.textDocument) && O.map("range", > R.range); > } > > bool fromJSON(const llvm::json::Value &Params, > @@ -445,8 +444,8 @@ bool fromJSON(const llvm::json::Value &P > > llvm::json::Value toJSON(const DiagnosticRelatedInformation &DRI) { > return llvm::json::Object{ > - {"location", DRI.location}, > - {"message", DRI.message}, > + {"location", DRI.location}, > + {"message", DRI.message}, > }; > } > > @@ -978,6 +977,8 @@ llvm::json::Value toJSON(const TypeHiera > Result["parents"] = I.parents; > if (I.children) > Result["children"] = I.children; > + if (I.data) > + Result["data"] = I.data; > return std::move(Result); > } > > @@ -996,10 +997,18 @@ bool fromJSON(const llvm::json::Value &P > O.map("deprecated", I.deprecated); > O.map("parents", I.parents); > O.map("children", I.children); > + O.map("data", I.data); > > return true; > } > > +bool fromJSON(const llvm::json::Value &Params, > + ResolveTypeHierarchyItemParams &P) { > + llvm::json::ObjectMapper O(Params); > + return O && O.map("item", P.item) && O.map("resolve", P.resolve) && > + O.map("direction", P.direction); > +} > + > bool fromJSON(const llvm::json::Value &Params, ReferenceParams &R) { > TextDocumentPositionParams &Base = R; > return fromJSON(Params, Base); > > Modified: clang-tools-extra/trunk/clangd/Protocol.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.h?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/Protocol.h (original) > +++ clang-tools-extra/trunk/clangd/Protocol.h Thu Jul 11 20:26:32 2019 > @@ -1127,7 +1127,7 @@ struct TypeHierarchyItem { > SymbolKind kind; > > /// `true` if the hierarchy item is deprecated. Otherwise, `false`. > - bool deprecated; > + bool deprecated = false; > > /// The URI of the text document where this type hierarchy item belongs > to. > URIForFile uri; > @@ -1153,13 +1153,26 @@ struct TypeHierarchyItem { > /// descendants. If not defined, the children have not been resolved. > llvm::Optional<std::vector<TypeHierarchyItem>> children; > > - /// The protocol has a slot here for an optional 'data' filed, which can > - /// be used to identify a type hierarchy item in a resolve request. We > don't > - /// need this (the item itself is sufficient to identify what to > resolve) > - /// so don't declare it. > + /// An optional 'data' filed, which can be used to identify a type > hierarchy > + /// item in a resolve request. > + llvm::Optional<std::string> data; > }; > llvm::json::Value toJSON(const TypeHierarchyItem &); > llvm::raw_ostream &operator<<(llvm::raw_ostream &, const > TypeHierarchyItem &); > +bool fromJSON(const llvm::json::Value &, TypeHierarchyItem &); > + > +/// Parameters for the `typeHierarchy/resolve` request. > +struct ResolveTypeHierarchyItemParams { > + /// The item to resolve. > + TypeHierarchyItem item; > + > + /// The hierarchy levels to resolve. `0` indicates no level. > + int resolve; > + > + /// The direction of the hierarchy levels to resolve. > + TypeHierarchyDirection direction; > +}; > +bool fromJSON(const llvm::json::Value &, ResolveTypeHierarchyItemParams > &); > > struct ReferenceParams : public TextDocumentPositionParams { > // For now, no options like context.includeDeclaration are supported. > > Modified: clang-tools-extra/trunk/clangd/XRefs.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.cpp?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/XRefs.cpp (original) > +++ clang-tools-extra/trunk/clangd/XRefs.cpp Thu Jul 11 20:26:32 2019 > @@ -893,7 +893,7 @@ llvm::Optional<QualType> getDeducedType( > > /// Retrieves the deduced type at a given location (auto, decltype). > bool hasDeducedType(ParsedAST &AST, SourceLocation SourceLocationBeg) { > - return (bool) getDeducedType(AST, SourceLocationBeg); > + return (bool)getDeducedType(AST, SourceLocationBeg); > } > > llvm::Optional<HoverInfo> getHover(ParsedAST &AST, Position Pos, > @@ -1104,6 +1104,10 @@ symbolToTypeHierarchyItem(const Symbol & > // (https://github.com/clangd/clangd/issues/59). > THI.range = THI.selectionRange; > THI.uri = Loc->uri; > + // Store the SymbolID in the 'data' field. The client will > + // send this back in typeHierarchy/resolve, allowing us to > + // continue resolving additional levels of the type hierarchy. > + THI.data = S.ID.str(); > > return std::move(THI); > } > @@ -1247,6 +1251,25 @@ getTypeHierarchy(ParsedAST &AST, Positio > return Result; > } > > +void resolveTypeHierarchy(TypeHierarchyItem &Item, int ResolveLevels, > + TypeHierarchyDirection Direction, > + const SymbolIndex *Index) { > + // We only support typeHierarchy/resolve for children, because for > parents > + // we ignore ResolveLevels and return all levels of parents eagerly. > + if (Direction == TypeHierarchyDirection::Parents || ResolveLevels == 0) > + return; > + > + Item.children.emplace(); > + > + if (Index && Item.data) { > + // We store the item's SymbolID in the 'data' field, and the client > + // passes it back to us in typeHierarchy/resolve. > + if (Expected<SymbolID> ID = SymbolID::fromStr(*Item.data)) { > + fillSubTypes(*ID, *Item.children, Index, ResolveLevels, > Item.uri.file()); > + } > + } > +} > + > FormattedString HoverInfo::present() const { > FormattedString Output; > if (NamespaceScope) { > > Modified: clang-tools-extra/trunk/clangd/XRefs.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/XRefs.h?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/XRefs.h (original) > +++ clang-tools-extra/trunk/clangd/XRefs.h Thu Jul 11 20:26:32 2019 > @@ -141,6 +141,10 @@ llvm::Optional<TypeHierarchyItem> getTyp > ParsedAST &AST, Position Pos, int Resolve, TypeHierarchyDirection > Direction, > const SymbolIndex *Index = nullptr, PathRef TUPath = PathRef{}); > > +void resolveTypeHierarchy(TypeHierarchyItem &Item, int ResolveLevels, > + TypeHierarchyDirection Direction, > + const SymbolIndex *Index); > + > /// Retrieves the deduced type at a given location (auto, decltype). > /// Retuns None unless SourceLocationBeg starts an auto/decltype token. > /// It will return the underlying type. > > Modified: clang-tools-extra/trunk/clangd/test/type-hierarchy.test > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/test/type-hierarchy.test?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/test/type-hierarchy.test (original) > +++ clang-tools-extra/trunk/clangd/test/type-hierarchy.test Thu Jul 11 > 20:26:32 2019 > @@ -1,7 +1,7 @@ > # RUN: clangd -lit-test < %s | FileCheck -strict-whitespace %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:///main.cpp","languageId":"cpp","version":1,"text":"struct > Parent {};\nstruct Child1 : Parent {};\nstruct Child2 : Child1 {};\nstruct > Child3 : Child2 {};"}}} > +{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///main.cpp","languageId":"cpp","version":1,"text":"struct > Parent {};\nstruct Child1 : Parent {};\nstruct Child2 : Child1 {};\nstruct > Child3 : Child2 {};\nstruct Child4 : Child3 {};"}}} > --- > > > {"jsonrpc":"2.0","id":1,"method":"textDocument/typeHierarchy","params":{"textDocument":{"uri":"test:///main.cpp"},"position":{"line":2,"character":11},"direction":2,"resolve":1}} > # CHECK: "id": 1 > @@ -9,6 +9,7 @@ > # CHECK-NEXT: "result": { > # CHECK-NEXT: "children": [ > # CHECK-NEXT: { > +# CHECK-NEXT: "data": "A6576FE083F2949A", > # CHECK-NEXT: "kind": 23, > # CHECK-NEXT: "name": "Child3", > # CHECK-NEXT: "range": { > @@ -114,6 +115,64 @@ > # CHECK-NEXT: "uri": "file:///clangd-test/main.cpp" > # CHECK-NEXT: } > --- > -{"jsonrpc":"2.0","id":2,"method":"shutdown"} > > +{"jsonrpc":"2.0","id":2,"method":"typeHierarchy/resolve","params":{"item":{"uri":"test:///main.cpp","data":"A6576FE083F2949A","name":"Child3","kind":23,"range":{"end":{"character":13,"line":3},"start":{"character":7,"line":3}},"selectionRange":{"end":{"character":13,"line":3},"start":{"character":7,"line":3}}},"direction":0,"resolve":1}} > +# CHECK: "id": 2 > +# CHECK-NEXT: "jsonrpc": "2.0", > +# CHECK-NEXT: "result": { > +# CHECK-NEXT: "children": [ > +# CHECK-NEXT: { > +# CHECK-NEXT: "data": "5705B382DFC77CBC", > +# CHECK-NEXT: "kind": 23, > +# CHECK-NEXT: "name": "Child4", > +# CHECK-NEXT: "range": { > +# CHECK-NEXT: "end": { > +# CHECK-NEXT: "character": 13, > +# CHECK-NEXT: "line": 4 > +# CHECK-NEXT: }, > +# CHECK-NEXT: "start": { > +# CHECK-NEXT: "character": 7, > +# CHECK-NEXT: "line": 4 > +# CHECK-NEXT: } > +# CHECK-NEXT: }, > +# CHECK-NEXT: "selectionRange": { > +# CHECK-NEXT: "end": { > +# CHECK-NEXT: "character": 13, > +# CHECK-NEXT: "line": 4 > +# CHECK-NEXT: }, > +# CHECK-NEXT: "start": { > +# CHECK-NEXT: "character": 7, > +# CHECK-NEXT: "line": 4 > +# CHECK-NEXT: } > +# CHECK-NEXT: }, > +# CHECK-NEXT: "uri": "file:///clangd-test/main.cpp" > +# CHECK-NEXT: } > +# CHECK-NEXT: ], > +# CHECK-NEXT: "data": "A6576FE083F2949A", > +# CHECK-NEXT: "kind": 23, > +# CHECK-NEXT: "name": "Child3", > +# CHECK-NEXT: "range": { > +# CHECK-NEXT: "end": { > +# CHECK-NEXT: "character": 13, > +# CHECK-NEXT: "line": 3 > +# CHECK-NEXT: }, > +# CHECK-NEXT: "start": { > +# CHECK-NEXT: "character": 7, > +# CHECK-NEXT: "line": 3 > +# CHECK-NEXT: } > +# CHECK-NEXT: }, > +# CHECK-NEXT: "selectionRange": { > +# CHECK-NEXT: "end": { > +# CHECK-NEXT: "character": 13, > +# CHECK-NEXT: "line": 3 > +# CHECK-NEXT: }, > +# CHECK-NEXT: "start": { > +# CHECK-NEXT: "character": 7, > +# CHECK-NEXT: "line": 3 > +# CHECK-NEXT: } > +# CHECK-NEXT: }, > +# CHECK-NEXT: "uri": "file:///clangd-test/main.cpp" > +# CHECK-NEXT: } > +--- > +{"jsonrpc":"2.0","id":3,"method":"shutdown"} > --- > {"jsonrpc":"2.0","method":"exit"} > > Modified: clang-tools-extra/trunk/clangd/unittests/TypeHierarchyTests.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/TypeHierarchyTests.cpp?rev=365867&r1=365866&r2=365867&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clangd/unittests/TypeHierarchyTests.cpp > (original) > +++ clang-tools-extra/trunk/clangd/unittests/TypeHierarchyTests.cpp Thu > Jul 11 20:26:32 2019 > @@ -42,8 +42,17 @@ MATCHER_P(WithKind, Kind, "") { return a > MATCHER_P(SelectionRangeIs, R, "") { return arg.selectionRange == R; } > template <class... ParentMatchers> > ::testing::Matcher<TypeHierarchyItem> Parents(ParentMatchers... ParentsM) > { > - return Field(&TypeHierarchyItem::parents, > HasValue(ElementsAre(ParentsM...))); > + return Field(&TypeHierarchyItem::parents, > + HasValue(UnorderedElementsAre(ParentsM...))); > } > +template <class... ChildMatchers> > +::testing::Matcher<TypeHierarchyItem> Children(ChildMatchers... > ChildrenM) { > + return Field(&TypeHierarchyItem::children, > + HasValue(UnorderedElementsAre(ChildrenM...))); > +} > +// Note: "not resolved" is differnt from "resolved but empty"! > +MATCHER(ParentsNotResolved, "") { return !arg.parents; } > +MATCHER(ChildrenNotResolved, "") { return !arg.children; } > > TEST(FindRecordTypeAt, TypeOrVariable) { > Annotations Source(R"cpp( > @@ -603,6 +612,41 @@ struct Child : Parent<T> {}; > EXPECT_THAT(collectSubtypes(Parent, Index.get()), ElementsAre(Child)); > } > > +TEST(Subtypes, LazyResolution) { > + Annotations Source(R"cpp( > +struct P^arent {}; > +struct Child1 : Parent {}; > +struct Child2a : Child1 {}; > +struct Child2b : Child1 {}; > +)cpp"); > + > + TestTU TU = TestTU::withCode(Source.code()); > + auto AST = TU.build(); > + auto Index = TU.index(); > + > + llvm::Optional<TypeHierarchyItem> Result = getTypeHierarchy( > + AST, Source.point(), /*ResolveLevels=*/1, > + TypeHierarchyDirection::Children, Index.get(), > "/clangd-test/TestTU.cpp"); > + ASSERT_TRUE(bool(Result)); > + EXPECT_THAT( > + *Result, > + AllOf(WithName("Parent"), WithKind(SymbolKind::Struct), Parents(), > + Children(AllOf(WithName("Child1"), > WithKind(SymbolKind::Struct), > + ParentsNotResolved(), > ChildrenNotResolved())))); > + > + resolveTypeHierarchy((*Result->children)[0], /*ResolveLevels=*/1, > + TypeHierarchyDirection::Children, Index.get()); > + > + EXPECT_THAT( > + (*Result->children)[0], > + AllOf(WithName("Child1"), WithKind(SymbolKind::Struct), > + ParentsNotResolved(), > + Children(AllOf(WithName("Child2a"), > WithKind(SymbolKind::Struct), > + ParentsNotResolved(), ChildrenNotResolved()), > + AllOf(WithName("Child2b"), > WithKind(SymbolKind::Struct), > + ParentsNotResolved(), > ChildrenNotResolved())))); > +} > + > } // namespace > } // namespace clangd > } // namespace clang > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits