[cfe-dev] libclang: Spelling on typedefs lacks namespaces

Michael Reiher via cfe-dev cfe-dev at lists.llvm.org
Tue Feb 14 09:26:07 PST 2017


Please see https://reviews.llvm.org/D29944

Thanks

Michael

On 02/13/2017 02:47 PM, Michael via cfe-dev wrote:
> 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>
>>
>>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev





More information about the cfe-dev mailing list