ast_t* package_load(ast_t* from, const char* path, pass_opt_t* options) { const char* magic = find_magic_package(path); const char* name = path; if(magic == NULL) { // Lookup (and hence normalise) path name = find_path(from, path); if(name == NULL) return NULL; } ast_t* program = ast_nearest(from, TK_PROGRAM); ast_t* package = ast_get(program, name, NULL); if(package != NULL) // Package already loaded return package; package = create_package(program, name); if(report_build) printf("Building %s\n", path); if(magic != NULL) { if(!parse_source_code(package, magic, options)) return NULL; } else { if(!parse_files_in_dir(package, name, options)) return NULL; } if(ast_child(package) == NULL) { ast_error(package, "no source files in package '%s'", path); return NULL; } if(!package_passes(package, options)) return NULL; return package; }
bool type_passes(ast_t* type, pass_opt_t* options) { ast_t* module = ast_parent(type); ast_t* package = ast_parent(module); frame_push(&options->check, NULL); frame_push(&options->check, package); frame_push(&options->check, module); bool ok = package_passes(type, options); if(ok) ok = program_passes(type, options); frame_pop(&options->check); frame_pop(&options->check); frame_pop(&options->check); return ok; }