// Sort out symbol table for copied method body static ast_result_t rescope(ast_t** astp, pass_opt_t* options) { (void)options; ast_t* ast = *astp; if(ast_has_scope(ast)) ast_clear_local(ast); switch(ast_id(ast)) { case TK_FVAR: case TK_FLET: case TK_PARAM: case TK_TYPEPARAM: assert(ast_child(ast) != NULL); ast_set(ast, ast_name(ast_child(ast)), ast, SYM_DEFINED); break; case TK_LET: case TK_VAR: { ast_t* scope = ast_parent(ast); ast_t* id = ast_child(ast); ast_set(scope, ast_name(id), id, SYM_DEFINED); break; } default: {} } return AST_OK; }
// Sort out symbol table for copied method body. static ast_result_t rescope(ast_t** astp, pass_opt_t* options) { (void)options; ast_t* ast = *astp; if(ast_has_scope(ast)) ast_clear_local(ast); switch(ast_id(ast)) { case TK_FVAR: case TK_FLET: case TK_EMBED: case TK_PARAM: case TK_TYPEPARAM: { assert(ast_child(ast) != NULL); ast_set(ast, ast_name(ast_child(ast)), ast, SYM_DEFINED, true); break; } case TK_LET: case TK_VAR: { ast_t* scope = ast_parent(ast); ast_t* id = ast_child(ast); ast_set(scope, ast_name(id), id, SYM_UNDEFINED, true); break; } case TK_MATCH_CAPTURE: { ast_t* scope = ast_parent(ast); ast_t* id = ast_child(ast); ast_set(scope, ast_name(id), id, SYM_DEFINED, true); break; } case TK_TYPEPARAMREF: { assert(ast_child(ast) != NULL); ast_t* def = ast_get(ast, ast_name(ast_child(ast)), NULL); ast_setdata(ast, def); break; } default: {} } return AST_OK; }