[PATCH] D43341: [clang-doc] Implement reducer portion of the frontend framework

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed May 2 01:47:35 PDT 2018


sammccall added inline comments.


================
Comment at: clang-doc/Index.h:28
+// Abstract class representing an index of mapped info objects.
+class Index {
+public:
----------------
What is this interface for? It looks like none of the functions are ever called through the interface.

If the intent is to abstract away a MR framework, I don't think this achieves that - multimachine MR frameworks have their "index" distributed and probably won't have a "reduce" function you can call with these semantics.

Consider just moving the in-memory reduction to the main file (which isn't portable across MR abstractions anyway) and avoiding abstractions there:
```
StringMap<std::vector<std::unique_ptr<Info>>>>  MapOutput;
// populate MapOutput as you currently do in inMemoryReduceResults
for (const auto &Group : MapOutput)
  Write(Group.first, reduceInfos(std::move(Group.second)));
```


================
Comment at: clang-doc/Reducer.cpp:18
+
+#define REDUCE(INFO, TYPE)                                                     \
+  {                                                                            \
----------------
TYPE is unused?


================
Comment at: clang-doc/Representation.cpp:1
+///===-- Representation.cpp - ClangDoc Representation -----------*- C++ -*-===//
+//
----------------
this is important/subtle logic, and there are no comments (particularly about motivating how specific fields are merged)!


================
Comment at: clang-doc/Representation.cpp:15
+
+template <typename T> void assign(T &L, T &R) {
+  if (L != R)
----------------
why this, rather than actual assignment? (comments!)


================
Comment at: clang-doc/Representation.cpp:20
+
+template <typename T> void move(T &L, T &&R) {
+  if (L != R)
----------------
why would you ever assign() rather than move()


================
Comment at: clang-doc/Representation.cpp:26
+template <>
+void move(llvm::SmallVectorImpl<Reference> &L,
+          llvm::SmallVectorImpl<Reference> &&R) {
----------------
why this pattern of "assign if empty" for these types?


================
Comment at: clang-doc/Representation.cpp:39
+template <typename T>
+void extend(llvm::SmallVectorImpl<T> &L, llvm::SmallVectorImpl<T> &&R) {
+  std::move(R.begin(), R.end(), std::back_inserter(L));
----------------
what if there are duplicatel?


================
Comment at: clang-doc/Representation.cpp:53
+  move(Namespace, std::move(Other.Namespace));
+  extend(Description, std::move(Other.Description));
+  return true;
----------------
is plain concatenation of comments what you want?


================
Comment at: clang-doc/Representation.h:75
 
+  bool operator==(const Reference &Other) const {
+    return USR == Other.USR && UnresolvedName == Other.UnresolvedName &&
----------------
consider `std::tie(A, B) == std::tie(Other.A, Other.B)`


================
Comment at: clang-doc/Representation.h:79
+  }
+  bool operator!=(const Reference &Other) const {
+    return USR != Other.USR || UnresolvedName != Other.UnresolvedName ||
----------------
do you really need `!=`?
if so, prefer to define it as `!(*this == Other)` to avoid redundancy.


================
Comment at: clang-doc/Representation.h:159
+  Info(InfoType IT) : IT(IT) {}
+  Info(Info &Other) = delete;
+  Info(Info &&Other) = default;
----------------
should this be a copy constructor? (reference should be const)


================
Comment at: clang-doc/Representation.h:162
+
+  bool merge(Info &&I);
 
----------------
So having this "overriding" that's not virtual seems like asking for trouble: if you accidentally deref a unique_ptr<Info> and compare it, you'll get the base behavior which should probably never be called directly.

Consider naming this `mergeBase` and making it protected.


https://reviews.llvm.org/D43341





More information about the cfe-commits mailing list