hare

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

commit 601ed99a183d50aa7c9db1f9a04c6d1b808e947d
parent 51905aa80860957ba19a9253699aaf581d919e69
Author: Sebastian <sebastian@sebsite.pw>
Date:   Mon, 16 Sep 2024 18:08:16 -0400

hare::parse: redefine vaarg() as vaarg(object-selector, type)

Signed-off-by: Sebastian <sebastian@sebsite.pw>

Diffstat:
Mhare/ast/expr.ha | 13+++++++++----
Mhare/parse/+test/expr_test.ha | 2+-
Mhare/parse/+test/loc.ha | 2+-
Mhare/parse/expr.ha | 9+++++++--
Mhare/unparse/expr.ha | 5++++-
5 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/hare/ast/expr.ha b/hare/ast/expr.ha @@ -421,8 +421,11 @@ export type vastart_expr = void; // A vaarg expression. // -// vaarg(ap) -export type vaarg_expr = *expr; +// vaarg(ap, int) +export type vaarg_expr = struct { + ap: *expr, + _type: *_type, +}; // A vaend expression. // @@ -671,8 +674,10 @@ case let e: *expr => match (v) { case vastart_expr => void; case let v: vaarg_expr => - expr_finish(v); - free(v); + expr_finish(v.ap); + free(v.ap); + type_finish(v._type); + free(v._type); case let v: vaend_expr => expr_finish(v); free(v); diff --git a/hare/parse/+test/expr_test.ha b/hare/parse/+test/expr_test.ha @@ -79,7 +79,7 @@ offset(foo.bar); size(u32); vastart(); - vaarg(va); + vaarg(va, int); vaend(va); }; `); diff --git a/hare/parse/+test/loc.ha b/hare/parse/+test/loc.ha @@ -68,7 +68,7 @@ fn expr_testloc(srcs: str...) void = for (let i = 0z; i < len(srcs); i += 1) { expr_testloc("switch (foo) { case => bar; }"); expr_testloc("foo[bar..baz]"); expr_testloc("&foo"); - expr_testloc("vastart()", "vaarg(ap)", "vaend(ap)"); + expr_testloc("vastart()", "vaarg(ap, int)", "vaend(ap)"); expr_testloc("yield", "yield foo", "yield :foo, bar"); // We want to check the location of nested expressions, so this can't diff --git a/hare/parse/expr.ha b/hare/parse/expr.ha @@ -412,12 +412,17 @@ fn builtin(lexer: *lex::lexer) (ast::expr | error) = { case ltok::VAARG => want(lexer, ltok::VAARG)?; want(lexer, ltok::LPAREN)?; - const expr = alloc(objsel(lexer)?); + const ap = alloc(objsel(lexer)?); + want(lexer, ltok::COMMA)?; + const _type = alloc(_type(lexer)?); want(lexer, ltok::RPAREN)?; return ast::expr { start = tok.2, end = lex::prevloc(lexer), - expr = expr: ast::vaarg_expr: ast::variadic_expr, + expr = ast::vaarg_expr { + ap = ap, + _type = _type, + }, }; case ltok::VAEND => want(lexer, ltok::VAEND)?; diff --git a/hare/unparse/expr.ha b/hare/unparse/expr.ha @@ -446,7 +446,10 @@ fn _expr(ctx: *context, syn: *synfunc, e: *ast::expr) (size | io::error) = { case let e: ast::vaarg_expr => let z = syn(ctx, "vaarg", synkind::KEYWORD)?; z += syn(ctx, "(", synkind::PUNCTUATION)?; - z += _expr(ctx, syn, e)?; + z += _expr(ctx, syn, e.ap)?; + z += syn(ctx, ",", synkind::PUNCTUATION)?; + z += space(ctx)?; + z += __type(ctx, syn, e._type)?; z += syn(ctx, ")", synkind::PUNCTUATION)?; return z; case let e: ast::vaend_expr =>