feat: support checked explicit sentinel slices

This commit is contained in:
2026-10-23 11:18:08 +02:00
parent 7cb4ace0fa
commit 8ab5b71a0c
7 changed files with 465 additions and 31 deletions
+10 -2
View File
@@ -1450,6 +1450,7 @@ parse_expression_bp :: proc(parser: ^Parser, minimum_binding_power, nesting: int
skip_newlines(parser)
start_expr := ast.INVALID_EXPR
end_expr := ast.INVALID_EXPR
sentinel_expr := ast.INVALID_EXPR
slicing := false
if _, ok := allow(parser, .Range); ok {
slicing = true
@@ -1463,12 +1464,19 @@ parse_expression_bp :: proc(parser: ^Parser, minimum_binding_power, nesting: int
}
}
skip_newlines(parser)
if slicing && current(parser).kind != .Right_Bracket {
if slicing && current(parser).kind != .Right_Bracket && current(parser).kind != .Semicolon {
parser.range_disabled += 1
end_expr = parse_expression_bp(parser, 0, nesting+1)
parser.range_disabled -= 1
skip_newlines(parser)
}
if slicing {
if _, ok := allow(parser, .Semicolon); ok {
skip_newlines(parser)
sentinel_expr = parse_expression_bp(parser, 0, nesting+1)
skip_newlines(parser)
}
}
end_token, ok := allow(parser, .Right_Bracket)
if !ok {
source.add(parser.diagnostics, current(parser).span, "expected ']' after index or slice")
@@ -1485,7 +1493,7 @@ parse_expression_bp :: proc(parser: ^Parser, minimum_binding_power, nesting: int
span=span_from(left_expr.span, end_token.span),
args=args,
left=left,
right=ast.INVALID_EXPR,
right=sentinel_expr,
diagnostic=source.INVALID_DIAGNOSTIC,
})
} else {