[PATCH] D66751: [clangd] Add targetDecl(), which determines what declaration an AST node refers to.
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 27 02:15:41 PDT 2019
ilya-biryukov added a comment.
Mostly LGTM, thanks! Just a few clarifying questions and suggestions
This API allows us to get a target declaration for a reference, but does not help with finding the source locations for those references. Do you plan to put this into the API? Have this as a separate function?
E.g. finding a source location of `field` for `DeclRefExpr` produced for `MyBase::field` seems to be the same amount of work (in general case) as finding the `Decl*` of `field`.
================
Comment at: clang-tools-extra/clangd/FindTarget.cpp:374
+ const char *Sep = "";
+ for (unsigned I = 0; I < RS.S.size(); ++I)
+ if (RS.S.test(I)) {
----------------
NIT: maybe add braces around multi-line body of the for statement?
================
Comment at: clang-tools-extra/clangd/FindTarget.h:70
+llvm::SmallVector<const Decl *, 1>
+targetDecl(const ast_type_traits::DynTypedNode &, DeclRelationSet Mask);
+
----------------
Could we add convenience overloads for `Expr*`, `QualType`, `TypeLoc` and maybe other interesting cases?
Having to call `DynTypedNode::create` for each invocation of these two functions would feel awkward, saving some typing for the clients seems to be worth a little boilerplate.
================
Comment at: clang-tools-extra/clangd/FindTarget.h:86
+ /// This declaration is an alias that was referred to.
+ Alias,
+ /// This is the underlying declaration for an alias, decltype etc.
----------------
Could you provide examples for `Alias` and `Underlying` in the comments?
One with a template and one with a namespace alias
================
Comment at: clang-tools-extra/clangd/FindTarget.h:92
+ /// (e.g. a delegating constructor has a pure-lexical reference to the class)
+ PureLexical,
+};
----------------
Could you also provide an example here?
It this a delegating constructor in the constructor-init-list?
================
Comment at: clang-tools-extra/clangd/FindTarget.h:103
+ DeclRelationSet() = default;
+ DeclRelationSet(DeclRelation R) { S.set(static_cast<unsigned long long>(R)); }
+
----------------
Why not `unsigned`? What are the interesting corner cases?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D66751/new/
https://reviews.llvm.org/D66751
More information about the cfe-commits
mailing list