#ifndef _TUPLE_FUNCHK_H_
#define _TUPLE_FUNCHK_H_

#include <string>
#include <list>
#include <iostream>

#include "UniqueName.h"

#include "SynTree/SynTree.h"
#include "SynTree/Mutator.h"

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


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

  public:
    FunctionChecker( bool _topLevel = false, UniqueName *_nameGen = 0 );
    ~FunctionChecker();

    virtual Expression* mutate(ApplicationExpr *applicationExpr);
    virtual Statement* mutate(ExprStmt *exprStmt);

  private:
    bool topLevel;
    UniqueName *nameGen;
    std::list< ObjectDecl * > temporaries;
    std::list< Expression * > tempExpr;
  };

  class TupleDistrib : public Mutator {
  public:
    virtual Expression* mutate(UntypedExpr *utExpr);

  private:
  };

  void checkFunctions( std::list< Declaration * > translationUnit );

} // namespace Tuples

#endif // #ifndef _TUPLE_FUNCHK_H_

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