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 };