[clang-tools-extra] r365867 - [clangd] Implement typeHierarchy/resolve for subtypes

Russell Gallop via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 12 07:46:47 PDT 2019


Hi Nathan,

I've reverted this to get the bot green(er).

Regards
Russ

On Fri, 12 Jul 2019 at 13:32, Russell Gallop <russell.gallop at gmail.com>
wrote:

> 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 at 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 at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190712/37cbdf80/attachment-0001.html>


More information about the cfe-commits mailing list