[PATCH] D27673: [clang-move] Only move used helper declarations.
Eric Liu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 15 08:13:44 PST 2016
ioeric added inline comments.
================
Comment at: clang-move/UsedHelperDeclFinder.cpp:22
+// by a single node which belongs to that class.
+const Decl *getOutmostEnclosingClassOrFunDecl(const Decl *D) {
+ const auto *DC = D->getDeclContext();
----------------
Maybe just `getOutermostDecls` and add FIXME for other data types.
================
Comment at: clang-move/UsedHelperDeclFinder.cpp:30
+ Result = FD;
+ if (const auto *RD = dyn_cast<CXXRecordDecl>(FD->getParent()))
+ Result = RD;
----------------
Why do you need this? And when is a function's parent a class?
================
Comment at: clang-move/UsedHelperDeclFinder.cpp:103
+
+UsedHelperDeclFinder::HelperDeclsSet UsedHelperDeclFinder::getUsedHelperDecls(
+ const std::vector<const NamedDecl *> &Decls) const {
----------------
Do you assume that all nodes/decls in the graph are helpers?
What if some moved `Decl` refers to unmoved decls?
================
Comment at: clang-move/UsedHelperDeclFinder.cpp:125
+ const ast_matchers::MatchFinder::MatchResult &Result) {
+ if (const clang::DeclRefExpr *FR =
+ Result.Nodes.getNodeAs<clang::DeclRefExpr>("func_ref")) {
----------------
I find abbreviations hurt readability in general. Maybe just `FuncRef`.
================
Comment at: clang-move/UsedHelperDeclFinder.cpp:128
+ const auto *DC = Result.Nodes.getNodeAs<clang::Decl>("dc");
+ if (!DC)
+ return;
----------------
When would `DC` be null? Shouldn't we assert this instead of ignoring?
================
Comment at: clang-move/UsedHelperDeclFinder.cpp:132
+ // definition.
+ const auto *T = DC->getPreviousDecl();
+ if (!T)
----------------
Shouldn't we use `getCanonicalDecl` instead so that we can always get the same Decl for all canonical declaration?
And if you are doing this when adding nodes, shouldn't you also do `getPreviousDecl` or `getCanonicalDecl` for `getNode` and `getOrInsertNode` etc?
================
Comment at: clang-move/UsedHelperDeclFinder.cpp:145
+ // whose outmost enclosing declaration is the "CLASS" CXXRecord Declaration.
+ if (T == D)
+ return;
----------------
I'd move this check into `addNodeForDecl`.
================
Comment at: clang-move/UsedHelperDeclFinder.h:59
+ // Add a directed edge from the caller node to the callee node.
+ // A new node will be created if the node for Caller/Callee isn't existed.
+ //
----------------
s/isn't existed/doesn't exist/
================
Comment at: clang-move/UsedHelperDeclFinder.h:61
+ //
+ // Note that, all methods/variables declarations of a class are represented by
+ // a single node in the graph. The corresponding Decl of this node is the
----------------
maybe just "all members"?
================
Comment at: clang-move/UsedHelperDeclFinder.h:64
+ // class declaration.
+ void addNodeForDecl(const Decl *Caller, const Decl *Callee);
+ CallGraphNode *getNode(const Decl *D) const;
----------------
So, this is not adding node?
================
Comment at: clang-move/UsedHelperDeclFinder.h:107
+ HelperDeclsSet
+ getUsedHelperDecls(const std::vector<const NamedDecl *> &Decls) const;
+
----------------
Maybe add `FIXME` somewhere in the code for other kinds of declarations.
================
Comment at: clang-move/UsedHelperDeclFinder.h:110
+ // Check whether the given declaration D is in the HelperDeclsSet.
+ static bool isUsed(const Decl *D, const HelperDeclsSet &UsedDecls);
+
----------------
This function is quite confusing for me. The comment indicates that this checks if `D` is in `UsedDecls`? But the implementation does more than that. I think we need a better name and comment for this.
https://reviews.llvm.org/D27673
More information about the cfe-commits
mailing list