<html><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:10pt"><div>I am following an example which shows limitation of python bindings, from site http://eli.thegreenplace.net/2011/07/03/parsing-c-in-python-with-clang/ It uses "libclang visitation API directly".</div><div><br></div><div>import sys</div><div>import clang.cindex</div><div><br></div><div>def callexpr_visitor(node, parent, userdata):</div><div>    if node.kind == clang.cindex.CursorKind.CALL_EXPR:</div><div>          print 'Found %s [line=%s, col=%s]' % (</div><div>              node.spelling, node.location.line, node.location.column)</div><div>    return 2 # means continue visiting recursively</div><div><br></div><div>index = clang.cindex.Index.create()</div><div>tu =
 index.parse(sys.argv[1])</div><div>clang.cindex.Cursor_visit(</div><div>             tu.cursor,</div><div>            clang.cindex.Cursor_visit_callback(callexpr_visitor),</div><div>            None)</div><div>The output shows all functions called along with their line numbers.</div><div><br></div><div>Found foo [line=8, col=5]</div><div>Found foo [line=10, col=9]</div><div>Found bar [line=15, col=5]</div><div>Found foo [line=16, col=9]</div><div>Found bar [line=17, col=9]</div><div><br></div><div>When I run the same code, I only get output</div><div>Found bar [line=15, col=5]</div><div><br></div><div>The version I use is llvm3.1 with windows (with the changes suggested in the link).</div><div><br></div><div style="color: rgb(0, 0, 0); font-size: 13px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;
 background-color: transparent; font-style: normal;"><span style="font-size: 10pt;">I feel, returning 2 is not calling the callback function again. I have even tried using 'get_children' on node and traversing without callback, I get the same result.</span><br></div><div><br></div><div>import sys</div><div>import clang.cindex</div><div><br></div><div>#def callexpr_visitor(node, parent, userdata):</div><div>def callexpr_visitor(node):</div><div>    if node.kind == clang.cindex.CursorKind.CALL_EXPR:</div><div>            print 'Found %s [line=%s, col=%s]' % (</div><div>             clang.cindex.Cursor_displayname(node), node.location.line, node.location.column)</div><div>    for c in node.get_children():</div><div>           callexpr_visitor(c)</div><div>    #return 2 # means continue visiting
 recursively</div><div><br></div><div>index = clang.cindex.Index.create()</div><div>tu = index.parse(sys.argv[1])</div><div>#clang.cindex.Cursor_visit(</div><div>#        tu.cursor,</div><div>#        clang.cindex.Cursor_visit_callback(callexpr_visitor),</div><div>#        None)</div><div>callexpr_visitor(tu.cursor)</div><div><br></div><div style="color: rgb(0, 0, 0); font-size: 13px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: transparent; font-style: normal;"><br></div><div style="color: rgb(0, 0, 0); font-size: 13px; font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: transparent; font-style: normal;">I was expecting that a recursive traversal will happen and I will be getting the same list as given in example.<br></div><div>I could not get the reason for this
 behaviour after much search and trials. </div><div>Am I making a mistake in using or the behaviour has changed over time and I should be using something else ?</div><div><br></div><div>Best Regards.</div></div></body></html>