#ifndef _FUNFIX_H_
#define _FUNFIX_H_

#include "SynTree/Mutator.h"

#include "SynTree/Declaration.h"
#include "SynTree/Expression.h"
#include "SynTree/Statement.h"
#include "SynTree/Type.h"

#include "SymTab/Indexer.h"
#include "ResolvExpr/Resolver.h"
#include "ResolvExpr/AlternativeFinder.h"

namespace Tuples {
  class FunctionFixer : public Mutator
  {
    typedef Mutator Parent;

  public:
    FunctionFixer() {}
    virtual ~FunctionFixer() {}
    virtual Type       *mutate( FunctionType *functionType );
    virtual Statement  *mutate( ReturnStmt   *retStmt  );
    virtual DeclarationWithType *mutate( FunctionDecl *functionDecl );
    virtual Expression *mutate( VariableExpr *variableExpr);

    // indexer runs
    virtual ObjectDecl     *mutate( ObjectDecl *objectDecl )
    { index.visit( objectDecl ); return objectDecl; }
    virtual TypeDecl       *mutate( TypeDecl *typeDecl )
    { index.visit( typeDecl ); return typeDecl; }
    virtual TypedefDecl    *mutate( TypedefDecl *typeDecl )
    { index.visit( typeDecl ); return typeDecl; }
    virtual StructDecl     *mutate( StructDecl *aggregateDecl )
    { index.visit( aggregateDecl ); return aggregateDecl; }
    virtual UnionDecl      *mutate( UnionDecl *aggregateDecl )
    { index.visit( aggregateDecl ); return aggregateDecl; }
    virtual EnumDecl       *mutate( EnumDecl *aggregateDecl )
    { index.visit( aggregateDecl ); return aggregateDecl; }

    virtual Type           *mutate( StructInstType *aggrInst )
    { index.visit( aggrInst ); return aggrInst; }
    virtual Type           *mutate( UnionInstType *aggrInst )
    { index.visit( aggrInst ); return aggrInst; }



  private:
    std::list< DeclarationWithType * > rets;
    SymTab::Indexer index;
  };

} // namespace Tuples


#endif // #ifndef _FUNFIX_H_

/*
  Local Variables:
  mode: c++
  End:
*/
