OK, I took some time to step through this. Enumerating the arguments of a
MacroArgs seems like a difficult problem (tm).
- getNumArguments does not return the number of arguments, it returns the
number of tokens in the argument list
- getUnexpArgument takes an index, but skips over eof tokens
Here's a way I've found to enumerate over the argument tokens:
// This can probably be translated into a for loop,
// but it's late here and my head is buzzing...
unsigned ArgTokenCount = Value->getNumArguments();
unsigned I = 0;
while (I < ArgTokenCount) {
const clang::Token* Current = Value->getUnexpArgument(I);
unsigned TokenCount = Value->getArgLength(Current) + 1; // include EOF
I++;
ArgTokenCount -= TokenCount;
}
One problem is arguments rarely consist of a single token, but we can look at
things like:
#define X Y(1 + 6, 2)
#define Y(a,b)
X
You'd need to find a way to rejoin a sequence of tokens into a string. The
tokens appear to live in contiguous memory, though, so once you have the first
token and the length of every argument, the entire arg is covered by [Current,
Current + TokenCount). Not sure how to go from there to something you can
render, but it should be doable.
Hope that helps!
http://llvm-reviews.chandlerc.com/D2020
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits