containerMember
Function parameters
Parameters
- gz:*GenZir
- scope:*Scope
- wip_members:*WipMembers
- member_node:Ast.Node.Index
Functions in this namespace
Functions
Source
Implementation
fn containerMember(
gz: *GenZir,
scope: *Scope,
wip_members: *WipMembers,
member_node: Ast.Node.Index,
) InnerError!ContainerMemberResult {
const astgen = gz.astgen;
const tree = astgen.tree;
switch (tree.nodeTag(member_node)) {
.container_field_init,
.container_field_align,
.container_field,
=> return ContainerMemberResult{ .field = tree.fullContainerField(member_node).? },
.fn_proto,
.fn_proto_multi,
.fn_proto_one,
.fn_proto_simple,
.fn_decl,
=> {
var buf: [1]Ast.Node.Index = undefined;
const full = tree.fullFnProto(&buf, member_node).?;
const body: Ast.Node.OptionalIndex = if (tree.nodeTag(member_node) == .fn_decl)
tree.nodeData(member_node).node_and_node[1].toOptional()
else
.none;
const prev_decl_index = wip_members.decl_index;
astgen.fnDecl(gz, scope, wip_members, member_node, body, full) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
error.AnalysisFail => {
wip_members.decl_index = prev_decl_index;
try addFailedDeclaration(
wip_members,
gz,
.@"const",
try astgen.identAsString(full.name_token.?),
full.ast.proto_node,
full.visib_token != null,
);
},
};
},
.global_var_decl,
.local_var_decl,
.simple_var_decl,
.aligned_var_decl,
=> {
const full = tree.fullVarDecl(member_node).?;
const prev_decl_index = wip_members.decl_index;
astgen.globalVarDecl(gz, scope, wip_members, member_node, full) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
error.AnalysisFail => {
wip_members.decl_index = prev_decl_index;
try addFailedDeclaration(
wip_members,
gz,
.@"const", // doesn't really matter
try astgen.identAsString(full.ast.mut_token + 1),
member_node,
full.visib_token != null,
);
},
};
},
.@"comptime" => {
const prev_decl_index = wip_members.decl_index;
astgen.comptimeDecl(gz, scope, wip_members, member_node) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
error.AnalysisFail => {
wip_members.decl_index = prev_decl_index;
try addFailedDeclaration(
wip_members,
gz,
.@"comptime",
.empty,
member_node,
false,
);
},
};
},
.test_decl => {
const prev_decl_index = wip_members.decl_index;
// We need to have *some* decl here so that the decl count matches what's expected.
// Since it doesn't strictly matter *what* this is, let's save ourselves the trouble
// of duplicating the test name logic, and just assume this is an unnamed test.
astgen.testDecl(gz, scope, wip_members, member_node) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
error.AnalysisFail => {
wip_members.decl_index = prev_decl_index;
try addFailedDeclaration(
wip_members,
gz,
.unnamed_test,
.empty,
member_node,
false,
);
},
};
},
else => unreachable,
}
return .decl;
}