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