hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

types.ha (2033B)


      1 // SPDX-License-Identifier: GPL-3.0-only
      2 // (c) Hare authors <https://harelang.org>
      3 
      4 use encoding::utf8;
      5 use fmt;
      6 use fs;
      7 use hare::ast;
      8 use hare::lex;
      9 use hare::module;
     10 use hare::parse;
     11 use hare::parse::doc;
     12 use io;
     13 use os::exec;
     14 
     15 export type haredoc_colors_error = !str;
     16 
     17 export type error = !(lex::error | parse::error |  io::error |
     18 	module::error | exec::error | fs::error | haredoc_colors_error |
     19 	utf8::invalid);
     20 
     21 export fn strerror(err: error) str = {
     22 	match (err) {
     23 	case let err: lex::error =>
     24 		return lex::strerror(err);
     25 	case let err: parse::error =>
     26 		return parse::strerror(err);
     27 	case let err: io::error =>
     28 		return io::strerror(err);
     29 	case let err: module::error =>
     30 		return module::strerror(err);
     31 	case let err: exec::error =>
     32 		return exec::strerror(err);
     33 	case let err: fs::error =>
     34 		return fs::strerror(err);
     35 	case let err: utf8::invalid =>
     36 		return utf8::strerror(err);
     37 	case let err: haredoc_colors_error =>
     38 		def ERRMSG = "Error parsing HAREDOC_COLORS: invalid key";
     39 		if (len(err) == 0) {
     40 			return ERRMSG;
     41 		};
     42 		static let buf: [len(ERRMSG) + 64 + 3]u8 = [0...];
     43 		return fmt::bsprintf(buf, "{} '{}'", ERRMSG, err);
     44 	};
     45 };
     46 
     47 export type context = struct {
     48 	mctx: *module::context,
     49 	ident: ast::ident,
     50 	tags: []str,
     51 	ambiguous: bool,
     52 	parse_errs: []lex::syntax,
     53 	srcs: module::srcset,
     54 	submods: []str,
     55 	summary: summary,
     56 	template: bool,
     57 	show_undocumented: bool,
     58 	readme: (io::file | void),
     59 	out: io::handle,
     60 	pager: (exec::process | void),
     61 };
     62 
     63 export type summary = struct {
     64 	constants: []ast::decl,
     65 	errors: []ast::decl,
     66 	types: []ast::decl,
     67 	globals: []ast::decl,
     68 	funcs: []ast::decl,
     69 };
     70 
     71 export fn finish_summary(s: summary) void = {
     72 	for (let c .. s.constants) {
     73 		free(c.decl as []ast::decl_const);
     74 	};
     75 	free(s.constants);
     76 
     77 	for (let e .. s.errors) {
     78 		free(e.decl as []ast::decl_type);
     79 	};
     80 	free(s.errors);
     81 
     82 	for (let t .. s.types) {
     83 		free(t.decl as []ast::decl_type);
     84 	};
     85 	free(s.types);
     86 
     87 	for (let g .. s.globals) {
     88 		free(g.decl as []ast::decl_global);
     89 	};
     90 	free(s.globals);
     91 
     92 	free(s.funcs);
     93 };