| ... | ... | @@ -769,15 +769,20 @@ pub fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) Inn |
| 769 | 769 | .array_init_comma, |
| 770 | 770 | => return mod.failNode(scope, node, "TODO implement astgen.expr for array literals", .{}), |
| 771 | 771 | |
| 772 | | .struct_init_one, |
| 773 | | .struct_init_one_comma, |
| 774 | | .struct_init_dot_two, |
| 775 | | .struct_init_dot_two_comma, |
| 772 | .struct_init_one, .struct_init_one_comma => { |
| 773 | var fields: [1]ast.Node.Index = undefined; |
| 774 | return structInitExpr(gz, scope, rl, node, tree.structInitOne(&fields, node)); |
| 775 | }, |
| 776 | .struct_init_dot_two, .struct_init_dot_two_comma => { |
| 777 | var fields: [2]ast.Node.Index = undefined; |
| 778 | return structInitExpr(gz, scope, rl, node, tree.structInitDotTwo(&fields, node)); |
| 779 | }, |
| 776 | 780 | .struct_init_dot, |
| 777 | 781 | .struct_init_dot_comma, |
| 782 | => return structInitExpr(gz, scope, rl, node, tree.structInitDot(node)), |
| 778 | 783 | .struct_init, |
| 779 | 784 | .struct_init_comma, |
| 780 | | => return mod.failNode(scope, node, "TODO implement astgen.expr for struct literals", .{}), |
| 785 | => return structInitExpr(gz, scope, rl, node, tree.structInit(node)), |
| 781 | 786 | |
| 782 | 787 | .@"anytype" => return mod.failNode(scope, node, "TODO implement astgen.expr for .anytype", .{}), |
| 783 | 788 | .fn_proto_simple, |
| ... | ... | @@ -788,6 +793,53 @@ pub fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: ast.Node.Index) Inn |
| 788 | 793 | } |
| 789 | 794 | } |
| 790 | 795 | |
| 796 | pub fn structInitExpr( |
| 797 | gz: *GenZir, |
| 798 | scope: *Scope, |
| 799 | rl: ResultLoc, |
| 800 | node: ast.Node.Index, |
| 801 | struct_init: ast.full.StructInit, |
| 802 | ) InnerError!zir.Inst.Ref { |
| 803 | const tree = gz.tree(); |
| 804 | const astgen = gz.astgen; |
| 805 | const mod = astgen.mod; |
| 806 | const gpa = mod.gpa; |
| 807 | switch (rl) { |
| 808 | .discard => return mod.failNode(scope, node, "TODO implement structInitExpr discard", .{}), |
| 809 | .none => return mod.failNode(scope, node, "TODO implement structInitExpr none", .{}), |
| 810 | .ref => unreachable, // struct literal not valid as l-value |
| 811 | .ty => |ty_inst| { |
| 812 | return mod.failNode(scope, node, "TODO implement structInitExpr ty", .{}); |
| 813 | }, |
| 814 | .ptr => |ptr_inst| { |
| 815 | const field_ptr_list = try gpa.alloc(zir.Inst.Index, struct_init.ast.fields.len); |
| 816 | defer gpa.free(field_ptr_list); |
| 817 | |
| 818 | for (struct_init.ast.fields) |field_init, i| { |
| 819 | const name_token = tree.firstToken(field_init) - 2; |
| 820 | const str_index = try gz.identAsString(name_token); |
| 821 | const field_ptr = try gz.addPlNode(.field_ptr, field_init, zir.Inst.Field{ |
| 822 | .lhs = ptr_inst, |
| 823 | .field_name_start = str_index, |
| 824 | }); |
| 825 | field_ptr_list[i] = astgen.refToIndex(field_ptr).?; |
| 826 | _ = try expr(gz, scope, .{ .ptr = field_ptr }, field_init); |
| 827 | } |
| 828 | const validate_inst = try gz.addPlNode(.validate_struct_init_ptr, node, zir.Inst.Block{ |
| 829 | .body_len = @intCast(u32, field_ptr_list.len), |
| 830 | }); |
| 831 | try astgen.extra.appendSlice(gpa, field_ptr_list); |
| 832 | return validate_inst; |
| 833 | }, |
| 834 | .inferred_ptr => |ptr_inst| { |
| 835 | return mod.failNode(scope, node, "TODO implement structInitExpr inferred_ptr", .{}); |
| 836 | }, |
| 837 | .block_ptr => |block_gz| { |
| 838 | return mod.failNode(scope, node, "TODO implement structInitExpr block", .{}); |
| 839 | }, |
| 840 | } |
| 841 | } |
| 842 | |
| 791 | 843 | pub fn comptimeExpr( |
| 792 | 844 | gz: *GenZir, |
| 793 | 845 | scope: *Scope, |
| ... | ... | @@ -1285,6 +1337,7 @@ fn blockExprStmts( |
| 1285 | 1337 | .resolve_inferred_alloc, |
| 1286 | 1338 | .repeat, |
| 1287 | 1339 | .repeat_inline, |
| 1340 | .validate_struct_init_ptr, |
| 1288 | 1341 | => break :b true, |
| 1289 | 1342 | } |
| 1290 | 1343 | } else switch (maybe_unused_result) { |
| ... | ... | @@ -1959,7 +2012,8 @@ pub fn fieldAccess( |
| 1959 | 2012 | rl: ResultLoc, |
| 1960 | 2013 | node: ast.Node.Index, |
| 1961 | 2014 | ) InnerError!zir.Inst.Ref { |
| 1962 | | const mod = gz.astgen.mod; |
| 2015 | const astgen = gz.astgen; |
| 2016 | const mod = astgen.mod; |
| 1963 | 2017 | const tree = gz.tree(); |
| 1964 | 2018 | const main_tokens = tree.nodes.items(.main_token); |
| 1965 | 2019 | const node_datas = tree.nodes.items(.data); |
| ... | ... | @@ -1967,10 +2021,7 @@ pub fn fieldAccess( |
| 1967 | 2021 | const object_node = node_datas[node].lhs; |
| 1968 | 2022 | const dot_token = main_tokens[node]; |
| 1969 | 2023 | const field_ident = dot_token + 1; |
| 1970 | | const string_bytes = &gz.astgen.string_bytes; |
| 1971 | | const str_index = @intCast(u32, string_bytes.items.len); |
| 1972 | | try mod.appendIdentStr(scope, field_ident, string_bytes); |
| 1973 | | try string_bytes.append(mod.gpa, 0); |
| 2024 | const str_index = try gz.identAsString(field_ident); |
| 1974 | 2025 | switch (rl) { |
| 1975 | 2026 | .ref => return gz.addPlNode(.field_ptr, node, zir.Inst.Field{ |
| 1976 | 2027 | .lhs = try expr(gz, scope, .ref, object_node), |
| ... | ... | @@ -2031,11 +2082,7 @@ fn simpleStrTok( |
| 2031 | 2082 | node: ast.Node.Index, |
| 2032 | 2083 | op_inst_tag: zir.Inst.Tag, |
| 2033 | 2084 | ) InnerError!zir.Inst.Ref { |
| 2034 | | const mod = gz.astgen.mod; |
| 2035 | | const string_bytes = &gz.astgen.string_bytes; |
| 2036 | | const str_index = @intCast(u32, string_bytes.items.len); |
| 2037 | | try mod.appendIdentStr(scope, ident_token, string_bytes); |
| 2038 | | try string_bytes.append(mod.gpa, 0); |
| 2085 | const str_index = try gz.identAsString(ident_token); |
| 2039 | 2086 | const result = try gz.addStrTok(op_inst_tag, str_index, ident_token); |
| 2040 | 2087 | return rvalue(gz, scope, rl, result, node); |
| 2041 | 2088 | } |