comptime eval

This commit is contained in:
2026-07-02 21:31:53 +02:00
parent b94687c30a
commit e00a4e929a
8 changed files with 500 additions and 36 deletions
+32 -18
View File
@@ -914,7 +914,7 @@ is_simple_range_bound :: proc(expr: ast.Expr) -> bool {
prefix_binding_power :: proc(kind: token.Kind) -> (right: int, ok: bool) {
#partial switch kind {
case .Minus, .Ampersand, .Bang, .Keyword_Try:
case .Minus, .Ampersand, .Bang, .Dollar, .Keyword_Try:
return 20, true
}
return 0, false
@@ -931,24 +931,38 @@ parse_expression_bp :: proc(parser: ^Parser, minimum_binding_power, nesting: int
left := ast.INVALID_EXPR
if right_power, ok := prefix_binding_power(current(parser).kind); ok {
operator := advance(parser)
if parser.delimiter_depth > 0 {
skip_newlines(parser)
if operator.kind == .Dollar && current(parser).kind == .Left_Brace {
body := parse_block(parser)
end := previous(parser)
left = add_expr(parser, ast.Expr{
kind = .Comptime,
span = span_from(operator.span, end.span),
body = body,
left = ast.INVALID_EXPR,
right = ast.INVALID_EXPR,
diagnostic = source.INVALID_DIAGNOSTIC,
})
} else {
if parser.delimiter_depth > 0 {
skip_newlines(parser)
}
operand := parse_expression_bp(parser, right_power, nesting+1)
operand_expr := parser.module.exprs[operand]
prefix_kind := ast.Expr_Kind.Negate
#partial switch operator.kind {
case .Ampersand: prefix_kind = .Address
case .Bang: prefix_kind = .Not
case .Dollar: prefix_kind = .Comptime
case .Keyword_Try: prefix_kind = .Try
}
left = add_expr(parser, ast.Expr{
kind = prefix_kind,
span = span_from(operator.span, operand_expr.span),
left = operand,
right = ast.INVALID_EXPR,
diagnostic = source.INVALID_DIAGNOSTIC,
})
}
operand := parse_expression_bp(parser, right_power, nesting+1)
operand_expr := parser.module.exprs[operand]
prefix_kind := ast.Expr_Kind.Negate
#partial switch operator.kind {
case .Ampersand: prefix_kind = .Address
case .Bang: prefix_kind = .Not
case .Keyword_Try: prefix_kind = .Try
}
left = add_expr(parser, ast.Expr{
kind=prefix_kind,
span=span_from(operator.span, operand_expr.span),
left=operand,
right=ast.INVALID_EXPR,
diagnostic=source.INVALID_DIAGNOSTIC,
})
} else {
left = parse_primary(parser, nesting)
}