small refactor on ComptimeInterpreter
This commit is contained in:
parent
d49979d002
commit
bdf207a821
@ -155,7 +155,7 @@ pub fn huntItDown(
|
||||
namespace: NamespaceIndex,
|
||||
decl_name: []const u8,
|
||||
options: InterpretOptions,
|
||||
) InterpretError!Decl {
|
||||
) error{IdentifierNotFound}!Decl {
|
||||
_ = options;
|
||||
|
||||
var current_namespace = namespace;
|
||||
@ -168,7 +168,6 @@ pub fn huntItDown(
|
||||
}
|
||||
}
|
||||
|
||||
log.err("Identifier not found: {s}", .{decl_name});
|
||||
return error.IdentifierNotFound;
|
||||
}
|
||||
|
||||
@ -431,13 +430,15 @@ pub fn interpret(
|
||||
// TODO: Floats
|
||||
|
||||
// Logic to find identifiers in accessible scopes
|
||||
const decl = interpreter.huntItDown(namespace, value, options) catch |err| {
|
||||
if (err == error.IdentifierNotFound) try interpreter.recordError(
|
||||
const decl = interpreter.huntItDown(namespace, value, options) catch |err| switch (err) {
|
||||
error.IdentifierNotFound => |e| {
|
||||
try interpreter.recordError(
|
||||
node_idx,
|
||||
"undeclared_identifier",
|
||||
try std.fmt.allocPrint(interpreter.allocator, "use of undeclared identifier '{s}'", .{value}),
|
||||
);
|
||||
return err;
|
||||
return e;
|
||||
},
|
||||
};
|
||||
|
||||
return InterpretResult{ .value = Value{
|
||||
@ -456,13 +457,15 @@ pub fn interpret(
|
||||
|
||||
const lhs_namespace = interpreter.ip.indexToKey(irv.val).getNamespace();
|
||||
|
||||
var scope_sub_decl = irv.interpreter.huntItDown(lhs_namespace, rhs_str, options) catch |err| {
|
||||
if (err == error.IdentifierNotFound) try interpreter.recordError(
|
||||
var scope_sub_decl = irv.interpreter.huntItDown(lhs_namespace, rhs_str, options) catch |err| switch (err) {
|
||||
error.IdentifierNotFound => |e| {
|
||||
try interpreter.recordError(
|
||||
node_idx,
|
||||
"undeclared_identifier",
|
||||
try std.fmt.allocPrint(interpreter.allocator, "use of undeclared identifier '{s}'", .{rhs_str}),
|
||||
);
|
||||
return err;
|
||||
return e;
|
||||
},
|
||||
};
|
||||
|
||||
return InterpretResult{ .value = Value{
|
||||
@ -760,13 +763,9 @@ pub fn interpret(
|
||||
.interpreter = interpreter,
|
||||
.node_idx = node_idx,
|
||||
.ty = string_literal_type,
|
||||
.val = try interpreter.ip.get(interpreter.allocator, IPKey{ .bytes = str }), // TODO
|
||||
.val = try interpreter.ip.get(interpreter.allocator, IPKey{ .bytes = str }),
|
||||
};
|
||||
|
||||
// TODO: Add type casting, sentinel
|
||||
// TODO: Should this be a `*const [len:0]u8`?
|
||||
// try val.value_data.slice_ptr.append(interpreter.allocator, .{ .unsigned_int = 0 });
|
||||
|
||||
return InterpretResult{ .value = val };
|
||||
},
|
||||
// TODO: Add comptime autodetection; e.g. const MyArrayList = std.ArrayList(u8)
|
||||
@ -959,9 +958,9 @@ pub fn call(
|
||||
// TODO: type check args
|
||||
|
||||
const tree = interpreter.getHandle().tree;
|
||||
const tags = tree.nodes.items(.tag);
|
||||
|
||||
if (tags[func_node_idx] != .fn_decl) return error.CriticalAstFailure;
|
||||
var buf: [1]Ast.Node.Index = undefined;
|
||||
var proto = ast.fnProto(tree, func_node_idx, &buf) orelse return error.CriticalAstFailure;
|
||||
|
||||
// TODO: Make argument namespace to evaluate arguments in
|
||||
try interpreter.namespaces.append(interpreter.allocator, .{
|
||||
@ -973,9 +972,6 @@ pub fn call(
|
||||
|
||||
const type_type = try interpreter.ip.get(interpreter.allocator, IPKey{ .simple = .type });
|
||||
|
||||
var buf: [1]Ast.Node.Index = undefined;
|
||||
var proto = ast.fnProto(tree, func_node_idx, &buf).?;
|
||||
|
||||
var arg_it = proto.iterate(&tree);
|
||||
var arg_index: usize = 0;
|
||||
while (ast.nextFnParam(&arg_it)) |param| {
|
||||
|
Loading…
Reference in New Issue
Block a user