aaron.ballman added a comment. In D89743#2406017 <https://reviews.llvm.org/D89743#2406017>, @sammccall wrote:
> In D89743#2363201 <https://reviews.llvm.org/D89743#2363201>, @aaron.ballman > wrote: > >> In D89743#2360258 <https://reviews.llvm.org/D89743#2360258>, @sammccall >> wrote: >> >>> (while this is useful to you, let's keep discussing, but I'm also happy to >>> stop and land this with your preferred API/semantics - just LMK if changes >>> are needed) >> >> Let's hold off on landing for just a little bit. I don't think changes are >> needed yet, but the discussion may change my opinion and we might as well >> avoid churn. However, if you need to land part of this while we discuss >> other parts, LMK. > > Sorry I haven't had more to say on this. I would like to land at least the > attr-in-DynTypedNode part, as this unblocks some stuff unrelated to matchers > in clangd (someone just filed a dupe bug, which reminded me...) That part LGTM and is fine to land. > Happy to cut out all of the matcher part, or land just attr() without any > attr matchers, or all of it, or make another round of changes... I think the `attr()` matcher is definitely reasonable as it stands and can be landed as well. >>> In D89743#2360032 <https://reviews.llvm.org/D89743#2360032>, @aaron.ballman >>> wrote: >>> >>>> >> >> My mental model is that there is no declaration of an attribute (in the >> usual sense, because users cannot specify their own attributes without >> changing the compiler), and so there's not a referential model like there >> are with a DeclRefExpr that refers back to a specific declaration. Instead, >> to me, an attribute is a bit more like a builtin type -- you may have >> multiple ways to spell the type (`char` vs `signed char` or `unsigned char`, >> `long int` vs `long`, etc), but it's the same type under the hood. > > Ah, this also makes sense! Again, the wrinkle is IIUC `attr::Kind` is like a > builtin type, while `Attr` is more like VectorType - it specifies a builtin > type, but also some other stuff. Yeah, that's a fair point. >> However, that brings up an interesting observation: you can't do >> `hasType(hasName("long"))` and instead have to do >> `hasType(asString("long"))`. I don't recall the background about why there >> is `asString()` for matching string types vs `hasName()` -- you wouldn't >> happen to remember that context, would you? > > That was before my time I'm afraid. > It seems the implementation checks whether QualType::getAsString() exactly > matches the argument. `asString("long")` matches a type specified as `long` > or `long int`. But `asString("long int")` doesn't match anything! (Sugar > types muddle things a bit but don't fundamentally change this). > My guess is this implementation was just a question of practicality: parsing > the matcher argument as a type isn't feasible, but having the node producing > a single string to compare to is easy. And it generalizes to complicated > template types. That's my guess as well -- also, I wasn't aware of the `long` vs `long int` behavioral difference with `asString()`, that's.. neat. > It's reasonable to think of these as doing different things `hasName` is > querying a property, while `asString` is doing a specialized comparison of > the whole thing. > I'm not *sure* that's why the different names where chosen though. And the > fact that `hasName` allows qualifiers definitely feels a bit bolted on here. > >> For instance, is the correct pattern to allow `attr(asString("aligned"))` to >> map back to an `AlignedAttr` regardless of how the attribute was spelled in >> source, similar to how `asString("long")` matches `long int`? > > If we're following precedents (not sure we have to): > > - per your mental model, `asString` would pick one fixed name for each > attribute kind - which may not be the one used! > - ... but also `asString` should roughly be "node as string" which logically > includes arguments and should use the right name (since the node records it) > - `hasName` should match against the `name` attribute of Attr, possibly with > optional qualifiers > - ... but there's no precedent for rejecting synonymous names per se, and > this may be confusing behavior > > So I don't think either of these are a *great* fit, assuming we think > "attribute named XYZ or any synonym" is the most important operation (which I > agree with). I agree that this is the most common use-case. > I can't think of a pithy name, but I also think it's OK to be a bit verbose > and explicit here - attributes aren't the most commonly used bit of the AST. > >> Maybe `attr(equivalentAttrName("..."))` or so, possibly constrasting to >> `attr(exactAttrName("..."))`? I think this design is the most flexible and will be the most understandable in the long-run because it makes it clear which name-matching behavior is being used. But do we want to stick `attr` in the name of this to limit it to just attributes or do we think this is a generalized concept that should apply to matching other names as well? e.g., `hasType(equivalentName("long"))` to match either `long`, `long int` or `signed long int` and `hasType(exactName(`long int`))` to only match `long int` and not the other forms? Or do you think this is a bridge too far because it would be reasonable to expect `hasType(equivalentName("long"))` to match typedef names because those are equivalent (or perhaps more problematically, would the user expect `hasType(equivalentName("struct foo<bar>::baz<quux>"))` to match as an equivalent name for the parameter type (spelled with a `using` declaration) in `void foo(blah b)`)? (I think I've just about talked myself into keeping `attr` in the name so we don't try to use this for other kinds of identifiers with equivalent names.) Go ahead and land the dyn node bits and the `attr` matcher. If you feel like being on the hook for doing the other matchers that we're discussing in another review, then yay, but don't feel obligated (though I appreciate the design discussion!). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D89743/new/ https://reviews.llvm.org/D89743 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits