Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/CodeGen/CodeGenerator.cc

    rf975c65 r29cf9c8  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Wed May 10 14:45:00 2017
     12// Last Modified On : Tus May  9 16:50:00 2017
    1313// Update Count     : 484
    1414//
     
    4141namespace CodeGen {
    4242        int CodeGenerator::tabsize = 4;
     43
     44        // Pseudo Function: output << lineDirective(currentNode);
     45    struct lineDirective {
     46        CodeLocation const & loc;
     47                lineDirective(CodeLocation const & location) : loc(location) {}
     48                lineDirective(BaseSyntaxNode const * node) : loc(node->location) {}
     49        };
     50        std::ostream & operator<<(std::ostream & out, lineDirective const & ld) {
     51                if (ld.loc.isSet())
     52                        return out << "\n# " << ld.loc.linenumber << " \""
     53                                << ld.loc.filename << "\"\n";
     54                return out << "\n// Unset Location\n";
     55        }
    4356
    4457        // the kinds of statements that would ideally be followed by whitespace
     
    89102        }
    90103
    91         CodeGenerator::LineMarker::LineMarker(
    92                         CodeLocation const & loc, bool toPrint) :
    93                 loc(loc), toPrint(toPrint)
    94         {}
    95 
    96         CodeGenerator::LineMarker CodeGenerator::lineDirective(
    97                         BaseSyntaxNode const * node) {
    98                 return LineMarker(node->location, lineMarks);
    99         }
    100 
    101         std::ostream & operator<<(std::ostream & out,
    102                         CodeGenerator::LineMarker const & marker) {
    103                 if (marker.toPrint && marker.loc.isSet()) {
    104                         return out << "\n# " << marker.loc.linenumber << " \""
    105                                 << marker.loc.filename << "\"\n";
    106                 } else if (marker.toPrint) {
    107                         return out << "\n/* Missing CodeLocation */\n";
    108                 } else {
    109                 return out;
    110                 }
    111         }
    112 
    113         CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {}
     104        CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ) {}
    114105
    115106        CodeGenerator::CodeGenerator( std::ostream & os, std::string init, int indentation, bool infunp )
     
    152143        // *** Declarations
    153144        void CodeGenerator::visit( FunctionDecl * functionDecl ) {
     145                output << lineDirective( functionDecl );
     146
    154147                extension( functionDecl );
    155148                genAttributes( functionDecl->get_attributes() );
     
    175168                }
    176169
     170                output << lineDirective( objectDecl );
     171
    177172                extension( objectDecl );
    178173                genAttributes( objectDecl->get_attributes() );
     
    226221
    227222        void CodeGenerator::visit( StructDecl * structDecl ) {
     223                output << lineDirective( structDecl );
     224
    228225                extension( structDecl );
    229226                handleAggregate( structDecl, "struct " );
     
    231228
    232229        void CodeGenerator::visit( UnionDecl * unionDecl ) {
     230                output << lineDirective( unionDecl );
     231
    233232                extension( unionDecl );
    234233                handleAggregate( unionDecl, "union " );
     
    709708        void CodeGenerator::visit( UntypedTupleExpr * tupleExpr ) {
    710709                assertf( ! genC, "UntypedTupleExpr should not reach code generation." );
    711                 extension( tupleExpr );
    712710                output << "[";
    713711                genCommaList( tupleExpr->get_exprs().begin(), tupleExpr->get_exprs().end() );
     
    717715        void CodeGenerator::visit( TupleExpr * tupleExpr ) {
    718716                assertf( ! genC, "TupleExpr should not reach code generation." );
    719                 extension( tupleExpr );
    720717                output << "[";
    721718                genCommaList( tupleExpr->get_exprs().begin(), tupleExpr->get_exprs().end() );
    722719                output << "]";
    723         }
    724 
    725         void CodeGenerator::visit( TupleIndexExpr * tupleExpr ) {
    726                 assertf( ! genC, "TupleIndexExpr should not reach code generation." );
    727                 extension( tupleExpr );
    728                 tupleExpr->get_tuple()->accept( *this );
    729                 output << "." << tupleExpr->get_index();
    730720        }
    731721
Note: See TracChangeset for help on using the changeset viewer.