#ifndef _FLATTEN_TUPLE_H_
#define _FLATTEN_TUPLE_H_

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

#include "SynTree/Expression.h"

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

  public:
    FlattenTuple();
    ~FlattenTuple();

    virtual Expression *mutate( TupleExpr *tupleExpr );

  private:
    class CollectArgs : public Visitor
    {
    public:
      virtual void visit( UntypedExpr * );
      virtual void visit( NameExpr * );
      virtual void visit( CastExpr *);
      virtual void visit( AddressExpr * );
      virtual void visit( UntypedMemberExpr * );
      virtual void visit( MemberExpr * );
      virtual void visit( VariableExpr * );
      virtual void visit( ConstantExpr * ); 
      virtual void visit( SizeofExpr * );
      virtual void visit( AttrExpr * );
      virtual void visit( LogicalExpr * );
      virtual void visit( ConditionalExpr * );
      virtual void visit( CommaExpr * );
      virtual void visit( TypeExpr * );
      virtual void visit( UntypedValofExpr * );

      virtual void visit( TupleExpr *tupleExpr );

      std::list< Expression *> &get_args() { return currentArgs; }
    private:
      std::list< Expression * > currentArgs;
    };

  };

} // namespace Tuples


#endif // #ifndef _FLATTEN_TUPLE_H_

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