Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/Declaration.h

    r3ed994e re67991f  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Sep  3 19:24:06 2017
    13 // Update Count     : 131
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Thr May  2 10:47:00 2019
     13// Update Count     : 135
    1414//
    1515
     
    1919#include <iosfwd>                // for ostream
    2020#include <list>                  // for list
     21#include <unordered_map>         // for unordered_map
    2122#include <string>                // for string, operator+, allocator, to_string
    2223
     
    6263        void fixUniqueId( void );
    6364        virtual Declaration *clone() const override = 0;
    64         virtual void accept( Visitor &v ) override = 0;
     65        virtual void accept( Visitor & v ) override = 0;
     66        virtual void accept( Visitor & v ) const override = 0;
    6567        virtual Declaration *acceptMutator( Mutator &m ) override = 0;
    6668        virtual void print( std::ostream &os, Indenter indent = {} ) const override = 0;
    6769        virtual void printShort( std::ostream &os, Indenter indent = {} ) const = 0;
    6870
    69         static void dumpIds( std::ostream &os );
    70         static Declaration *declFromId( UniqueId id );
    71 
    72   private:
     71        UniqueId uniqueId;
    7372        Type::StorageClasses storageClasses;
    74         UniqueId uniqueId;
     73  private:
    7574};
    7675
     
    141140
    142141        virtual ObjectDecl *clone() const override { return new ObjectDecl( *this ); }
    143         virtual void accept( Visitor &v ) override { v.visit( this ); }
     142        virtual void accept( Visitor & v ) override { v.visit( this ); }
     143        virtual void accept( Visitor & v ) const override { v.visit( this ); }
    144144        virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    145145        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     
    166166        CompoundStmt *get_statements() const { return statements; }
    167167        void set_statements( CompoundStmt *newValue ) { statements = newValue; }
     168        bool has_body() const { return NULL != statements; }
    168169
    169170        static FunctionDecl * newFunction( const std::string & name, FunctionType * type, CompoundStmt * statements );
    170171
    171172        virtual FunctionDecl *clone() const override { return new FunctionDecl( *this ); }
    172         virtual void accept( Visitor &v ) override { v.visit( this ); }
     173        virtual void accept( Visitor & v ) override { v.visit( this ); }
     174        virtual void accept( Visitor & v ) const override { v.visit( this ); }
    173175        virtual DeclarationWithType *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    174176        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     
    202204        typedef NamedTypeDecl Parent;
    203205  public:
    204         enum Kind { Dtype, Ftype, Ttype };
     206        enum Kind { Dtype, Ftype, Ttype, NUMBER_OF_KINDS };
    205207
    206208        Type * init;
     
    211213                TypeDecl::Kind kind;
    212214                bool isComplete;
     215
    213216                Data() : kind( (TypeDecl::Kind)-1 ), isComplete( false ) {}
    214217                Data( TypeDecl * typeDecl ) : Data( typeDecl->get_kind(), typeDecl->isComplete() ) {}
    215218                Data( Kind kind, bool isComplete ) : kind( kind ), isComplete( isComplete ) {}
     219                Data( const Data& d1, const Data& d2 )
     220                : kind( d1.kind ), isComplete ( d1.isComplete || d2.isComplete ) {}
     221
    216222                bool operator==(const Data & other) const { return kind == other.kind && isComplete == other.isComplete; }
    217223                bool operator!=(const Data & other) const { return !(*this == other);}
     
    235241
    236242        virtual TypeDecl *clone() const override { return new TypeDecl( *this ); }
    237         virtual void accept( Visitor &v ) override { v.visit( this ); }
    238         virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    239         virtual void print( std::ostream &os, Indenter indent = {} ) const override;
    240 
    241   private:
     243        virtual void accept( Visitor & v ) override { v.visit( this ); }
     244        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     245        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     246        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     247
    242248        Kind kind;
    243249};
     
    254260
    255261        virtual TypedefDecl *clone() const override { return new TypedefDecl( *this ); }
    256         virtual void accept( Visitor &v ) override { v.visit( this ); }
     262        virtual void accept( Visitor & v ) override { v.visit( this ); }
     263        virtual void accept( Visitor & v ) const override { v.visit( this ); }
    257264        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    258265  private:
     
    266273        bool body;
    267274        std::list< Attribute * > attributes;
     275        AggregateDecl * parent = nullptr;
    268276
    269277        AggregateDecl( const std::string &name, const std::list< Attribute * > & attributes = std::list< class Attribute * >(), LinkageSpec::Spec linkage = LinkageSpec::Cforall );
     
    280288        AggregateDecl * set_body( bool body ) { AggregateDecl::body = body; return this; }
    281289
    282         virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     290        virtual void print( std::ostream &os, Indenter indent = {} ) const override final;
    283291        virtual void printShort( std::ostream &os, Indenter indent = {} ) const override;
    284292  protected:
     
    297305
    298306        virtual StructDecl *clone() const override { return new StructDecl( *this ); }
    299         virtual void accept( Visitor &v ) override { v.visit( this ); }
    300         virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    301   private:
     307        virtual void accept( Visitor & v ) override { v.visit( this ); }
     308        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     309        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    302310        DeclarationNode::Aggregate kind;
     311  private:
    303312        virtual std::string typeString() const override;
    304313};
     
    311320
    312321        virtual UnionDecl *clone() const override { return new UnionDecl( *this ); }
    313         virtual void accept( Visitor &v ) override { v.visit( this ); }
     322        virtual void accept( Visitor & v ) override { v.visit( this ); }
     323        virtual void accept( Visitor & v ) const override { v.visit( this ); }
    314324        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    315325  private:
     
    326336
    327337        virtual EnumDecl *clone() const override { return new EnumDecl( *this ); }
    328         virtual void accept( Visitor &v ) override { v.visit( this ); }
    329         virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    330   private:
    331         std::map< std::string, long long int > enumValues;
     338        virtual void accept( Visitor & v ) override { v.visit( this ); }
     339        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     340        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     341  private:
     342        std::unordered_map< std::string, long long int > enumValues;
    332343        virtual std::string typeString() const override;
    333344};
     
    342353
    343354        virtual TraitDecl *clone() const override { return new TraitDecl( *this ); }
    344         virtual void accept( Visitor &v ) override { v.visit( this ); }
    345         virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    346   private:
    347         virtual std::string typeString() const override;
     355        virtual void accept( Visitor & v ) override { v.visit( this ); }
     356        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     357        virtual Declaration *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
     358  private:
     359        virtual std::string typeString() const override;
     360};
     361
     362class WithStmt : public Declaration {
     363public:
     364        std::list< Expression * > exprs;
     365        Statement * stmt;
     366
     367        WithStmt( const std::list< Expression * > & exprs, Statement * stmt );
     368        WithStmt( const WithStmt & other );
     369        virtual ~WithStmt();
     370
     371        virtual WithStmt * clone() const override { return new WithStmt( *this ); }
     372        virtual void accept( Visitor & v ) override { v.visit( this ); }
     373        virtual void accept( Visitor & v ) const override { v.visit( this ); }
     374        virtual Declaration * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
     375        virtual void print( std::ostream & os, Indenter indent = {} ) const override;
     376        virtual void printShort( std::ostream & os, Indenter indent = {} ) const override { print(os, indent); }
    348377};
    349378
     
    360389
    361390        virtual AsmDecl *clone() const override { return new AsmDecl( *this ); }
    362         virtual void accept( Visitor &v ) override { v.visit( this ); }
     391        virtual void accept( Visitor & v ) override { v.visit( this ); }
     392        virtual void accept( Visitor & v ) const override { v.visit( this ); }
    363393        virtual AsmDecl *acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    364394        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
     
    376406
    377407        virtual StaticAssertDecl * clone() const override { return new StaticAssertDecl( *this ); }
    378         virtual void accept( Visitor &v ) override { v.visit( this ); }
     408        virtual void accept( Visitor & v ) override { v.visit( this ); }
     409        virtual void accept( Visitor & v ) const override { v.visit( this ); }
    379410        virtual StaticAssertDecl * acceptMutator( Mutator &m )  override { return m.mutate( this ); }
    380411        virtual void print( std::ostream &os, Indenter indent = {} ) const override;
Note: See TracChangeset for help on using the changeset viewer.