Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Decl.hpp

    r8a5530c rf3cc5b6  
    3030#include "Parser/ParseNode.h"  // for DeclarationNode::Aggregate
    3131
     32// Must be included in *all* AST classes; should be #undef'd at the end of the file
     33#define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node);
     34
    3235namespace ast {
    33 
    34 class Attribute;
    35 class Expr;
    36 class Init;
    37 class TypeDecl;
    3836
    3937/// Base declaration class
     
    6058private:
    6159        Decl * clone() const override = 0;
     60        MUTATE_FRIEND
    6261};
    6362
     
    9291private:
    9392        DeclWithType * clone() const override = 0;
     93        MUTATE_FRIEND
    9494};
    9595
     
    113113private:
    114114        ObjectDecl * clone() const override { return new ObjectDecl{ *this }; }
    115 
    116         /// Must be copied in ALL derived classes
    117         template<typename node_t>
    118         friend auto mutate(const node_t * node);
     115        MUTATE_FRIEND
    119116};
    120117
     
    140137private:
    141138        FunctionDecl * clone() const override { return new FunctionDecl( *this ); }
    142 
    143         /// Must be copied in ALL derived classes
    144         template<typename node_t>
    145         friend auto mutate(const node_t * node);
     139        MUTATE_FRIEND
    146140};
    147141
     
    150144public:
    151145        ptr<Type> base;
    152         std::vector<ptr<TypeDecl>> parameters;
     146        std::vector<ptr<TypeDecl>> params;
    153147        std::vector<ptr<DeclWithType>> assertions;
    154148
    155149        NamedTypeDecl( const CodeLocation& loc, const std::string& name, Storage::Classes storage,
    156150                Type* b, Linkage::Spec spec = Linkage::Cforall )
    157         : Decl( loc, name, storage, spec ), base( b ), parameters(), assertions() {}
     151        : Decl( loc, name, storage, spec ), base( b ), params(), assertions() {}
    158152
    159153        /// Produces a name for the kind of alias
     
    162156private:
    163157        NamedTypeDecl* clone() const override = 0;
     158        MUTATE_FRIEND
    164159};
    165160
     
    203198private:
    204199        TypeDecl * clone() const override { return new TypeDecl{ *this }; }
    205 
    206         /// Must be copied in ALL derived classes
    207         template<typename node_t>
    208         friend auto mutate(const node_t * node);
     200        MUTATE_FRIEND
    209201};
    210202
     
    221213private:
    222214        TypedefDecl * clone() const override { return new TypedefDecl{ *this }; }
    223 
    224         /// Must be copied in ALL derived classes
    225         template<typename node_t>
    226         friend auto mutate(const node_t * node);
     215        MUTATE_FRIEND
    227216};
    228217
     
    231220public:
    232221        std::vector<ptr<Decl>> members;
    233         std::vector<ptr<TypeDecl>> parameters;
     222        std::vector<ptr<TypeDecl>> params;
    234223        std::vector<ptr<Attribute>> attributes;
    235224        bool body = false;
     
    238227        AggregateDecl( const CodeLocation& loc, const std::string& name,
    239228                std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall )
    240         : Decl( loc, name, Storage::Classes{}, linkage ), members(), parameters(),
     229        : Decl( loc, name, Storage::Classes{}, linkage ), members(), params(),
    241230          attributes( std::move(attrs) ) {}
    242231
    243232        AggregateDecl* set_body( bool b ) { body = b; return this; }
     233
     234private:
     235        AggregateDecl * clone() const override = 0;
     236        MUTATE_FRIEND
    244237
    245238protected:
     
    265258private:
    266259        StructDecl * clone() const override { return new StructDecl{ *this }; }
    267 
    268         /// Must be copied in ALL derived classes
    269         template<typename node_t>
    270         friend auto mutate(const node_t * node);
     260        MUTATE_FRIEND
    271261
    272262        std::string typeString() const override { return "struct"; }
     
    283273private:
    284274        UnionDecl * clone() const override { return new UnionDecl{ *this }; }
    285 
    286         /// Must be copied in ALL derived classes
    287         template<typename node_t>
    288         friend auto mutate(const node_t * node);
     275        MUTATE_FRIEND
    289276
    290277        std::string typeString() const override { return "union"; }
     
    304291private:
    305292        EnumDecl * clone() const override { return new EnumDecl{ *this }; }
    306 
    307         /// Must be copied in ALL derived classes
    308         template<typename node_t>
    309         friend auto mutate(const node_t * node);
     293        MUTATE_FRIEND
    310294
    311295        std::string typeString() const override { return "enum"; }
     
    325309private:
    326310        TraitDecl * clone() const override { return new TraitDecl{ *this }; }
    327 
    328         /// Must be copied in ALL derived classes
    329         template<typename node_t>
    330         friend auto mutate(const node_t * node);
     311        MUTATE_FRIEND
    331312
    332313        std::string typeString() const override { return "trait"; }
     
    343324private:
    344325        AsmDecl *clone() const override { return new AsmDecl( *this ); }
    345 
    346         /// Must be copied in ALL derived classes
    347         template<typename node_t>
    348         friend auto mutate(const node_t * node);
     326        MUTATE_FRIEND
    349327};
    350328
     
    360338private:
    361339        StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
    362 
    363         /// Must be copied in ALL derived classes
    364         template<typename node_t>
    365         friend auto mutate(const node_t * node);
     340        MUTATE_FRIEND
    366341};
    367342
     
    402377}
    403378
     379#undef MUTATE_FRIEND
     380
    404381// Local Variables: //
    405382// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.