#ifndef TRANSLATIONUNITVISITOR_HH
#define TRANSLATIONUNITVISITOR_HH

#include <string>
#include <vector>
#include <set>
#include <map>

#include "clang/Frontend/CompilerInstance.h"
#include "clang/AST/RecursiveASTVisitor.h"

class CommentSaver ;
class ClassValues ;
class EnumValues ;
class HeaderSearchDirs ;
class PrintAttributes ;

/**

  This is the top level AST visitor.  This class dispatched nodes we are interested
  in to lower level AST visitors.  All class information is stored in this visitor.

  @author Alexander S. Lin

  @date July 2012

 */

class TranslationUnitVisitor : public clang::RecursiveASTVisitor<TranslationUnitVisitor> {
    public:
        TranslationUnitVisitor( clang::CompilerInstance & in_ci , HeaderSearchDirs & hsd ,
         CommentSaver & cs , PrintAttributes & in_pa ) ;

        /** custom node traversal function that dispatches nodes we are interested in
            to lower level AST visitors */
        bool TraverseDecl(clang::Decl *D);

    private:

        /** The compiler instance  */
        clang::CompilerInstance & ci ;

        /** The header search directories */
        HeaderSearchDirs & hsd ;

        /** Holds all comments */
        CommentSaver & cs ;

        /** attributes printer */
        PrintAttributes & pa ;

        std::map < std::string , std::set< std::string > > fwd_declared_classes ;
} ;

#endif