sammccall marked 2 inline comments as done.
sammccall added inline comments.


================
Comment at: clang/include/clang/Tooling/Syntax/Tree.h:182
+    /// The element, or nullptr if past-the-end.
+    NodeT *asPointer() const { return N; }
+  };
----------------
gribozavr2 wrote:
> "nodePointer()" ?
I find this a little confusing; it suggests to me there's also something 
*other* than the node here.
What aspect does it help with?

I can live with it, though currently would prefer `pointer()`, `getPointer()` 
or `asPointer()`.


================
Comment at: clang/include/clang/Tooling/Syntax/Tree.h:202-219
+  /// child_iterator is not invalidated by mutations.
+  struct child_iterator : child_iterator_base<child_iterator, Node> {
+    using Base::Base;
+  };
+  struct const_child_iterator
+      : child_iterator_base<const_child_iterator, const Node> {
+    using Base::Base;
----------------
gribozavr2 wrote:
> sammccall wrote:
> > eduucaldas wrote:
> > > TL;DR:
> > > `child_iterator` -> `ChildIterator`
> > > `const_child_iterator` -> `ConstChildIterator`
> > > `children` -> `getChildren`
> > > 
> > > I see you followed the naming convention of the ClangAST, which makes 
> > > loads of sense. 
> > > 
> > > In syntax trees we follow the naming conventions of the [conding 
> > > standard](https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly)
> > >  -- just because we want consistency and we had to pick a guideline to 
> > > follow -- according to that, functions should be verb like and names 
> > > should be camel case.
> > > 
> > > If like us you chose `const_child_iterator` and `children` kind of "just 
> > > because", could you change it to follow `ConstChildIterator` and 
> > > `getChildren` respectively. 
> > > In syntax trees we follow the naming conventions of the conding standard
> > 
> > I see that's been used in some of the newer classes, and that you changed 
> > this file to follow that style in 4c14ee61b73746b314d83e7c52e03d6527b78105. 
> > However it's not the original style we used here and elsewhere in libSyntax.
> > It's a bit frustrating to hear the argument about consistency, because we 
> > were quite careful and deliberate about this style, which was IMO fairly 
> > consistent prior to that change.
> > 
> > I'm willing to change these to match the local style in this file. However 
> > `*_iterator`, `*_begin/end/range()` is more common than FooIterator etc in 
> > LLVM overall (I think for consistency with `iterator` etc, which is 
> > endorsed by the style guide). So I don't think this change is particularly 
> > an improvement, even in terms of consistency.
> It can go either way:
> 
> > As an exception, classes that mimic STL classes can have member names in 
> > STL’s style of lower-case words separated by underscores
> 
Yeah, though read narrowly that doesn't apply (Tree doesn't really mimic STL, 
and the rule applies to Tree::ChildIterator's members rather than the class 
itself).

I think it's rare enough to spell out iterator class names that those don't 
matter at all, and getChildren() is necessary given getParent() etc.


================
Comment at: clang/lib/Tooling/Syntax/Tree.cpp:22-23
   if (auto *T = dyn_cast<syntax::Tree>(N)) {
-    for (const auto *C = T->getFirstChild(); C; C = C->getNextSibling())
-      traverse(C, Visit);
+    for (const syntax::Node &C : T->children())
+      traverse(&C, Visit);
   }
----------------
gribozavr2 wrote:
> sammccall wrote:
> > eduucaldas wrote:
> > > Hmm... 
> > > That looks funny, if the user uses a range-based for loop and forgets the 
> > > `&`, then we would be copying the Node???
> > > 
> > > Also in many places we had to get the address to the node. That is not 
> > > really consistent with how the syntax trees API's were designed, they 
> > > generally take pointers instead of references. (that said we could 
> > > obviously reconsider those design choices)
> > > That looks funny, if the user uses a range-based for loop and forgets the 
> > > &, then we would be copying the Node???
> > 
> > It doesn't look funny to me - foreach usually iterates over values rather 
> > than pointers. This raises a good point - it looks like Node is copyable 
> > and shouldn't be. (The default copy operation violates the tree invariants, 
> > e.g. the copied node will not be a child of its parent). I'll send a 
> > patch...
> > 
> > (That said this is always the case with copyable objects in range-based for 
> > loops, and indeed using references - that doesn't usually mean we avoid 
> > using them)
> > 
> > > Also in many places we had to get the address to the node. That is not 
> > > really consistent with how the syntax trees API's were designed, they 
> > > generally take pointers instead of references
> > 
> > I'm not convinced that taking the address is itself a burden, any more than 
> > using `->` instead of `.` is a burden.
> > Sometimes the use of pointer vs reference intends to convey something about 
> > address stability, but here this goes with the type as all nodes are 
> > allocated on the arena. (IMO this is a part of the AST design that works 
> > well).
> > The other thing it conveys is nullability, and this seems valuable enough 
> > that IMO APIs that take *non-nullable* nodes by pointer should be 
> > reconsidered.
> > 
> > For the iterators specifically, the main alternative here I guess is having 
> > Tree::children() act as a container of *pointers to* children, instead of 
> > the children themselves. This *is* highly unconventional and surprising. 
> > Consider the ubiquitous `for (const auto&N : T->children())`... now the 
> > author/reader expects N to be a const reference to a child, instead it's a 
> > const reference to a **non-const** pointer to a child....
> > That looks funny, if the user uses a range-based for loop and forgets the 
> > &, then we would be copying the Node???
> 
> Aren't they noncopyable?
Noncopyable after D90163.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D90023/new/

https://reviews.llvm.org/D90023

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to