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

Reply via email to