File: import.ha

package info (click to toggle)
hare-update 0.26.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 1,044 kB
  • sloc: makefile: 37; sh: 14
file content (85 lines) | stat: -rw-r--r-- 2,110 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// SPDX-License-Identifier: MPL-2.0
// (c) Hare authors <https://harelang.org>

use vNEXT::ast;
use io;
use memio;

// Unparses a [[hare::ast::import]].
export fn import(
	out: io::handle,
	syn: *synfunc,
	import: *ast::import,
) (size | io::error) = {
	let n = 0z;
	let ctx = context {
		out = out,
		stack = &stack {
			cur = import,
			...
		},
		...
	};
	n += syn(&ctx, "use", synkind::KEYWORD)?;
	n += space(&ctx)?;
	match (import.bindings) {
	case void =>
		n += _ident(&ctx, syn, import.ident, synkind::IDENT)?;
	case let alias: ast::import_alias =>
		n += syn(&ctx, alias, synkind::IMPORT_ALIAS)?;
		n += space(&ctx)?;
		n += syn(&ctx, "=", synkind::OPERATOR)?;
		n += space(&ctx)?;
		n += _ident(&ctx, syn, import.ident, synkind::IDENT)?;
	case let objects: ast::import_members =>
		n += _ident(&ctx, syn, import.ident, synkind::IDENT)?;
		n += syn(&ctx, "::", synkind::IDENT)?;
		n += syn(&ctx, "{", synkind::PUNCTUATION)?;
		for (let i = 0z; i < len(objects); i += 1) {
			n += syn(&ctx, objects[i], synkind::SECONDARY)?;
			if (i + 1 < len(objects)) {
				n += syn(&ctx, ",", synkind::PUNCTUATION)?;
				n += space(&ctx)?;
			};
		};
		n += syn(&ctx, "}", synkind::PUNCTUATION)?;
	case ast::import_wildcard =>
		n += _ident(&ctx, syn, import.ident, synkind::IDENT)?;
		n += syn(&ctx, "::", synkind::IDENT)?;
		n += syn(&ctx, "*", synkind::PUNCTUATION)?;
	};
	n += syn(&ctx, ";", synkind::PUNCTUATION)?;
	return n;
};

@test fn import() void = {
	let tests: [_](ast::import, str) = [
		(ast::import {
			ident = ["foo", "bar", "baz"],
			bindings = void,
			...
		}, "use foo::bar::baz;"),
		(ast::import {
			ident = ["foo"],
			bindings = "bar",
			...
		}, "use bar = foo;"),
		(ast::import {
			ident = ["foo"],
			bindings = ["bar", "baz"],
			...
		},  "use foo::{bar, baz};"),
		(ast::import {
			ident = ["foo", "bar"],
			bindings = ast::import_wildcard,
			...
		},  "use foo::bar::*;"),
	];
	for (let (ast_import, str_import) .. tests) {
		let buf = memio::dynamic();
		import(&buf, &syn_nowrap, &ast_import)!;
		let s = memio::string(&buf)!;
		assert(s == str_import);
		free(s);
	};
};