AST oddities

Hi,
I've got plans to write a clang tool to automatically generate universal foreign function interface definitions, to allow usage of c++ libraries from non-c++ languages. As part of that I need to pull out correct function and type names from the AST to go into a new .cc file.

clang::NamedDecl::getQualifiedNameAsString() sounds like it should be what I want, but I'm having a couple of problems with it so far:

a) for EnumConstantDecl it returns a name including the name of the EnumDecl (which is arguably correct, but is invalid in c++ code). I think it would be better if there was a second method that produced the syntactically correct version.
b) the attached file is a cut-down example from the system headers on my machine (gcc-4.8.3 if it matters). When you call getQualifiedNameAsString() on the __uselocale function declaration (I was surprised to learn that it WAS a function declaration), clang returns "__uselocale" and not "__gnu_cxx::__uselocale". Is this a bug, or some misunderstanding on my part?

I've been using the RecursiveASTVisitor to do the tree walking, and can I ask whether there is some convenient way to prune a node's children, without aborting the whole traversal? For example: I want to visit CXXRecordDecl, but not the ones inside function bodies. At the moment I am walking up the parent DeclContext chain, which (to me) seems less than ideal.

dummy.cc (198 Bytes)

Hi Peter, here’s what I think after having a quick look at the code.

a) I don’t think that there’s a way to print enum constants in a syntactically correct way. But I don’t think anyone would object if you extended PrintingPolicy to handle this. The comment for getQualifiedNameAsString indicates that this method will be removed and you should probably not use it, printQualifiedName will do what you want especially if you decide to take the PrintingPolicy approach.

b) The linkage specifier seems to override the namespace, and this makes sense to me. I mean namespace implies name mangling and C linkage doesn’t and you can’t have both?

Nikola

Hi,
I've got plans to write a clang tool to automatically generate universal
foreign function interface definitions, to allow usage of c++ libraries
from non-c++ languages. As part of that I need to pull out correct function
and type names from the AST to go into a new .cc file.

clang::NamedDecl::getQualifiedNameAsString() sounds like it should be
what I want, but I'm having a couple of problems with it so far:

a) for EnumConstantDecl it returns a name including the name of the
EnumDecl (which is arguably correct, but is invalid in c++ code). I think
it would be better if there was a second method that produced the
syntactically correct version.
b) the attached file is a cut-down example from the system headers on my
machine (gcc-4.8.3 if it matters). When you call getQualifiedNameAsString()
on the __uselocale function declaration (I was surprised to learn that it
WAS a function declaration), clang returns "__uselocale" and not
"__gnu_cxx::__uselocale". Is this a bug, or some misunderstanding on my
part?

I've been using the RecursiveASTVisitor to do the tree walking, and can I
ask whether there is some convenient way to prune a node's children,
without aborting the whole traversal? For example: I want to visit
CXXRecordDecl, but not the ones inside function bodies. At the moment I am
walking up the parent DeclContext chain, which (to me) seems less than
ideal.

You can implement your own Traverse* methods that prune the traversal...

I ran into this e-mail a while ago when trying to get my head around the
Traverse/WalkUpFrom/Visit design of RecursiveASTVisitor, and I found it a
really good intro:
http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-June/009273.html

- Kim