zixuw accepted this revision.
zixuw added inline comments.
This revision is now accepted and ready to land.


================
Comment at: clang/lib/ExtractAPI/ExtractAPIVisitor.cpp:174-175
+  StringRef Name = Decl->getName();
   if (Name.empty())
     Name = getTypedefName(Decl);
+  if (Name.empty()) {
----------------
dang wrote:
> zixuw wrote:
> > dang wrote:
> > > zixuw wrote:
> > > > Aren't these two lines supposed to do this?
> > > Qualified name is never empty, just contains some version of anonymous, 
> > > whereas getName() is actually empty for anonymous types. The flow is now, 
> > > try to populate with `getName` (which is unqualified and puts us in a 
> > > better spot for the eventual support of c++ and nested types). and if 
> > > that doesn't work fallback to the qualified name.
> > Sorry I meant `getTypedefName(Decl)`, which also tries to get the typedef 
> > name for an anonymous tag.
> > The patch summary says "Anonymous enums that are typedef'd should take on 
> > the name of the typedef." and I was a bit confused of the change.
> > 
> > Now we have three (two fallbacks) for Enum:
> > 1. straightforward `Decl->getName()`, and if that's empty
> > 2. `getTypedefName(Decl)`, which calls `Decl->getTypedefNameForAnonDecl()`, 
> > and if that fails,
> > 3. `Decl->printQualifiedName(OS)`
> > 
> > My questions:
> > 1. Do we need all three? We should be able to get rid of at least one 
> > right? The logic seems to be: if enum is named, use it. Otherwise get 
> > typedef name if it's part of a typedef. And finally leave something like 
> > `(anonymous)` if it's just an unattached anonymous enum.
> > 2. For the `printQualifiedName` path, isn't `Name` referencing a local 
> > string inside the method?
> > 3. structs are also tags that can be anonymous and inside a typedef, do we 
> > need similar changes there?
> > 
> > 
> 1. Yup that is exactly what I am trying to do here. If you can think of a way 
> of removing a chunk then let's do it. The reason for the third fallback is to 
> have a name for the container of an anonymous (without a typedef) top level 
> enum (there is an example of that in the enum.c test case)
> 2. Not entirely sure what you mean. If you are referring to the fact that the 
> backing storage for `Name` in this case is a local variable, this is fine 
> because we copy the string into the `APISet` when constructing the record 
> within this method a bit further down.
> 3. The struct case is a little different, It's not possible to have to have 
> an anonymous struct without a typedef at the top level, whereas it is 
> possible to do so with an enum (e.g. to introduce some constants). Currently 
> for structs we only do `Decl->getName()` and falls back to 
> `getTypedefName(Decl)`. If that fails we ignore the struct because it must be 
> a nested anonymous struct (that logic is flawed and we should aim to support 
> anonymous structs properly, but that would be a follow up patch to this one).
Ah I see. So before this patch we had `getQualifiedNameAsString` which would 
always bypass the following `getTypedefName` even if it's an anonymous within a 
typedef. This patch cleared out the logic and ordering.

> we copy the string into the APISet when constructing the record within this 
> method a bit further down.
😅 right, that part was folded in the diff view and I totally forgot we had that 
there...

LGTM. Thanks Daniel!





Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D140010

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

Reply via email to