steveire added inline comments.

================
Comment at: lib/ASTMatchers/Dynamic/Registry.cpp:77
+      internal::MatcherDescriptor *matchDescriptor, StringRef MatcherName) {
+    auto K = ast_type_traits::ASTNodeKind::getFromNodeKind<
+        typename 
ast_matchers::internal::VariadicAllOfMatcher<ResultT>::Type>();
----------------
zturner wrote:
> steveire wrote:
> > aaron.ballman wrote:
> > > zturner wrote:
> > > > steveire wrote:
> > > > > aaron.ballman wrote:
> > > > > > steveire wrote:
> > > > > > > aaron.ballman wrote:
> > > > > > > > Mildly not keen on the use of `auto` here. It's a factory 
> > > > > > > > function, so it kind of names the resulting type, but it also 
> > > > > > > > looks like the type will be 
> > > > > > > > `ast_matchers::internal::VariadicAllOfMatcher<ResultT>::Type` 
> > > > > > > > from the template argument, which is incorrect.
> > > > > > > There is no reason to assume that taking a template argument 
> > > > > > > means that type is result.
> > > > > > > 
> > > > > > > The method is `getFrom` which decreases the ambiguity still 
> > > > > > > further.
> > > > > > > 
> > > > > > > Spelling out the type doesn't add anything useful. This should be 
> > > > > > > ok.
> > > > > > > There is no reason to assume that taking a template argument 
> > > > > > > means that type is result.
> > > > > > 
> > > > > > Aside from all the other places that do exactly that (getAs<>, 
> > > > > > cast<>, dyn_cast<>, castAs<>, and so on). Generally, when we have a 
> > > > > > function named get that takes a template type argument, the result 
> > > > > > when seen in proximity to auto is the template type.
> > > > > > 
> > > > > > > Spelling out the type doesn't add anything useful. This should be 
> > > > > > > ok.
> > > > > > 
> > > > > > I slept on this one and fall on the other side of it; using auto 
> > > > > > hides information that tripped up at least one person when reading 
> > > > > > the code, so don't use auto. It's not clear enough what the 
> > > > > > resulting type will be.
> > > > > I put this in the category of requiring 
> > > > > 
> > > > >     SomeType ST = SomeType::create();
> > > > > 
> > > > > instead of 
> > > > > 
> > > > >     auto ST = SomeType::create();
> > > > > 
> > > > > `ast_type_traits::ASTNodeKind` is already on that line and you want 
> > > > > to see it again.
> > > > > 
> > > > FWIW I'm with Aaron here.  Im' not familiar at all with this codebase, 
> > > > and looking at the code, my first instinct is "the result type is 
> > > > probably 
> > > > `ast_matchers::internal::VariadicAllOfMatcher<ResultT>::Type`".  
> > > > According to Aaron's earlier comment, that is incorrect, so there's at 
> > > > least 1 data point that it hinders readability.
> > > > 
> > > > So, honest question.  What *is* the return type here?
> > > > So, honest question. What *is* the return type here?
> > > 
> > > Much to my surprise, it's `ASTNodeKind`. It was entirely unobvious to me 
> > > that this was a factory function.
> > @zturner Quoting myself:
> > 
> > > `ast_type_traits::ASTNodeKind` is already on that line and you want to 
> > > see it again.
> > 
> > The expression is `getFromNodeKind`. There is a pattern of 
> > `SomeType::fromFooKind<FooKind>()` returning a `SomeType`. This is not so 
> > unusual.
> > 
> > 
> Note that at the top of this file there's already a `using namespace 
> clang::ast_type_traits;`  So if you're worried about verbosity, then you can 
> remove the `ast_type_traits::`, remove the `auto`, and the net effect is that 
> the overall line will end up being shorter.
The funny thing is - if you see a line like 

    Parser CodeParser = Parser::getFromArgs(Args);

you have no idea what type `Parser` is! 

To start, it could be `clang::Parser` or 
`clang::ast_matchers::dynamic::Parser`, depending on a `using namespace` which 
might appear any distance up in the file. It is not uncommon for clang files to 
be thousands of lines lone.

Or it could be inside a template with `template<typename Parser>`, or there 
could be a `using Parser = Foo;` any distance up in the file. 

    Parser CodeParser = Parser::getFromArgs(Args);

is no more helpful than

    auto CodeParser = Parser::getFromArgs(Args);

Sticking with the same example, if `CodeParser` is a field, then you might have 
a line

    CodeParser = Parser::getFromArgs(Args);

and you could object and create a macro which expands to nothing to ensure that 
the type appears on the line

    CodeParser = CALL_RETURNS(Parser)Parser::getFromArgs(Args);

No one does that, because it is ok for the type to not appear on the line.

You would also have to object to code such as 

    Object.setParser(Parser::getFromArgs(Args));

requiring it to instead be

    Parser CodeParser = Parser::getFromArgs(Args);
    Object.setParser(CodeParser);

so that you can read the type.

Even then, what if those two lines are separated by a full page of code? How do 
you know the type of `CodeParser` in the `Object.setParser(CodeParser)` call? 
The answer is you don't and you don't need to.

You would also require 
 
    return Parser::getFromArgs(Args);

to instead be

    Parser CodeParser = Parser::getFromArgs(Args);
    return CodeParser;

Claims that human readers need to see a type are as incorrect as they are 
inconsistent.


Repository:
  rC Clang

https://reviews.llvm.org/D54405



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
  • [PATC... Aaron Ballman via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
  • [PATC... Aaron Ballman via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
  • [PATC... Zachary Turner via Phabricator via cfe-commits
  • [PATC... Aaron Ballman via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
  • [PATC... Zachary Turner via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
    • ... Zachary Turner via cfe-commits
      • ... Mailing List "cfe-commits" via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
  • [PATC... Stephen Kelly via Phabricator via cfe-commits
  • [PATC... Aaron Ballman via Phabricator via cfe-commits

Reply via email to