Changeset 907eccb for src/SynTree


Ignore:
Timestamp:
Dec 22, 2016, 3:23:49 PM (7 years ago)
Author:
Rob Schluntz <rschlunt@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
4c8621ac
Parents:
0c286cf
Message:

added UntypedTupleExpr? to better differentiate typed and untyped contexts, simplifying some code

Location:
src/SynTree
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/Expression.h

    r0c286cf r907eccb  
    634634};
    635635
     636/// UntypedTupleExpr represents a tuple expression ( [a, b, c] ) before resolution
     637class UntypedTupleExpr : public Expression {
     638  public:
     639        UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
     640        UntypedTupleExpr( const UntypedTupleExpr &other );
     641        virtual ~UntypedTupleExpr();
     642
     643        std::list<Expression*>& get_exprs() { return exprs; }
     644
     645        virtual UntypedTupleExpr *clone() const { return new UntypedTupleExpr( *this ); }
     646        virtual void accept( Visitor &v ) { v.visit( this ); }
     647        virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
     648        virtual void print( std::ostream &os, int indent = 0 ) const;
     649  private:
     650        std::list<Expression*> exprs;
     651};
     652
    636653/// TupleExpr represents a tuple expression ( [a, b, c] )
    637654class TupleExpr : public Expression {
    638655  public:
    639         TupleExpr( const std::list< Expression * > & exprs = std::list< Expression * >(), Expression *_aname = nullptr );
     656        TupleExpr( const std::list< Expression * > & exprs, Expression *_aname = nullptr );
    640657        TupleExpr( const TupleExpr &other );
    641658        virtual ~TupleExpr();
    642659
    643         void set_exprs( std::list<Expression*> newValue ) { exprs = newValue; }
    644660        std::list<Expression*>& get_exprs() { return exprs; }
    645661
  • src/SynTree/Mutator.cc

    r0c286cf r907eccb  
    345345Expression* Mutator::mutate( ImplicitCopyCtorExpr *impCpCtorExpr ) {
    346346        impCpCtorExpr->set_env( maybeMutate( impCpCtorExpr->get_env(), *this ) );
     347        impCpCtorExpr->set_result( maybeMutate( impCpCtorExpr->get_result(), *this ) );
    347348        impCpCtorExpr->set_callExpr( maybeMutate( impCpCtorExpr->get_callExpr(), *this ) );
    348349        mutateAll( impCpCtorExpr->get_tempDecls(), *this );
     
    378379        rangeExpr->set_high( maybeMutate( rangeExpr->get_high(), *this ) );
    379380        return rangeExpr;
     381}
     382
     383Expression *Mutator::mutate( UntypedTupleExpr *tupleExpr ) {
     384        tupleExpr->set_env( maybeMutate( tupleExpr->get_env(), *this ) );
     385        tupleExpr->set_result( maybeMutate( tupleExpr->get_result(), *this ) );
     386        mutateAll( tupleExpr->get_exprs(), *this );
     387        return tupleExpr;
    380388}
    381389
  • src/SynTree/Mutator.h

    r0c286cf r907eccb  
    7878        virtual Expression* mutate( UntypedValofExpr *valofExpr );
    7979        virtual Expression* mutate( RangeExpr *rangeExpr );
     80        virtual Expression* mutate( UntypedTupleExpr *tupleExpr );
    8081        virtual Expression* mutate( TupleExpr *tupleExpr );
    8182        virtual Expression* mutate( TupleIndexExpr *tupleExpr );
  • src/SynTree/SynTree.h

    r0c286cf r907eccb  
    8383class UntypedValofExpr;
    8484class RangeExpr;
     85class UntypedTupleExpr;
    8586class TupleExpr;
    8687class TupleIndexExpr;
  • src/SynTree/TupleExpr.cc

    r0c286cf r907eccb  
    2121#include "VarExprReplacer.h"
    2222
     23UntypedTupleExpr::UntypedTupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) {
     24}
     25
     26UntypedTupleExpr::UntypedTupleExpr( const UntypedTupleExpr &other ) : Expression( other ) {
     27        cloneAll( other.exprs, exprs );
     28}
     29
     30UntypedTupleExpr::~UntypedTupleExpr() {
     31        deleteAll( exprs );
     32}
     33
     34void UntypedTupleExpr::print( std::ostream &os, int indent ) const {
     35        os << "Untyped Tuple:" << std::endl;
     36        printAll( exprs, os, indent+2 );
     37        Expression::print( os, indent );
     38}
     39
    2340TupleExpr::TupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) {
    24         if ( ! exprs.empty() ) {
    25                 if ( std::all_of( exprs.begin(), exprs.end(), [](Expression * expr) { return expr->get_result(); } ) ) {
    26                         set_result( Tuples::makeTupleType( exprs ) );
    27                 }
    28         }
     41        set_result( Tuples::makeTupleType( exprs ) );
    2942}
    3043
     
    4558TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) : tuple( tuple ), index( index )  {
    4659        TupleType * type = safe_dynamic_cast< TupleType * >( tuple->get_result() );
    47         assert( type->size() > index );
     60        assertf( type->size() > index, "TupleIndexExpr index out of bounds: tuple size %d, requested index %d", type->size(), index );
    4861        set_result( (*std::next( type->get_types().begin(), index ))->clone() );
    4962        get_result()->set_isLvalue( type->get_isLvalue() );
  • src/SynTree/Visitor.cc

    r0c286cf r907eccb  
    273273
    274274void Visitor::visit( ImplicitCopyCtorExpr *impCpCtorExpr ) {
     275        maybeAccept( impCpCtorExpr->get_result(), *this );
    275276        maybeAccept( impCpCtorExpr->get_callExpr(), *this );
    276277        acceptAll( impCpCtorExpr->get_tempDecls(), *this );
     
    298299        maybeAccept( rangeExpr->get_low(), *this );
    299300        maybeAccept( rangeExpr->get_high(), *this );
     301}
     302
     303void Visitor::visit( UntypedTupleExpr *tupleExpr ) {
     304        maybeAccept( tupleExpr->get_result(), *this );
     305        acceptAll( tupleExpr->get_exprs(), *this );
    300306}
    301307
  • src/SynTree/Visitor.h

    r0c286cf r907eccb  
    7878        virtual void visit( UntypedValofExpr *valofExpr );
    7979        virtual void visit( RangeExpr *rangeExpr );
     80        virtual void visit( UntypedTupleExpr *tupleExpr );
    8081        virtual void visit( TupleExpr *tupleExpr );
    8182        virtual void visit( TupleIndexExpr *tupleExpr );
Note: See TracChangeset for help on using the changeset viewer.