<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size:12pt;color:#000000;background-color:#FFFFFF;font-family:Calibri,Arial,Helvetica,sans-serif;">
Hi all,
<div><br>
</div>
<div>Here is my problem. I have implemented an AST recursive visitor and I want to extract the variable definitions in Function bodies/definitions only. Here is my AST visitor (part of):</div>
<div><br>
</div>
<div>
<div>bool VisitFunctionDecl(FunctionDecl *func)</div>
<div>    {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span> if(astContext->getSourceManager().isInMainFile(func->getLocStart()) && func->isThisDeclarationADefinition()) //checks if the node is in the main (input) file and a function definition</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span> {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  FullSourceLoc FullLocation = astContext->getFullLoc(func->getLocStart());</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  string funcName = func->getNameInfo().getName().getAsString();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  string funcType = func->getResultType().getAsString();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  string srcFunc = filename + "_" + funcName;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  REPORT << "[" << FullLocation.getSpellingLineNumber() << "," << FullLocation.getSpellingColumnNumber() << "]Function Declaration: " << funcName << " of type " << funcType << "\n";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  if (append == 0 && numFunctions == 0)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span> APIs << srcFunc <<":";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  else</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span><span class="Apple-tab-span" style="white-space:pre"></span> APIs << "\n" << srcFunc <<":";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  APIs  <<funcType << ";";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  numFunctions++;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  }</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>  return true;</div>
<div>    }</div>
<div><br>
</div>
<div>    bool VisitVarDecl(VarDecl *var)</div>
<div>    {</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if (astContext->getSourceManager().isInMainFile(var->getLocStart())) //checks if the node is in the main = input file.</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>if((var->hasLocalStorage() || var->isStaticLocal ()) && !var->isDefinedOutsideFunctionOrMethod () )</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>{</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>FullSourceLoc FullLocation = astContext->getFullLoc(var->getLocStart());</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>//var->dump(); //prints the corresponding line of the AST.</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>numVariables++;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>string varName = var->getQualifiedNameAsString();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>string varType = var->getType().getAsString();</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>REPORT << "[" << FullLocation.getSpellingLineNumber() << "," << FullLocation.getSpellingColumnNumber() << "]Variable Declaration: " << varName << " of type " << varType << "\n";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>APIs << varType << ";";</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>}</div>
<div>        return true;</div>
<div>    }</div>
<br>
</div>
<div><br>
</div>
<div>As you can see I want to extract some information from the ASTnodes BUT there are some constraints:</div>
<div>1) I want only the function definition to be extracted and their variables </div>
<div>2) Not variables defines outside any function</div>
<div><br>
</div>
<div>For example when I parse the AST for the following code I get this result which is wrong:</div>
<div>
<div>static<span class="Apple-tab-span" style="white-space:pre"> </span>int LZWDecode(TIFF*, tidata_t, tsize_t, tsample_t); </div>
<div><br>
</div>
<div>As I have understand this is a function declaration. With my constraints my AST visitor will not print me the messages or extract the function name etc BUT will extract its variable definitions. The result will be something like</div>
<div><span style="font-family: Calibri, Arial, Helvetica, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols; font-size: 16px;">Variable Declaration: </span><anonymous> of type TIFF *</div>
<div><br>
</div>
<div>What can i do ? Is something to skip the hole "function declaration node" if it doesn't meet my requirements??</div>
<div>Thank you all</div>
<br>
</div>
</div>
</body>
</html>