Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Init.hpp

    r9e1d485 r23f99e1  
    3737        : ParseNode( loc ), designators( std::move(ds) ) {}
    3838
    39         Designation* accept( Visitor& v ) override { return v.visit( this ); }
     39        const Designation* accept( Visitor& v ) const override { return v.visit( this ); }
    4040private:
    4141        Designation* clone() const override { return new Designation{ *this }; }
    4242};
    4343
    44 /// Flag for whether to construct from initialzier
    45 enum ConstructFlag { DoConstruct, MaybeConstruct };
    46 
    4744/// Object initializer base class
    4845class Init : public ParseNode {
    4946public:
    50         ConstructFlag maybeConstructed;
     47        bool maybeConstructed;
    5148
    52         Init( const CodeLocation& loc, ConstructFlag mc ) : ParseNode( loc ), maybeConstructed( mc ) {}
     49        Init( const CodeLocation& loc, bool mc ) : ParseNode( loc ), maybeConstructed( mc ) {}
    5350
    54         virtual Init* accept( Visitor& v ) override = 0;
     51        const Init * accept( Visitor& v ) const override = 0;
    5552private:
    56         virtual Init* clone() const override = 0;
     53        const Init * clone() const override = 0;
    5754};
    5855
     
    6360        ptr<Expr> value;
    6461
    65         SingleInit( const CodeLocation& loc, Expr* val, ConstructFlag mc = DoConstruct )
     62        SingleInit( const CodeLocation& loc, Expr* val, bool mc = false )
    6663        : Init( loc, mc ), value( val ) {}
    6764
    68         Init* accept( Visitor& v ) override { return v.visit( this ); }
     65        const Init * accept( Visitor & v ) const override { return v.visit( this ); }
    6966private:
    70         SingleInit* clone() const override { return new SingleInit{ *this }; }
     67        SingleInit * clone() const override { return new SingleInit{ *this }; }
     68
     69        /// Must be copied in ALL derived classes
     70        template<typename node_t>
     71        friend auto mutate(const node_t * node);
    7172};
    7273
     
    8182
    8283        ListInit( const CodeLocation& loc, std::vector<ptr<Init>>&& is,
    83                 std::vector<ptr<Designation>>&& ds = {}, ConstructFlag mc = DoConstruct );
     84                std::vector<ptr<Designation>>&& ds = {}, bool mc = false );
    8485
    8586        using iterator = std::vector<ptr<Init>>::iterator;
     
    9091        const_iterator end() const { return initializers.end(); }
    9192
    92         Init* accept( Visitor& v ) override { return v.visit( this ); }
     93        const Init * accept( Visitor & v ) const override { return v.visit( this ); }
    9394private:
    94         ListInit* clone() const override { return new ListInit{ *this }; }
     95        ListInit * clone() const override { return new ListInit{ *this }; }
     96
     97        /// Must be copied in ALL derived classes
     98        template<typename node_t>
     99        friend auto mutate(const node_t * node);
    95100};
    96101
     
    107112
    108113        ConstructorInit( const CodeLocation& loc, Stmt* ctor, Stmt* dtor, Init* init )
    109         : Init( loc, DoConstruct ), ctor( ctor ), dtor( dtor ), init( init ) {}
     114        : Init( loc, true ), ctor( ctor ), dtor( dtor ), init( init ) {}
    110115
    111         Init* accept( Visitor& v ) override { return v.visit( this ); }
     116        const Init * accept( Visitor & v ) const override { return v.visit( this ); }
    112117private:
    113         ConstructorInit* clone() const override { return new ConstructorInit{ *this }; }
     118        ConstructorInit * clone() const override { return new ConstructorInit{ *this }; }
     119
     120        /// Must be copied in ALL derived classes
     121        template<typename node_t>
     122        friend auto mutate(const node_t * node);
    114123};
    115124
Note: See TracChangeset for help on using the changeset viewer.