break;
}
+ case Token_Type_Inserted_Semicolon: {
+ //
+ // This is a special case for -> method calls because they should be able to be split across
+ // multiple lines, unlike all other postfix operators. This is a personal choice, but I think
+ // it reads better than:
+ // iter.as_iter(1 .. 10)->
+ // map(x => x * 2)->
+ // collect()
+ //
+ if (peek_token(1)->type != Token_Type_Right_Arrow) goto factor_parsed;
+
+ consume_token(parser);
+ // fallthrough
+ }
+
case Token_Type_Right_Arrow: {
AstBinaryOp* method_call = make_node(AstBinaryOp, Ast_Kind_Method_Call);
method_call->token = expect_token(parser, Token_Type_Right_Arrow);
}
}
+static BinaryOp binary_op_from_current_token(OnyxParser *parser) {
+ BinaryOp op = binary_op_from_token_type(parser->curr->type);
+
+ if (op == Binary_Op_Count && parser->curr->type == Token_Type_Inserted_Semicolon) {
+ if (peek_token(1)->type == Token_Type_Pipe) {
+ consume_token(parser);
+ op = Binary_Op_Pipe;
+ }
+ }
+
+ return op;
+}
+
static AstTyped* parse_compound_assignment(OnyxParser* parser, AstTyped* lhs) {
if (parser->curr->type != '=') return lhs;
goto expression_done;
}
- bin_op_kind = binary_op_from_token_type(parser->curr->type);
+ bin_op_kind = binary_op_from_current_token(parser);
if (bin_op_kind == Binary_Op_Count) goto expression_done;
if (binop_is_assignment(bin_op_kind) && !assignment_allowed) goto expression_done;
if (bin_op_kind == Binary_Op_Subscript) goto expression_done;
while (!consume_token_if_next(parser, '}')) {
if (parser->hit_unexpected_token) return s_node;
- parse_possible_tag(parser);
+ if (parse_possible_tag(parser)) {
+ consume_token_if_next(parser, ';');
+ }
if (parse_possible_directive(parser, "persist")) {
b32 thread_local = parse_possible_directive(parser, "thread_local");
// Semi-useful shortcut for adding something to an array.
#operator << macro (arr: [..] $T, v: T) {
- #this_package.push(&arr, v)
+ #this_package.push(&arr, v);
}
}
#operator << macro (b: Bucket_Array($T), elem: T) {
- #this_package.push(&b, elem)
+ #this_package.push(&b, elem);
}
pop :: (use b: &Bucket_Array($T)) {
}
#operator << macro (heap: Heap($T), v: T) {
- #this_package.insert(&heap, v)
+ #this_package.insert(&heap, v);
}
remove_top :: (use heap: &Heap) -> heap.T {
}
#operator << macro (set: Set($T), value: T) {
- #this_package.insert(&set, value)
+ #this_package.insert(&set, value);
}
has :: (use set: &Set, value: set.Elem_Type) -> bool {
io.write(writer, ")) {\n");
method_name := slice.find_opt(ff.tags, [it](it.type == customize))
- ->transform(x => misc.any_as(x, customize).symbol_name)
- ?? ff.name;
+ ->transform(x => misc.any_as(x, customize).symbol_name) ?? ff.name;
if name_map != null_proc {
method_name = name_map(method_name);
} elseif it_info.kind == .Struct && it_info->as_struct().constructed_from != cptr {
param_type := it;
name := slice.find_opt(cast_map, [x](x.type == param_type))
- ->expect(tprintf("Structures used as parameter arguments MUST have a definition in the 'cast_map' in '{}'.", method_name))
- .name;
+ ->transform(x => x.name)
+ ->expect(tprintf("Structures used as parameter arguments MUST have a definition in the 'cast_map' in '{}'.", method_name));
io.write_format(&callw, "*({} *) ONYX_PTR(P({}, i32))", name, param_num); // This is dependent on the pointer size
return_type = return_type->info()->as_pointer().to;
type_name := slice.find_opt(cast_map, [x](x.type == return_type))
- ->expect(tprintf("Types used as last argument return values MUST have a definition in the 'cast_map' in '{}'.", method_name))
- .name;
+ ->transform(x => x.name)
+ ->expect(tprintf("Types used as last argument return values MUST have a definition in the 'cast_map' in '{}'.", method_name));
io.write_format(writer, " *({} *) ONYX_PTR(P({}, i32)) = {}({});\n", type_name, param_num, method_name, call_str);
}
equals :: (a, b: CubePos) => {
- return (a.x == b.x)
- && (a.y == b.y)
- && (a.z == b.z)
- && (a.w == b.w);
+ return (a.x == b.x) &&
+ (a.y == b.y) &&
+ (a.z == b.z) &&
+ (a.w == b.w);
}
}
for s in 0 .. input.count - l {
for p in 1 .. l + 1 {
for &prod in production_rules {
- if T[(p - 1) * dim_0 + s * dim_1 + prod.nt1 * dim_2]
- && T[(l - p) * dim_0 + (s + p) * dim_1 + prod.nt2 * dim_2] {
+ if T[(p - 1) * dim_0 + s * dim_1 + prod.nt1 * dim_2] &&
+ T[(l - p) * dim_0 + (s + p) * dim_1 + prod.nt2 * dim_2] {
T[l * dim_0 + s * dim_1 + prod.nt0 * dim_2] = true;
}
}
next_3 := cw[next_2];
destination_cup := w(current_cup - 1);
- while destination_cup == ~~next_1
- || destination_cup == ~~next_2
- || destination_cup == ~~next_3 {
+ while destination_cup == ~~next_1 ||
+ destination_cup == ~~next_2 ||
+ destination_cup == ~~next_3
+ {
destination_cup = w(destination_cup - 1);
}
return 0;
}
- return 3 * (left_val + left->magnitude())
- + 2 * (right_val + right->magnitude());
+ return 3 * (left_val + left->magnitude()) +
+ 2 * (right_val + right->magnitude());
}
parse :: (line: &str) -> &SnailNum {
{ t + t } -> T;
}
-add :: (a, b: [$N]$T) -> [N]T
- where Adder(T), N > 0, N <= 4
+add :: (a, b: [$N]$T) -> [N] T where Adder(T), N > 0, N <= 4
{
return a + b;
}