Changeset 90be0cf for src/ResolvExpr


Ignore:
Timestamp:
Oct 24, 2024, 12:50:14 PM (6 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
master
Children:
d031f7f
Parents:
12c4a5f
Message:

Moved some methods out of EnumDecl?. These were calculations and the ast types are supposed to be data focused so they should either go with utility functions or to their use site. I tried the use site.

Location:
src/ResolvExpr
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/ResolvExpr/CandidateFinder.cpp

    r12c4a5f r90be0cf  
    21362136}
    21372137
     2138/// If the target enum is a child, get the offset from the base to the target.
     2139static unsigned findChildOffset(
     2140                const ast::EnumDecl * decl, const ast::EnumDecl * target ) {
     2141        unsigned offset = 0;
     2142        for ( auto inlined : decl->inlinedDecl ) {
     2143                auto childDecl = inlined->base;
     2144                if ( childDecl == target ) {
     2145                        return offset;
     2146                }
     2147                offset += childDecl->members.size();
     2148        }
     2149        SemanticError( decl, "Cannot find the target enum." );
     2150}
     2151
    21382152const ast::Expr * CandidateFinder::makeEnumOffsetCast( const ast::EnumInstType * src,
    21392153        const ast::EnumInstType * dst, const ast::Expr * expr, Cost minCost ) {
     
    21472161                ast::CastExpr * castToDst;
    21482162                if (c<minCost) {
    2149                         unsigned offset = dstDecl->calChildOffset(dstChild.get());
     2163                        unsigned offset = findChildOffset( dstDecl, dstChild.get()->base );
    21502164                        if (offset > 0) {
    21512165                                auto untyped = ast::UntypedExpr::createCall(
    2152                                         expr->location, 
    2153                                         "?+?", 
     2166                                        expr->location,
     2167                                        "?+?",
    21542168                                        { new ast::CastExpr( expr->location,
    21552169                                                expr,
  • TabularUnified src/ResolvExpr/CommonType.cpp

    r12c4a5f r90be0cf  
    636636        void postvisit( const ast::UnionInstType * ) {}
    637637
     638        /// Is the target enum a child of the base enum?
     639        static bool isChildEnum(
     640                        const ast::EnumDecl * decl, const ast::EnumDecl * target ) {
     641                if ( decl == target ) return true;
     642                for ( auto inlined : decl->inlinedDecl ) {
     643                        if ( isChildEnum( inlined->base, target ) ) return true;
     644                }
     645                return false;
     646        }
     647
    638648        void postvisit( const ast::EnumInstType * param ) {
    639649                auto argAsEnumInst = dynamic_cast<const ast::EnumInstType *>(type2);
     
    641651                        const ast::EnumDecl* paramDecl = param->base;
    642652                        const ast::EnumDecl* argDecl = argAsEnumInst->base;
    643                         if (argDecl->isSubTypeOf(paramDecl)) result = param;
     653                        if ( isChildEnum( paramDecl, argDecl ) ) {
     654                                result = param;
     655                        }
    644656                } else if ( param->base && !param->base->isCfa ) {
    645657                        auto basicType = new ast::BasicType( ast::BasicKind::UnsignedInt );
Note: See TracChangeset for help on using the changeset viewer.