authorgravatar for john.schmidt.h@gmail.comJohn Schmidt <john.schmidt.h@gmail.com> 2022-03-20 13:47:03+01:00
committergravatar for john.schmidt.h@gmail.comJohn Schmidt <john.schmidt.h@gmail.com> 2022-04-03 13:49:34+02:00
loge4d427f12e2052e9bcd6af40e7ddbc4e544451e6
treef7f634c62d64cd5d174f193af0f12101de1967e1
parentb922caf1691111e5c23f01afbe1f1c9b5104807b

refactor: add Sema.addFieldErrNote


1 files changed, 18 insertions(+), 12 deletions(-)

src/Sema.zig+18-12
...@@ -1589,6 +1589,21 @@ fn errNote(...@@ -1589,6 +1589,21 @@ fn errNote(
1589 return sema.mod.errNoteNonLazy(src.toSrcLoc(block.src_decl), parent, format, args);1589 return sema.mod.errNoteNonLazy(src.toSrcLoc(block.src_decl), parent, format, args);
1590}1590}
15911591
1592fn addFieldErrNote(
1593 sema: *Sema,
1594 block: *Block,
1595 container_ty: Type,
1596 field_index: usize,
1597 parent: *Module.ErrorMsg,
1598 comptime format: []const u8,
1599 args: anytype,
1600) !void {
1601 const decl = container_ty.getOwnerDecl();
1602 const tree = try sema.getAstTree(block);
1603 const field_src = enumFieldSrcLoc(decl, tree.*, container_ty.getNodeOffset(), field_index);
1604 try sema.mod.errNoteNonLazy(field_src.toSrcLoc(decl), parent, format, args);
1605}
1606
1592fn errMsg(1607fn errMsg(
1593 sema: *Sema,1608 sema: *Sema,
1594 block: *Block,1609 block: *Block,
...@@ -19603,10 +19618,7 @@ fn coerceEnumToUnion(...@@ -19603,10 +19618,7 @@ fn coerceEnumToUnion(
19603 });19618 });
19604 errdefer msg.destroy(sema.gpa);19619 errdefer msg.destroy(sema.gpa);
1960519620
19606 const tree = try sema.getAstTree(block);19621 try sema.addFieldErrNote(block, union_ty, field_index, msg, "field '{s}' declared here", .{field_name});
19607 const union_decl = union_obj.owner_decl;
19608 const field_src = enumFieldSrcLoc(union_decl, tree.*, union_obj.node_offset, field_index);
19609 try sema.mod.errNoteNonLazy(field_src.toSrcLoc(union_decl), msg, "field '{s}' declared here", .{field_name});
19610 try sema.addDeclaredHereNote(msg, union_ty);19622 try sema.addDeclaredHereNote(msg, union_ty);
19611 break :msg msg;19623 break :msg msg;
19612 };19624 };
...@@ -19648,15 +19660,12 @@ fn coerceEnumToUnion(...@@ -19648,15 +19660,12 @@ fn coerceEnumToUnion(
19648 );19660 );
19649 errdefer msg.destroy(sema.gpa);19661 errdefer msg.destroy(sema.gpa);
1965019662
19651 const tree = try sema.getAstTree(block);
19652 const union_decl = union_obj.owner_decl;
19653 var it = union_obj.fields.iterator();19663 var it = union_obj.fields.iterator();
19654 var field_index: usize = 0;19664 var field_index: usize = 0;
19655 while (it.next()) |field| {19665 while (it.next()) |field| {
19656 const field_name = field.key_ptr.*;19666 const field_name = field.key_ptr.*;
19657 const field_ty = field.value_ptr.ty;19667 const field_ty = field.value_ptr.ty;
19658 const field_src = enumFieldSrcLoc(union_decl, tree.*, union_obj.node_offset, field_index);19668 try sema.addFieldErrNote(block, union_ty, field_index, msg, "field '{s}' has type '{}'", .{ field_name, field_ty.fmt(target) });
19659 try sema.mod.errNoteNonLazy(field_src.toSrcLoc(union_decl), msg, "field '{s}' has type '{}'", .{ field_name, field_ty.fmt(target) });
19660 field_index += 1;19669 field_index += 1;
19661 }19670 }
19662 try sema.addDeclaredHereNote(msg, union_ty);19671 try sema.addDeclaredHereNote(msg, union_ty);
...@@ -22229,12 +22238,9 @@ fn semaUnionFields(block: *Block, mod: *Module, union_obj: *Module.Union) Compil...@@ -22229,12 +22238,9 @@ fn semaUnionFields(block: *Block, mod: *Module, union_obj: *Module.Union) Compil
22229 errdefer msg.destroy(sema.gpa);22238 errdefer msg.destroy(sema.gpa);
2223022239
22231 const enum_ty = union_obj.tag_ty;22240 const enum_ty = union_obj.tag_ty;
22232 const tree = try sema.getAstTree(block);
22233 const enum_decl = enum_ty.getOwnerDecl();
22234 for (names.keys()) |field_name| {22241 for (names.keys()) |field_name| {
22235 const field_index = enum_ty.enumFieldIndex(field_name).?;22242 const field_index = enum_ty.enumFieldIndex(field_name).?;
22236 const field_src = enumFieldSrcLoc(enum_decl, tree.*, enum_ty.getNodeOffset(), field_index);22243 try sema.addFieldErrNote(block, enum_ty, field_index, msg, "field '{s}' missing, declared here", .{field_name});
22237 try sema.mod.errNoteNonLazy(field_src.toSrcLoc(enum_decl), msg, "field '{s}' missing, declared here", .{field_name});
22238 }22244 }
22239 try sema.addDeclaredHereNote(msg, union_obj.tag_ty);22245 try sema.addDeclaredHereNote(msg, union_obj.tag_ty);
22240 break :msg msg;22246 break :msg msg;