2016-06-22 5 views
1

こんにちは、私はAST Clangビジターを実装しようとしています。これは私のコードです。Clang ASTビジター、トラバースインクルードファイルを避ける

class ExampleVisitor : public RecursiveASTVisitor<ExampleVisitor> { 
private: 
    ASTContext *astContext; // used for getting additional AST info 

public: 
    virtual bool VisitVarDecl(VarDecl *var) 
    { 
     numVariables++; 
     string varName = var->getQualifiedNameAsString(); 
     string varType = var->getType().getAsString(); 
     cout << "Found variable declaration: " << varName << " of type " << varType << "\n"; 
     APIs << varType << ", "; 
     return true; 
    } 

    virtual bool VisitFunctionDecl(FunctionDecl *func) 
    { 
     numFunctions++; 
     string funcName = func->getNameInfo().getName().getAsString(); 
     string funcType = func->getResultType().getAsString(); 
     cout << "Found function declaration: " << funcName << " of type " << funcType << "\n"; 
     APIs << "\n\n" << funcName <<": "; 
     APIs << funcType << ", "; 
     return true; 
    } 

    virtual bool VisitStmt(Stmt *st) 
    { 
     if (CallExpr *call = dyn_cast<CallExpr>(st)) 
     { 
      numFuncCalls++; 
      FunctionDecl *func_decl = call->getDirectCallee(); 
      string funcCall = func_decl->getNameInfo().getName().getAsString(); 
      cout << "Found function call: " << funcCall << " with arguments "; 
      APIs << funcCall << ", "; 
      for(int i=0, j = call->getNumArgs(); i<j; i++) 
      { 
       string TypeS; 
       raw_string_ostream s(TypeS); 
       call->getArg(i)->printPretty(s, 0, Policy); 
       cout<< s.str() << ", "; 
       APIs<< s.str() << ", "; 
      } 
      cout << "\n"; 
     } 
     return true; 
    } 
}; 

含まれているヘッダーファイルを移動するのを避けることはできますが、情報を失うことはありません。私はちょうどこのファイルに関するすべての情報を印刷したくないが、私は打ち鳴らすはあなたが解析しているコードのすべてのnescecarryの情報を得ることができますASTコンテキストを使用することにより

答えて

1

ありがとう

これらのファイルについて知りたいです。メインファイルまたはヘッダファイルにあるASTノードを区別する関数はisInMainFile()と呼ばれ、以下のように使用できます。

bool VisitVarDecl(VarDecl *var) 
{ 
    if (astContext->getSourceManager().isInMainFile(var->getLocStart())) //checks if the node is in the main = input file. 
    { 
     if(var->hasLocalStorage() || var->isStaticLocal()) 
     { 
      //var->dump(); //prints the corresponding line of the AST. 
      FullSourceLoc FullLocation = astContext->getFullLoc(var->getLocStart()); 
      numVariables++; 
      string varName = var->getQualifiedNameAsString(); 
      string varType = var->getType().getAsString(); 
      REPORT << "Variable Declaration [" << FullLocation.getSpellingLineNumber() << "," << FullLocation.getSpellingColumnNumber() << "]: " << varName << " of type " << varType << "\n"; 
      APIs << varType << ","; 
     } 
    } 
    return true; 
} 

astContextの使用方法の詳細については、clangのWebサイトの公式の再帰ASTvisitorチュートリアルに従ってください。