What is the right way to address the first condition in the code you suggested?  I have been banging my head against my monitor long enough that I now admit defeat.  I've been looking mostly at the APIs for clang::Preprocessor and clang::SourceManager.  I've also read through the Clang Internals document.<div>
<br></div><div>The bigger issue is that I'd really just like to understand how to properly traverse the source-code representation of statements I encounter via the AST in an efficient manner.  Ideally this would include the ability to examine the source-code representation of a statement (or one of its sublcasses) before or after preprocessing, e.g., before and after macro expansion.</div>
<div><br></div><div>Here's what I know so far:</div><div>1. For an expression "Expr * e", I can retrieve its source range via e->getSourceRange().</div><div>2. Using SourceRange::getBegin() I can call SourceManager::getCharacterData()</div>
<div>3. From what I can tell, SourceManager::getCharacterData returns source-code post macro-expansion.</div><div>4. If my expression doesn't contain any macros, the code that John McCall suggested works fine for my purposes.  However, I am interested in a number of cases where there are macros involved (specifically, I am looking at function arguments, i.e., my "expressions", that contain macros).</div>
<div><br></div><div>Can anyone help?  I feel that Clang is likely capable of providing me with the information that I want as-is, but I just can't figure this one out via API intuition.  If it's not, I'd be glad to submit a patch to the API if anyone can steer me in the right direction.  </div>
<div><br></div><div>Thanks in advance,</div><div>Sam</div><div><br></div><div><div class="gmail_quote">On Wed, Dec 29, 2010 at 4:20 PM, John McCall <span dir="ltr"><<a href="mailto:rjmccall@apple.com" target="_blank">rjmccall@apple.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>On Dec 29, 2010, at 12:53 PM, Sam wrote:<br>
> Yes, I just don't know what to *do* with it ;-) In other words, I don't see a clear use of the SourceManager API once I have the SourceRange to extract the Expr's source-code.  I don't see any API calls that use SourceRange or beginning and ending SourceLocations for source-code extraction.<br>


<br>
</div>We should probably make some API for this.<br>
<br>
What you can do for now is something like the following:<br>
<br>
  SourceRange range = expr->getSourceRange();<br>
  if (range.getBegin().isMacroID() || range.getEnd().isMacroID()) {<br>
    // handle this case<br>
  } else if (!sourceManager.isFromSameFile(range.getBegin(), range.getEnd())) {<br>
    // handle this case<br>
  } else {<br>
    range.setEnd(preprocessor.getLocForEndOfToken(range.getEnd()));<br>
    const char *begin = sourceManager.getCharacterData(range.getBegin());<br>
    const char *end = sourceManager.getCharacterData(range.getEnd());<br>
    llvm::StringRef string(begin, end - begin);<br>
    // now you can do whatever you want<br>
  }<br>
<font color="#888888"><br>
John.</font></blockquote></div><br></div>