Separated labeled and non labeled blocks
This commit is contained in:
parent
c551dfe65a
commit
2964df3511
@ -2186,27 +2186,62 @@ fn makeScopeInternal(
|
||||
.TestDecl => {
|
||||
return try makeScopeInternal(allocator, scopes, error_completions, enum_completions, tree, node.castTag(.TestDecl).?.body_node);
|
||||
},
|
||||
.LabeledBlock => {
|
||||
const block = node.castTag(.LabeledBlock).?;
|
||||
std.debug.assert(tree.token_ids[block.label] == .Identifier);
|
||||
var scope = try scopes.addOne(allocator);
|
||||
scope.* = .{
|
||||
.range = .{
|
||||
.start = tree.token_locs[block.lbrace].start,
|
||||
.end = tree.token_locs[block.rbrace].end,
|
||||
},
|
||||
.decls = std.StringHashMap(Declaration).init(allocator),
|
||||
.uses = &[0]*ast.Node.Use{},
|
||||
.tests = &[0]*ast.Node{},
|
||||
.data = .other,
|
||||
};
|
||||
errdefer scope.decls.deinit();
|
||||
|
||||
try scope.decls.putNoClobber(tree.tokenSlice(block.label), .{
|
||||
.label_decl = node,
|
||||
});
|
||||
|
||||
(try scopes.addOne(allocator)).* = .{
|
||||
.range = nodeSourceRange(tree, node),
|
||||
.decls = std.StringHashMap(Declaration).init(allocator),
|
||||
.uses = &[0]*ast.Node.Use{},
|
||||
.tests = &[0]*ast.Node{},
|
||||
.data = .{ .block = node },
|
||||
};
|
||||
var scope_idx = scopes.items.len - 1;
|
||||
var uses = std.ArrayList(*ast.Node.Use).init(allocator);
|
||||
|
||||
errdefer {
|
||||
scopes.items[scope_idx].decls.deinit();
|
||||
uses.deinit();
|
||||
}
|
||||
|
||||
var child_idx: usize = 0;
|
||||
while (node.iterate(child_idx)) |child_node| : (child_idx += 1) {
|
||||
if (child_node.castTag(.Use)) |use| {
|
||||
try uses.append(use);
|
||||
continue;
|
||||
}
|
||||
|
||||
try makeScopeInternal(allocator, scopes, error_completions, enum_completions, tree, child_node);
|
||||
if (child_node.castTag(.VarDecl)) |var_decl| {
|
||||
const name = tree.tokenSlice(var_decl.name_token);
|
||||
if (try scopes.items[scope_idx].decls.fetchPut(name, .{ .ast_node = child_node })) |existing| {
|
||||
// TODO Record a redefinition error.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
scopes.items[scope_idx].uses = uses.toOwnedSlice();
|
||||
return;
|
||||
},
|
||||
.Block => {
|
||||
const block = node.castTag(.Block).?;
|
||||
if (block.label) |label| {
|
||||
std.debug.assert(tree.token_ids[label] == .Identifier);
|
||||
var scope = try scopes.addOne(allocator);
|
||||
scope.* = .{
|
||||
.range = .{
|
||||
.start = tree.token_locs[block.lbrace].start,
|
||||
.end = tree.token_locs[block.rbrace].end,
|
||||
},
|
||||
.decls = std.StringHashMap(Declaration).init(allocator),
|
||||
.uses = &[0]*ast.Node.Use{},
|
||||
.tests = &[0]*ast.Node{},
|
||||
.data = .other,
|
||||
};
|
||||
errdefer scope.decls.deinit();
|
||||
|
||||
try scope.decls.putNoClobber(tree.tokenSlice(label), .{
|
||||
.label_decl = node,
|
||||
});
|
||||
}
|
||||
|
||||
(try scopes.addOne(allocator)).* = .{
|
||||
.range = nodeSourceRange(tree, node),
|
||||
|
@ -233,11 +233,14 @@ fn writeNodeTokens(builder: *Builder, arena: *std.heap.ArenaAllocator, store: *D
|
||||
defer arena.child_allocator.free(child_frame);
|
||||
|
||||
switch (node.tag) {
|
||||
.Root, .Block => {
|
||||
const first_tok = if (node.cast(ast.Node.Block)) |block_node| block: {
|
||||
.Root, .Block, .LabeledBlock => {
|
||||
const first_tok = if (node.castTag(.LabeledBlock)) |block_node| block: {
|
||||
try writeToken(builder, block_node.label, .label);
|
||||
break :block block_node.lbrace + 1;
|
||||
} else 0;
|
||||
} else if (node.castTag(.Block)) |block_node|
|
||||
block_node.lbrace + 1
|
||||
else
|
||||
0;
|
||||
|
||||
var gap_highlighter = GapHighlighter.init(builder, first_tok);
|
||||
var child_idx: usize = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user