#ifndef GENPOLY_SCRUBTYVARS_H
#define GENPOLY_SCRUBTYVARS_H

#include "GenPoly.h"

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

namespace GenPoly {
    class ScrubTyVars : public Mutator {
      public:
	ScrubTyVars( bool doAll, const TyVarMap &tyVars ): doAll( doAll ), tyVars( tyVars ) {}
  
	template< typename SynTreeClass >
	static SynTreeClass *scrub( SynTreeClass *target, const TyVarMap &tyVars );
	template< typename SynTreeClass >
	static SynTreeClass *scrub( SynTreeClass *target );
  
	virtual Type* mutate( TypeInstType *typeInst );
	Expression* mutate( SizeofExpr *szeof );
	virtual Type* mutate( PointerType *pointer );
      private:
	bool doAll;
	const TyVarMap &tyVars;
    };

    /* static class method */
    template< typename SynTreeClass >
    SynTreeClass * ScrubTyVars::scrub( SynTreeClass *target, const TyVarMap &tyVars ) {
	ScrubTyVars scrubber( false, tyVars );
	return static_cast< SynTreeClass * >( target->acceptMutator( scrubber ) );
    }

    /* static class method */
    template< typename SynTreeClass >
    SynTreeClass * ScrubTyVars::scrub( SynTreeClass *target ) {
	TyVarMap tyVars;
	ScrubTyVars scrubber( true, tyVars );
	return static_cast< SynTreeClass* >( target->acceptMutator( scrubber ) );
    }
} // namespace GenPoly

#endif // GENPOLY_SCRUBTYVARS_H
