Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Convert.cpp

    r19e567dd r675d816  
    1616#include "Convert.hpp"
    1717
     18#include "AST/Pass.hpp"
     19
    1820#include "AST/Attribute.hpp"
    1921#include "AST/Decl.hpp"
     
    2123#include "AST/Init.hpp"
    2224#include "AST/Stmt.hpp"
    23 #include "AST/TypeSubstitution.hpp"
     25
    2426
    2527#include "SynTree/Attribute.h"
    2628#include "SynTree/Declaration.h"
    27 #include "SynTree/TypeSubstitution.h"
    2829
    2930//================================================================================================
     
    412413        }
    413414
    414         TypeSubstitution * convertTypeSubstitution(const ast::TypeSubstitution * src) {
    415 
    416                 TypeSubstitution *rslt = new TypeSubstitution();
    417 
    418                 for (decltype(src->begin()) src_i = src->begin(); src_i != src->end(); src_i++) {
    419                         rslt->add( src_i->first,
    420                                    get<Type>().accept1(src_i->second) );
    421                 }
    422 
    423                 for (decltype(src->beginVar()) src_i = src->beginVar(); src_i != src->endVar(); src_i++) {
    424                         rslt->addVar( src_i->first,
    425                                       get<Expression>().accept1(src_i->second) );
    426                 }
    427 
    428                 return rslt;
    429         }
    430 
    431         void convertInferUnion(std::map<UniqueId,ParamEntry> &tgtInferParams,
    432                                                    std::vector<UniqueId>         &tgtResnSlots,
    433                                                    const ast::Expr::InferUnion   &srcInferred ) {
    434 
    435                 assert( tgtInferParams.empty() );
    436                 assert( tgtResnSlots.empty() );
    437 
    438                 if ( srcInferred.mode == ast::Expr::InferUnion::Params ) {
    439                         const ast::InferredParams &srcParams = srcInferred.inferParamsConst();
    440                         for (auto srcParam : srcParams) {
    441                                 tgtInferParams[srcParam.first] = ParamEntry(
    442                                         srcParam.second.decl,
    443                                         get<Type>().accept1(srcParam.second.actualType),
    444                                         get<Type>().accept1(srcParam.second.formalType),
    445                                         get<Expression>().accept1(srcParam.second.expr)
    446                                 );
    447                         }
    448                 } else if ( srcInferred.mode == ast::Expr::InferUnion::Slots  ) {
    449                         const ast::ResnSlots &srcSlots = srcInferred.resnSlotsConst();
    450                         for (auto srcSlot : srcSlots) {
    451                                 tgtResnSlots.push_back(srcSlot);
    452                         }
    453                 }
    454         }
    455 
    456         Expression * visitBaseExpr(const ast::Expr * src, Expression * tgt) {
    457 
    458                 tgt->location = src->location;
    459 
    460                 tgt->result = get<Type>().accept1(src->result);
    461                 tgt->env    = convertTypeSubstitution(src->env);
    462 
    463                 tgt->extension = src->extension;
    464                 convertInferUnion(tgt->inferParams, tgt->resnSlots, src->inferred);
    465 
    466                 return tgt;
    467         }
    468 
    469415        const ast::Expr * visit( const ast::ApplicationExpr * node ) override final {
    470                 auto expr = visitBaseExpr( node,
    471                         new ApplicationExpr(
    472                                 get<Expression>().accept1(node->func),
    473                                 get<Expression>().acceptL(node->args)
    474                         )
    475                 );
    476                 this->node = expr;
     416                (void)node;
    477417                return nullptr;
    478418        }
    479419
    480420        const ast::Expr * visit( const ast::UntypedExpr * node ) override final {
    481                 auto expr = visitBaseExpr( node,
    482                         new UntypedExpr(
    483                                 get<Expression>().accept1(node->func),
    484                                 get<Expression>().acceptL(node->args)
    485                         )
    486                 );
    487                 this->node = expr;
     421                (void)node;
    488422                return nullptr;
    489423        }
    490424
    491425        const ast::Expr * visit( const ast::NameExpr * node ) override final {
    492                 auto expr = visitBaseExpr( node,
    493                         new NameExpr(
    494                                 node->name
    495                         )
    496                 );
    497                 this->node = expr;
     426                (void)node;
    498427                return nullptr;
    499428        }
     
    12431172        }
    12441173
    1245         ast::TypeSubstitution * convertTypeSubstitution(const TypeSubstitution * old) {
    1246 
    1247                 ast::TypeSubstitution *rslt = new ast::TypeSubstitution();
    1248 
    1249                 for (decltype(old->begin()) old_i = old->begin(); old_i != old->end(); old_i++) {
    1250                         rslt->add( old_i->first,
    1251                                    getAccept1<ast::Type>(old_i->second) );
    1252                 }
    1253 
    1254                 for (decltype(old->beginVar()) old_i = old->beginVar(); old_i != old->endVar(); old_i++) {
    1255                         rslt->addVar( old_i->first,
    1256                                       getAccept1<ast::Expr>(old_i->second) );
    1257                 }
    1258 
    1259                 return rslt;
    1260         }
    1261 
    1262         void convertInferUnion(ast::Expr::InferUnion               &newInferred,
    1263                                                    const std::map<UniqueId,ParamEntry> &oldInferParams,
    1264                                                    const std::vector<UniqueId>         &oldResnSlots) {
    1265 
    1266                 assert( oldInferParams.empty() || oldResnSlots.empty() );
    1267                 assert( newInferred.mode == ast::Expr::InferUnion::Empty );
    1268 
    1269                 if ( !oldInferParams.empty() ) {
    1270                         ast::InferredParams &tgt = newInferred.inferParams();
    1271                         for (auto old : oldInferParams) {
    1272                                 tgt[old.first] = ast::ParamEntry(
    1273                                         old.second.decl,
    1274                                         getAccept1<ast::Type>(old.second.actualType),
    1275                                         getAccept1<ast::Type>(old.second.formalType),
    1276                                         getAccept1<ast::Expr>(old.second.expr)
    1277                                 );
    1278                         }
    1279                 } else if ( !oldResnSlots.empty() ) {
    1280                         ast::ResnSlots &tgt = newInferred.resnSlots();
    1281                         for (auto old : oldResnSlots) {
    1282                                 tgt.push_back(old);
    1283                         }
    1284                 }
    1285         }
    1286 
    1287         ast::Expr * visitBaseExpr(Expression * old, ast::Expr * nw) {
    1288 
    1289                 nw->result = GET_ACCEPT_1(result, Type);
    1290                 nw->env    = convertTypeSubstitution(old->env);
    1291 
    1292                 nw->extension = old->extension;
    1293                 convertInferUnion(nw->inferred, old->inferParams, old->resnSlots);
    1294 
    1295                 return nw;
    1296         }
    1297 
    1298         virtual void visit( ApplicationExpr * old ) override final {
    1299                 this->node = visitBaseExpr( old,
    1300                         new ast::ApplicationExpr(
    1301                                 old->location,
    1302                                 GET_ACCEPT_1(function, Expr),
    1303                                 GET_ACCEPT_V(args, Expr)
    1304                         )
    1305                 );
    1306         }
    1307 
    1308         virtual void visit( UntypedExpr * old ) override final {
    1309                 this->node = visitBaseExpr( old,
    1310                         new ast::UntypedExpr(
    1311                                 old->location,
    1312                                 GET_ACCEPT_1(function, Expr),
    1313                                 GET_ACCEPT_V(args, Expr)
    1314                         )
    1315                 );
    1316         }
    1317 
    1318         virtual void visit( NameExpr * old ) override final {
    1319                 this->node = visitBaseExpr( old,
    1320                         new ast::NameExpr(
    1321                                 old->location,
    1322                                 old->get_name()
    1323                         )
    1324                 );
    1325         }
    1326 
    1327         virtual void visit( CastExpr * old ) override final {
    1328                 this->node = visitBaseExpr( old,
    1329                         new ast::CastExpr(
    1330                                 old->location,
    1331                                 nullptr, // cast's "to" type is expr's result type; converted in visitBaseExpr
    1332                                 old->isGenerated ? ast::GeneratedCast : ast::ExplicitCast
    1333                         )
    1334                 );
     1174        virtual void visit( ApplicationExpr * ) override final {
     1175
     1176        }
     1177
     1178        virtual void visit( UntypedExpr * ) override final {
     1179
     1180        }
     1181
     1182        virtual void visit( NameExpr * ) override final {
     1183
     1184        }
     1185
     1186        virtual void visit( CastExpr * ) override final {
     1187
    13351188        }
    13361189
Note: See TracChangeset for help on using the changeset viewer.