<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Alex,<br>
      <br>
      First off thanks so much for your help (and probably patience at
      this point.)  Okay, that all works with a few tweaks.  I spent
      most of the day trying to figure out how I get the definition.  I
      have been looking at the getSpellingLoc() which seems to get me
      one end of it, but I can't seem to figure out how I find the end
      of the definition.  If this were just a string I'd look until I
      found a line break that wasn't preceeded with a \.  So far I tried
      constructing a lexer and using ReadToEndOfLine() and
      LexFromRawLexer() based on some things I found online.  Neither
      seemed to work.  My eventual goal is to get another SourceRange
      and check it for macros as well, etc, right now the return is
      StringRef just for debugging.  I.e. I want to check for any macro
      dependency trees.  I've attached the code below of what I tried. 
      ReadToEndOfLine() seems to never advance anything, and
      LexFromRawLexer() seems to never come across an Tok::eod.  :/ 
      Some output below the function clip.  Maybe there's an entirely
      easier approach?<br>
      <br>
         -Eric<br>
      <br>
      <div style="font-family: "Courier New"; font-size:
        12.0pt; color: #000000;background-color: #e7e7e7; font-style:
        normal; font-weight: normal; text-decoration: none;">
        <pre><span>StringRef</span><span> </span><span style="font-weight: bolder;">getTokensThroughEndOfDefine</span><span>(</span><span>SourceLocation</span><span> </span><span>BeginLoc</span><span>, </span><span>SourceManager</span><span> </span><span>&</span><span>SM</span><span>) </span><span style="color:#800000;">{</span>
<span>    </span><span style="color:#800080;">const</span><span> </span><span>LangOptions</span><span> </span><span>&</span><span>LangOpts</span><span> </span><span style="color:#004080;">=</span><span> </span><span style="font-weight: bolder;">getDefaultLangOpts</span><span>()</span><span>;</span>
<span>    </span><span>SourceLocation</span><span> </span><span>CurLoc</span><span> </span><span style="color:#004080;">=</span><span> </span><span>BeginLoc</span><span>;</span>
<span>    </span><span>SourceLocation</span><span> </span><span>NextLoc</span><span>;</span>
<span>    </span><span style="color:#800080;">int</span><span> </span><span>iter</span><span> </span><span style="color:#004080;">=</span><span> </span><span style="color:#000080;">0</span><span>;</span>

<span>    </span><span style="color:#c04000;">std</span><span>::</span><span style="color:#c04000;">pair</span><span><</span><span>FileID</span><span>, </span><span style="color:#800080;">unsigned</span><span>></span><span> </span><span>cur_info</span><span> </span><span style="color:#004080;">=</span><span> </span><span>SM</span><span>.</span><span style="font-weight: bolder;">getDecomposedLoc</span><span>(</span><span>BeginLoc</span><span>)</span><span>;</span>
<span>    </span><span style="color:#800080;">bool</span><span> </span><span>invalid</span><span> </span><span style="color:#004080;">=</span><span> </span><span style="color:#800080;">false</span><span>;</span>
<span>    </span><span>StringRef</span><span> </span><span>buf</span><span> </span><span style="color:#004080;">=</span><span> </span><span>SM</span><span>.</span><span style="font-weight: bolder;">getBufferData</span><span>(</span><span>cur_info</span><span>.</span><span>first</span><span>, </span><span>&</span><span>invalid</span><span>)</span><span>;</span>

<span>    </span><span style="color:#800080;">if</span><span> (</span><span>invalid</span><span>) </span><span style="color:#800000;">{</span>
<span>        </span><span style="color:#800080;">return</span><span> </span><span style="color:#800080;">nullptr</span><span>;</span>
<span>    </span><span style="color:#800000;">}</span>

<span>    </span><span style="color:#008000;font-style: italic;">// Get the point in the buffer</span>
<span>    </span><span style="color:#800080;">const</span><span> </span><span style="color:#800080;">char</span><span>*</span><span> </span><span>point</span><span> </span><span style="color:#004080;">=</span><span> </span><span>buf</span><span>.</span><span style="font-weight: bolder;">data</span><span>() </span><span>+</span><span> </span><span>cur_info</span><span>.</span><span>second</span><span>;</span>

<span>    </span><span style="color:#008000;font-style: italic;">// Make a lexer and point it at our buffer and offset</span>
<span>    </span><span>Lexer</span><span> </span><span style="font-weight: bolder;">lexer</span><span>(</span><span>SM</span><span>.</span><span style="font-weight: bolder;">getLocForStartOfFile</span><span>(</span><span>cur_info</span><span>.</span><span>first</span><span>), </span><span>LangOpts</span><span>,</span>
<span>                </span><span>buf</span><span>.</span><span style="font-weight: bolder;">begin</span><span>(), </span><span>point</span><span>, </span><span>buf</span><span>.</span><span style="font-weight: bolder;">end</span><span>())</span><span>;</span>

<span>    </span><span style="color:#800080;">while</span><span> (</span><span style="color:#000080;">1</span><span>) </span><span style="color:#800000;">{</span>
<span>        </span><span style="color:#008000;font-style: italic;">// read through the end of line</span>
<span>        </span><span>SmallString</span><span><</span><span style="color:#000080;">128</span><span>></span><span> </span><span>text</span><span>;</span>
<span>        </span><span>lexer</span><span>.</span><span style="font-weight: bolder;">ReadToEndOfLine</span><span>(</span><span>&</span><span>text</span><span>)</span><span>;</span>

<span>        </span><span style="color:#800080;">if</span><span> (</span><span>text</span><span>.</span><span style="font-weight: bolder;">back</span><span>() </span><span>!=</span><span> </span><span style="color:#006060;">'\\'</span><span>) </span><span style="color:#800000;">{</span>
<span>            </span><span style="color:#800080;">break</span><span>;</span>
<span>        </span><span style="color:#800000;">}</span>

<span>        </span><span>llvm</span><span>::</span><span style="font-weight: bolder;">errs</span><span>() </span><span><<</span><span> </span><span style="color:#008080;">"Incomplete line, so far: "</span><span> </span><span><<</span>
<span>        </span><span style="font-weight: bolder;">getCodeString</span><span>(</span><span>SM</span><span>, </span><span>BeginLoc</span><span>, </span><span>lexer</span><span>.</span><span style="font-weight: bolder;">getFileLoc</span><span>(), </span><span style="color:#008080;">"Token"</span><span>) </span><span><<</span><span> </span><span style="color:#008080;">"\n"</span><span>;</span>
<span>    </span><span style="color:#800000;">}</span>

<span>    </span><span style="color:#800080;">return</span><span> </span><span style="font-weight: bolder;">getCodeString</span><span>(</span><span>SM</span><span>, </span><span>BeginLoc</span><span>, </span><span>lexer</span><span>.</span><span style="font-weight: bolder;">getFileLoc</span><span>(), </span><span style="color:#008080;">"Definition"</span><span>)</span><span>;</span>
<span style="color:#808000;">#if</span><span> </span><span style="color:#000080;">0</span>
<span style="color:#808080;">    Token tok;</span>
<span style="color:#808080;">    </span><span style="color:#808080;font-weight: bolder;">while</span><span style="color:#808080;"> (1) {</span>
<span style="color:#808080;">        lexer.LexFromRawLexer(tok);</span>

<span style="color:#808080;">        </span><span style="color:#808080;font-weight: bolder;">if</span><span style="color:#808080;"> (tok.is(tok::eof) || tok.is(tok::eod)) {</span>
<span style="color:#808080;">            </span><span style="color:#808080;font-weight: bolder;">break</span><span style="color:#808080;">;</span>
<span style="color:#808080;">        }</span>

<span style="color:#808080;">        llvm::errs() << "Token[" << tok.getName() << "]: \"" <<</span>
<span style="color:#808080;">            getCodeString(SM, tok.getLocation(), tok.getEndLoc(), "Token") <<</span>
<span style="color:#808080;">            "\"\n";</span>
<span style="color:#808080;">    }</span>

<span style="color:#808080;">    </span><span style="color:#808080;font-weight: bolder;">return</span><span style="color:#808080;"> getCodeString(SM, BeginLoc, tok.getEndLoc(), "Definition");</span>
<span style="color:#808000;">#endif</span>
<span style="color:#800000;">}</span>
</pre>
      </div>
      <br>
      Example failure on tokens:  (and ignore the fact that we're sorta
      printing out two tokens on every line as getEndLoc() seems to
      really be the next token and getCodeString() seems to print on
      token boundaries.)<br>
      <br>
      Macro name: ASSERT<br>
      Macro string: ASSERT((getFirstMatchingOnly &&
      firstMatching != nullptr) ||<br>
                (!getFirstMatchingOnly && (allMatchingMo !=
      nullptr ||<br>
                                           allMatchingMoRef !=
      nullptr)))<br>
      Token[raw_identifier]: "ASSERT_IFNOT("<br>
      Token[l_paren]: "(cond"<br>
      Token[raw_identifier]: "cond,"<br>
      Token[comma]: ","<br>
      Token[raw_identifier]: "_ASSERT_PANIC("<br>
      Token[l_paren]: "(AssertAssert"<br>
      Token[raw_identifier]: "AssertAssert)"<br>
      Token[r_paren]: "))"<br>
      Token[r_paren]: ")"                                   <---- I'd
      expect a eod token here.  Guessing though.<br>
      Token[hash]: "#define"<br>
      Token[raw_identifier]: "define"<br>
      ...<br>
      <br>
      On 9/26/2016 3:12 PM, Alex L wrote:<br>
    </div>
    <blockquote
cite="mid:CAKS3GBtSan6JZgeZGeVxt8zEAxOhxn889728m11uOzntSwCnWQ@mail.gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <div dir="ltr"><br>
        <div class="gmail_extra"><br>
          <div class="gmail_quote">On 26 September 2016 at 14:55, Eric
            Bayer <span dir="ltr"><<a moz-do-not-send="true"
                href="mailto:ebayer@vmware.com" target="_blank">ebayer@vmware.com</a>></span>
            wrote:<br>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px
0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
              <div bgcolor="#FFFFFF">
                <div>Thanks Alex,<br>
                  <br>
                  That gets me mostly there.  Pardon if that is a dumb
                  question, but I'm not sure how I go from a
                  SourceLocation to a Token.  I have not worked at all
                  in the preprocessor levels before.</div>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div>Something like this should work:</div>
            <div><br>
            </div>
            <div>
              <div>    StringRef getToken(SourceLocation BeginLoc,
                SourceManager &SM, LangOptions &LangOpts) {</div>
              <div>      const SourceLocation EndLoc =
                Lexer::getLocForEndOfToken(BeginLoc, 0, SM, LangOpts);</div>
              <div>      return
                Lexer::getSourceText(CharSourceRange::getTokenRange(BeginLoc,
                EndLoc), SM, LangOpts);</div>
              <div>    }</div>
            </div>
            <div><br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <p><br>
    </p>
  </body>
</html>