feature. See also
. The project being documented here (as the example) is the Zig library itself.
Ast.fullPtrTypeComponents
fn fullPtrTypeComponents(tree: Ast, info: full.PtrType.Components) full.PtrType
File
Code
fn fullPtrTypeComponents(tree: Ast, info: full.PtrType.Components) full.PtrType {
const size: std.lang.Type.Pointer.Size = switch (tree.tokenTag(info.main_token)) {
.asterisk => .one,
.l_bracket => switch (tree.tokenTag(info.main_token + 1)) {
.asterisk => if (tree.tokenTag(info.main_token + 2) == .identifier) .c else .many,
else => .slice,
},
else => unreachable,
};
var result: full.PtrType = .{
.size = size,
.allowzero_token = null,
.const_token = null,
.volatile_token = null,
.duplicate_token = null,
.ast = info,
};
// here while looking for modifiers as that could result in false
// positives. Therefore, start after a sentinel if there is one and
// skip over any align node and bit range nodes.
var i = (if (info.sentinel.unwrap()) |sentinel| tree.lastToken(sentinel) + 1 else switch (size) {
.one => info.main_token,
.slice => info.main_token + 1,
.many => info.main_token + 2,
.c => info.main_token + 3,
}) + 1;
const end = tree.firstToken(info.child_type);
while (i < end) : (i += 1) {
switch (tree.tokenTag(i)) {
.keyword_allowzero => {
if (result.allowzero_token != null) {
result.duplicate_token = i;
}
result.allowzero_token = i;
},
.keyword_const => {
if (result.const_token != null) {
result.duplicate_token = i;
}
result.const_token = i;
},
.keyword_volatile => {
if (result.volatile_token != null) {
result.duplicate_token = i;
}
result.volatile_token = i;
},
.keyword_align => {
if (info.bit_range_end.unwrap()) |bit_range_end| {
assert(info.bit_range_start != .none);
i = tree.lastToken(bit_range_end) + 1;
} else if (info.align_node.unwrap()) |align_node| {
i = tree.lastToken(align_node) + 1;
} else unreachable;
},
.keyword_addrspace => i = tree.lastToken(info.addrspace_node.unwrap().?) + 1,
else => unreachable,
}
}
return result;
}