feature. See also
. The project being documented here (as the example) is the Zig library itself.
Walk.scanDecls
fn scanDecls(w: *Walk, members: []const Ast.Node.Index, action: ScanDeclsAction) Error!void
File
Code
fn scanDecls(w: *Walk, members: []const Ast.Node.Index, action: ScanDeclsAction) Error!void {
const ast = w.ast;
const gpa = w.gpa;
for (members) |member_node| {
const name_token = switch (ast.nodeTag(member_node)) {
.global_var_decl,
.local_var_decl,
.simple_var_decl,
.aligned_var_decl,
=> ast.nodeMainToken(member_node) + 1,
.fn_proto_simple,
.fn_proto_multi,
.fn_proto_one,
.fn_proto,
.fn_decl,
=> ast.nodeMainToken(member_node) + 1,
else => continue,
};
assert(ast.tokenTag(name_token) == .identifier);
const name_bytes = ast.tokenSlice(name_token);
switch (action) {
.add => {
try w.unreferenced_globals.put(gpa, name_bytes, member_node);
const gop = try w.in_scope_names.getOrPut(gpa, name_bytes);
if (!gop.found_existing) gop.value_ptr.* = 0;
gop.value_ptr.* += 1;
},
.remove => {
const entry = w.in_scope_names.getEntry(name_bytes).?;
if (entry.value_ptr.* <= 1) {
assert(w.in_scope_names.swapRemove(name_bytes));
} else {
entry.value_ptr.* -= 1;
}
},
}
}
}