diff options
| author | Veikka Tuominen <git@vexu.eu> | 2023-01-05 21:37:30 +0200 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2023-01-05 22:03:32 +0200 |
| commit | f2faa303a541f5adddbba26d04dc2749991e0075 (patch) | |
| tree | 5761621aa62e2a36551a33138c4f90a38f3795c0 /src/Module.zig | |
| parent | 8c4727f9ab61e4c99ab2a00f5751f9b11d274fbe (diff) | |
| download | zig-f2faa303a541f5adddbba26d04dc2749991e0075.tar.gz zig-f2faa303a541f5adddbba26d04dc2749991e0075.zip | |
Sema: handle enum expressions referencing local variables
Closes #12272
Diffstat (limited to 'src/Module.zig')
| -rw-r--r-- | src/Module.zig | 45 |
1 files changed, 44 insertions, 1 deletions
diff --git a/src/Module.zig b/src/Module.zig index bf54fc01fd..0853a2e204 100644 --- a/src/Module.zig +++ b/src/Module.zig @@ -1194,6 +1194,49 @@ pub const EnumFull = struct { .lazy = LazySrcLoc.nodeOffset(0), }; } + + pub fn fieldSrcLoc(e: EnumFull, mod: *Module, query: FieldSrcQuery) SrcLoc { + @setCold(true); + const owner_decl = mod.declPtr(e.owner_decl); + const file = owner_decl.getFileScope(); + const tree = file.getTree(mod.gpa) catch |err| { + // In this case we emit a warning + a less precise source location. + log.warn("unable to load {s}: {s}", .{ + file.sub_file_path, @errorName(err), + }); + return e.srcLoc(mod); + }; + const node = owner_decl.relativeToNodeIndex(0); + const node_tags = tree.nodes.items(.tag); + switch (node_tags[node]) { + .container_decl, + .container_decl_trailing, + => return queryFieldSrc(tree.*, query, file, tree.containerDecl(node)), + .container_decl_two, .container_decl_two_trailing => { + var buffer: [2]Ast.Node.Index = undefined; + return queryFieldSrc(tree.*, query, file, tree.containerDeclTwo(&buffer, node)); + }, + .container_decl_arg, + .container_decl_arg_trailing, + => return queryFieldSrc(tree.*, query, file, tree.containerDeclArg(node)), + + .tagged_union, + .tagged_union_trailing, + => return queryFieldSrc(tree.*, query, file, tree.taggedUnion(node)), + .tagged_union_two, .tagged_union_two_trailing => { + var buffer: [2]Ast.Node.Index = undefined; + return queryFieldSrc(tree.*, query, file, tree.taggedUnionTwo(&buffer, node)); + }, + .tagged_union_enum_tag, + .tagged_union_enum_tag_trailing, + => return queryFieldSrc(tree.*, query, file, tree.taggedUnionEnumTag(node)), + + .root => return queryFieldSrc(tree.*, query, file, tree.containerDeclRoot()), + + // This struct was generated using @Type + else => return e.srcLoc(mod), + } + } }; pub const Union = struct { @@ -6171,7 +6214,7 @@ pub const PeerTypeCandidateSrc = union(enum) { const FieldSrcQuery = struct { index: usize, - range: enum { name, type, value, alignment }, + range: enum { name, type, value, alignment } = .name, }; fn queryFieldSrc( |
