Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
Arquivo: pass.c Projeto: ozra/ponyc
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;
}