Start implementing usingnamespace

This commit is contained in:
Luuk de Gram 2021-03-03 21:02:31 +01:00
parent d7ccf6a3c2
commit 7495aab28b
No known key found for this signature in database
GPG Key ID: A002B174963DBB7D

View File

@ -2056,7 +2056,7 @@ fn iterateSymbolsGlobalInternal(
try callback(context, DeclWithHandle{ .decl = &entry.value, .handle = handle }); try callback(context, DeclWithHandle{ .decl = &entry.value, .handle = handle });
} }
// for (scope.uses) |use| { // for (Index) |use| {
// if (std.mem.indexOfScalar(*ast.Node.Use, use_trail.items, use) != null) continue; // if (std.mem.indexOfScalar(*ast.Node.Use, use_trail.items, use) != null) continue;
// try use_trail.append(use); // try use_trail.append(use);
@ -2270,7 +2270,7 @@ pub const DocumentScope = struct {
scope.range.start, scope.range.start,
scope.range.end, scope.range.end,
{}, {},
// scope.uses.len, scope.uses.len,
}); });
var decl_it = scope.decls.iterator(); var decl_it = scope.decls.iterator();
@ -2286,7 +2286,7 @@ pub const DocumentScope = struct {
pub fn deinit(self: DocumentScope, allocator: *std.mem.Allocator) void { pub fn deinit(self: DocumentScope, allocator: *std.mem.Allocator) void {
for (self.scopes) |*scope| { for (self.scopes) |*scope| {
scope.decls.deinit(); scope.decls.deinit();
// allocator.free(scope.uses); allocator.free(scope.uses);
allocator.free(scope.tests); allocator.free(scope.tests);
} }
allocator.free(self.scopes); allocator.free(self.scopes);
@ -2308,7 +2308,7 @@ pub const Scope = struct {
range: SourceRange, range: SourceRange,
decls: std.StringHashMap(Declaration), decls: std.StringHashMap(Declaration),
tests: []const ast.Node.Index, tests: []const ast.Node.Index,
// uses: []const *ast.Node.Data, uses: []const ast.Node.Index,
data: Data, data: Data,
}; };
@ -2417,26 +2417,25 @@ fn makeScopeInternal(
(try scopes.addOne(allocator)).* = .{ (try scopes.addOne(allocator)).* = .{
.range = nodeSourceRange(tree, node_idx), .range = nodeSourceRange(tree, node_idx),
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .{ .container = node_idx }, .data = .{ .container = node_idx },
}; };
const scope_idx = scopes.items.len - 1; const scope_idx = scopes.items.len - 1;
// var uses = std.ArrayList(*ast.Node.Use).init(allocator); var uses = std.ArrayList(ast.Node.Index).init(allocator);
var tests = std.ArrayList(ast.Node.Index).init(allocator); var tests = std.ArrayList(ast.Node.Index).init(allocator);
errdefer { errdefer {
scopes.items[scope_idx].decls.deinit(); scopes.items[scope_idx].decls.deinit();
// uses.deinit(); uses.deinit();
tests.deinit(); tests.deinit();
} }
for (ast_decls) |decl| { for (ast_decls) |decl| {
// @TODO: Implement using namespace if (tags[decl] == .@"usingnamespace") {
// if (decl.castTag(.Use)) |use| { try uses.append(decl);
// try uses.append(use); continue;
// continue; }
// }
try makeScopeInternal(allocator, scopes, error_completions, enum_completions, tree, decl); try makeScopeInternal(allocator, scopes, error_completions, enum_completions, tree, decl);
const name = getDeclName(tree, decl) orelse continue; const name = getDeclName(tree, decl) orelse continue;
@ -2512,7 +2511,7 @@ fn makeScopeInternal(
} }
scopes.items[scope_idx].tests = tests.toOwnedSlice(); scopes.items[scope_idx].tests = tests.toOwnedSlice();
// scopes.items[scope_idx].uses = uses.toOwnedSlice(); scopes.items[scope_idx].uses = uses.toOwnedSlice();
return; return;
} }
@ -2524,7 +2523,7 @@ fn makeScopeInternal(
(try scopes.addOne(allocator)).* = .{ (try scopes.addOne(allocator)).* = .{
.range = nodeSourceRange(tree, node_idx), .range = nodeSourceRange(tree, node_idx),
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .{ .function = node_idx }, .data = .{ .function = node_idx },
}; };
@ -2562,7 +2561,7 @@ fn makeScopeInternal(
.end = tree.tokenLocation(0, last_token).line_start, .end = tree.tokenLocation(0, last_token).line_start,
}, },
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .other, .data = .other,
}; };
@ -2573,16 +2572,16 @@ fn makeScopeInternal(
(try scopes.addOne(allocator)).* = .{ (try scopes.addOne(allocator)).* = .{
.range = nodeSourceRange(tree, node_idx), .range = nodeSourceRange(tree, node_idx),
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .{ .block = node_idx }, .data = .{ .block = node_idx },
}; };
var scope_idx = scopes.items.len - 1; var scope_idx = scopes.items.len - 1;
// var uses = std.ArrayList(*ast.Node.Use).init(allocator); var uses = std.ArrayList(ast.Node.Index).init(allocator);
errdefer { errdefer {
scopes.items[scope_idx].decls.deinit(); scopes.items[scope_idx].decls.deinit();
// uses.deinit(); uses.deinit();
} }
const statements: []const ast.Node.Index = switch (node) { const statements: []const ast.Node.Index = switch (node) {
@ -2601,6 +2600,11 @@ fn makeScopeInternal(
}; };
for (statements) |idx| { for (statements) |idx| {
if (tags[idx] == .@"usingnamespace") {
try uses.append(idx);
continue;
}
try makeScopeInternal(allocator, scopes, error_completions, enum_completions, tree, idx); try makeScopeInternal(allocator, scopes, error_completions, enum_completions, tree, idx);
if (varDecl(tree, idx)) |var_decl| { if (varDecl(tree, idx)) |var_decl| {
const name = tree.tokenSlice(var_decl.ast.mut_token + 1); const name = tree.tokenSlice(var_decl.ast.mut_token + 1);
@ -2610,7 +2614,7 @@ fn makeScopeInternal(
} }
} }
// scopes.items[scope_idx].uses = uses.toOwnedSlice(); scopes.items[scope_idx].uses = uses.toOwnedSlice();
return; return;
}, },
.@"comptime", .@"nosuspend" => { .@"comptime", .@"nosuspend" => {
@ -2630,7 +2634,7 @@ fn makeScopeInternal(
.end = tree.tokenLocation(0, tree.lastToken(if_node.ast.then_expr)).line_end, .end = tree.tokenLocation(0, tree.lastToken(if_node.ast.then_expr)).line_end,
}, },
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .other, .data = .other,
}; };
@ -2660,7 +2664,7 @@ fn makeScopeInternal(
.end = tree.tokenLocation(0, tree.lastToken(if_node.ast.else_expr)).line_end, .end = tree.tokenLocation(0, tree.lastToken(if_node.ast.else_expr)).line_end,
}, },
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .other, .data = .other,
}; };
@ -2690,7 +2694,7 @@ fn makeScopeInternal(
.end = tree.tokenLocation(0, tree.lastToken(node_idx)).line_end, .end = tree.tokenLocation(0, tree.lastToken(node_idx)).line_end,
}, },
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .other, .data = .other,
}; };
@ -2707,7 +2711,7 @@ fn makeScopeInternal(
.end = tree.tokenLocation(0, tree.lastToken(while_node.ast.then_expr)).line_end, .end = tree.tokenLocation(0, tree.lastToken(while_node.ast.then_expr)).line_end,
}, },
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .other, .data = .other,
}; };
@ -2736,7 +2740,7 @@ fn makeScopeInternal(
.end = tree.tokenLocation(0, tree.lastToken(while_node.ast.else_expr)).line_end, .end = tree.tokenLocation(0, tree.lastToken(while_node.ast.else_expr)).line_end,
}, },
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .other, .data = .other,
}; };
@ -2763,7 +2767,7 @@ fn makeScopeInternal(
.end = tree.tokenLocation(0, tree.lastToken(switch_case.ast.target_expr)).line_end, .end = tree.tokenLocation(0, tree.lastToken(switch_case.ast.target_expr)).line_end,
}, },
.decls = std.StringHashMap(Declaration).init(allocator), .decls = std.StringHashMap(Declaration).init(allocator),
// .uses = &[0]*ast.Node.Use{}, .uses = &.{},
.tests = &.{}, .tests = &.{},
.data = .other, .data = .other,
}; };