Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Validate/Autogen.cpp

    r544deb9 r59c8dff  
    445445
    446446                auto * paramType = ast::deepCopy( member->get_type() );
    447                 erase_if( paramType->attributes, []( ast::Attribute const * attr ){
    448                         return !attr->isValidOnFuncParam();
    449                 } );
     447                paramType->attributes.clear();
    450448                ast::ObjectDecl * param = new ast::ObjectDecl(
    451449                        getLocation(), member->name, paramType );
     
    803801}
    804802
     803struct PseudoFuncGenerateRoutine final :
     804                public ast::WithDeclsToAdd<>,
     805                public ast::WithShortCircuiting {
     806        void previsit( const ast::EnumDecl * enumDecl );
     807};
     808
     809void PseudoFuncGenerateRoutine::previsit( const ast::EnumDecl * enumDecl ) {
     810        const CodeLocation& location = enumDecl->location;
     811        if ( enumDecl->members.size() == 0 || !enumDecl->base || enumDecl->name == "" ) return;
     812
     813        std::vector<ast::ptr<ast::Init>> inits;
     814        std::vector<ast::ptr<ast::Init>> labels;
     815        for ( const ast::Decl * mem: enumDecl->members ) {
     816                auto memAsObjectDecl = dynamic_cast< const ast::ObjectDecl * >( mem );
     817                inits.emplace_back( memAsObjectDecl->init );
     818                labels.emplace_back( new ast::SingleInit(
     819                        location, ast::ConstantExpr::from_string(location, mem->name) ) );
     820        }
     821        auto init = new ast::ListInit( location, std::move( inits ) );
     822        auto label_strings = new ast::ListInit( location, std::move(labels) );
     823        auto values = new ast::ObjectDecl(
     824                location,
     825                "__enum_values_"+enumDecl->name,
     826                new ast::ArrayType(
     827                        // new ast::PointerType( new ast::BasicType{ ast::BasicType::Char} ),
     828                        enumDecl->base,
     829                        ast::ConstantExpr::from_int( location, enumDecl->members.size() ),
     830                        ast::LengthFlag::FixedLen, ast::DimensionFlag::DynamicDim
     831                )
     832                ,init
     833                ,
     834                ast::Storage::Static,
     835                ast::Linkage::AutoGen
     836        );
     837        auto label_arr = new ast::ObjectDecl(
     838                location,
     839                "__enum_labels_"+enumDecl->name,
     840                new ast::ArrayType(
     841                        new ast::PointerType( new ast::BasicType{ ast::BasicType::Char} ),
     842                        ast::ConstantExpr::from_int( location, enumDecl->members.size() ),
     843                        ast::LengthFlag::FixedLen, ast::DimensionFlag::DynamicDim
     844                ),
     845                label_strings,
     846                ast::Storage::Static,
     847                ast::Linkage::AutoGen
     848        );
     849
     850        declsToAddAfter.push_back( values );
     851        declsToAddAfter.push_back( label_arr );
     852}
     853
    805854} // namespace
    806855
    807856void autogenerateRoutines( ast::TranslationUnit & translationUnit ) {
    808857        ast::Pass<AutogenerateRoutines>::run( translationUnit );
     858        // ast::Pass<PseudoFuncGenerateRoutine>::run( translationUnit );
    809859}
    810860
Note: See TracChangeset for help on using the changeset viewer.