2016-07-10 3 views
1

Я разработал посетителя AST с использованием Clang libtooling, и я хотел бы выделить прототипы функций и объявления функций. Мой посетитель AST принимает оба случая как объявления функций. Ниже вы можете увидеть мой код для посещения объявления функций:Как отличить определения функций и декларации функций в посетителях Clang AST

bool VisitFunctionDecl(FunctionDecl *func) 
    { 
     if(astContext->getSourceManager().isInMainFile(func->getLocStart()) && func->hasBody()) //checks if the node is in the main (input) file. 
     { 
      FullSourceLoc FullLocation = astContext->getFullLoc(func->getLocStart()); 
      string funcName = func->getNameInfo().getName().getAsString(); 
      string funcType = func->getResultType().getAsString(); 
      string srcFunc = filename + "_" + funcName; 
      REPORT << "Function Declaration [" << FullLocation.getSpellingLineNumber() << "," << FullLocation.getSpellingColumnNumber() << "]: " << funcName << " of type " << funcType << "\n"; 
      if (append == 0 && numFunctions == 0) 
       APIs << srcFunc <<":"; 
      else 
       APIs << "\n" << srcFunc <<":"; 
      APIs <<funcType << ","; 
      numFunctions++; 
     } 
     return true; 
    } 

функционировали> hasBody() не может различать между этими двумя вещами. Есть идеи??

+0

Что заставляет вас думать, что это две разные вещи? Можете привести несколько примеров? Или вы имеете в виду объявления функций и определения функций? –

+0

Да, я хотел различать определения функций и декларации. –

+1

Тогда, пожалуйста, обновите вопрос. –

ответ

1

Использование FunctionDecl::isThisDeclarationADefinition().