Returns a *_var_decl node with its rhs (init expression) initialized to .none.
fn parseVarDeclProto(p: *Parse) !?Node.Index
fn parseVarDeclProto(p: *Parse) !?Node.Index {
const mut_token = p.eatToken(.keyword_const) orelse
p.eatToken(.keyword_var) orelse
return null;
_ = try p.expectToken(.identifier);
const opt_type_node = if (p.eatToken(.colon) == null) null else try p.expectTypeExpr();
const opt_align_node = try p.parseByteAlign();
const opt_addrspace_node = try p.parseAddrSpace();
const opt_section_node = try p.parseLinkSection();
if (opt_section_node == null and opt_addrspace_node == null) {
const align_node = opt_align_node orelse {
return try p.addNode(.{
.tag = .simple_var_decl,
.main_token = mut_token,
.data = .{
.opt_node_and_opt_node = .{
.fromOptional(opt_type_node),
.none, // set later with `setVarDeclInitExpr
},
},
});
};
const type_node = opt_type_node orelse {
return try p.addNode(.{
.tag = .aligned_var_decl,
.main_token = mut_token,
.data = .{
.node_and_opt_node = .{
align_node,
.none, // set later with `setVarDeclInitExpr
},
},
});
};
return try p.addNode(.{
.tag = .local_var_decl,
.main_token = mut_token,
.data = .{
.extra_and_opt_node = .{
try p.addExtra(Node.LocalVarDecl{
.type_node = type_node,
.align_node = align_node,
}),
.none, // set later with `setVarDeclInitExpr
},
},
});
} else {
return try p.addNode(.{
.tag = .global_var_decl,
.main_token = mut_token,
.data = .{
.extra_and_opt_node = .{
try p.addExtra(Node.GlobalVarDecl{
.type_node = .fromOptional(opt_type_node),
.align_node = .fromOptional(opt_align_node),
.addrspace_node = .fromOptional(opt_addrspace_node),
.section_node = .fromOptional(opt_section_node),
}),
.none, // set later with `setVarDeclInitExpr
},
},
});
}
}