[cfe-dev] libclang: Spelling on typedefs lacks namespaces
Michael via cfe-dev
cfe-dev at lists.llvm.org
Mon Feb 13 05:47:35 PST 2017
Cool, sounds good. It's a few more tests to fix than expected, but stay
tuned for a patch.
Thanks
Michael
On 02/10/2017 03:25 PM, Alex L wrote:
> Hi Michael,
>
> Thanks for the detailed report! I believe you're
> correct, clang_getTypeSpelling should return the fully qualified name
> for the typedefs since it does so for the other types.
>
> It looks like you're on the right track with the diff that you've shown.
> I would encourage you to submit it as a patch (with tests)
> to cfe-commits, either by using Phabricator
> (http://llvm.org/docs/Phabricator.html) or by emailing the patch
> directly to the list.
>
> Cheers,
> Alex
>
>
> On 10 February 2017 at 12:39, Michael via cfe-dev
> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>
> Hi
>
> I'm using libclang to parse header files and generate code from
> them. I found that clang_getTypeSpelling() usually includes the
> namespace(s) a type was declared in. However with the exception
> being typedefs (and same for "using A = B"). Not sure if this is a
> bug or intended behavior, but it seems at least inconsistent. I also
> couldn't really find a good workaround for this. I'd have to
> manually figure out all typedefs (not just pure typedefs, they could
> also be nested template arguments or whatever) and then their
> originating namespaces. This is a bit cumbersome and not really
> straight forward. Getting the canonical type is also not really a
> solution as I would like to keep the typedefs.
>
> Minimal example:
>
> namespace foo {
> class Bar {
> };
> typedef Bar BarDef;
> }
>
> clang_getTypeSpelling on "Bar" (kind "Record") gives: "foo::Bar"
> clang_getTypeSpelling on "BarDef" (kind "Typedef") gives: "BarDef"
> (<== missing "foo::")
>
>
> I had a look into the clang sources. It seems this little patch
> would fix the problem. This was pure guess work, I don't know what
> deeper consequences this might have.
>
> Index: lib/AST/TypePrinter.cpp
> ===================================================================
> --- lib/AST/TypePrinter.cpp (revision 294732)
> +++ lib/AST/TypePrinter.cpp (working copy)
> @@ -96,7 +96,7 @@
>
> static bool canPrefixQualifiers(const Type *T, bool
> &NeedARCStrongQualifier);
> void spaceBeforePlaceHolder(raw_ostream &OS);
> - void printTypeSpec(const NamedDecl *D, raw_ostream &OS);
> + void printTypeSpec(NamedDecl *D, raw_ostream &OS);
>
> void printBefore(const Type *ty, Qualifiers qs, raw_ostream &OS);
> void printBefore(QualType T, raw_ostream &OS);
> @@ -798,7 +798,14 @@
> printAfter(T->getReturnType(), OS);
> }
>
> -void TypePrinter::printTypeSpec(const NamedDecl *D, raw_ostream &OS) {
> +void TypePrinter::printTypeSpec(NamedDecl *D, raw_ostream &OS) {
> +
> + // Compute the full nested-name-specifier for this type.
> + // In C, this will always be empty except when the type
> + // being printed is anonymous within other Record.
> + if (!Policy.SuppressScope)
> + AppendScope(D->getDeclContext(), OS);
> +
> IdentifierInfo *II = D->getIdentifier();
> OS << II->getName();
> spaceBeforePlaceHolder(OS);
>
> (I would of course also fix the unit tests if needed)
>
> Please let me know what you think.
>
> Thanks
>
> Michael
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev>
>
>
More information about the cfe-dev
mailing list