#include <list>
#include <stack>
#include <cassert>
#include <algorithm>


#include "utility.h"
#include "InitExpander.h"
#include "InitModel.h"

namespace InitTweak {

  InitExpander::InitExpander() {}

  InitExpander::~InitExpander() {}

  ObjectDecl *InitExpander::mutate( ObjectDecl *objectDecl ) {
    index.visit( objectDecl );

    if( objectDecl->get_init() == 0 ) return objectDecl;

    InitModelBuilder builder( objectDecl );
    builder.get_assoc()->display( std::cerr ); // xxx
    InitModelFiller filler( builder.get_assoc(), objectDecl->get_init(), true );
    // filler.get_assoc()->display( std::cerr ); // xxx
    InitUnspooler exp;
    filler.get_assoc()->accept( exp );
    objectDecl->set_init( exp.grab_initializer() );
    objectDecl->get_init()->print( std::cerr );

    return objectDecl;
  }

} // namespace InitTweak

