static bool dot_or_tilde(pass_opt_t* opt, ast_t** astp, bool partial) { typecheck_t* t = &opt->check; ast_t* ast = *astp; // Left is a postfix expression, right is an id. ast_t* left = ast_child(ast); switch(ast_id(left)) { case TK_PACKAGEREF: return package_access(opt, astp); case TK_TYPEREF: return type_access(opt, astp); default: {} } ast_t* type = ast_type(left); if(type == NULL) { ast_error(ast, "invalid left hand side"); return false; } if(!literal_member_access(ast, opt)) return false; // Type already set by literal handler if(ast_type(ast) != NULL) return true; type = ast_type(left); // Literal handling may have changed lhs type assert(type != NULL); if(ast_id(type) == TK_TUPLETYPE) return tuple_access(ast); return member_access(t, ast, partial); }
static bool entity_access(pass_opt_t* opt, ast_t** astp) { ast_t* ast = *astp; // Left is a postfix expression, right is an id. ast_t* left = ast_child(ast); switch(ast_id(left)) { case TK_PACKAGEREF: return package_access(opt, astp); case TK_TYPEREF: return type_access(opt, astp); default: {} } ast_t* type = ast_type(left); if(type == NULL) return false; if(!literal_member_access(ast, opt)) return false; // Type already set by literal handler if(ast_type(ast) != NULL) return true; type = ast_type(left); // Literal handling may have changed lhs type assert(type != NULL); if(ast_id(type) == TK_TUPLETYPE) return tuple_access(opt, ast); return member_access(opt, ast); }