Fix some tests and do some cleanup.
This commit is contained in:
@@ -299,7 +299,7 @@ no_matching_overload_found :: (checker : *Semantic_Checker, call : *AST_Node, ov
|
||||
append(*builder, "Possible overloads:\n");
|
||||
|
||||
for func : overloads.functions {
|
||||
func_var := h2tv(checker, func.type_variable);
|
||||
func_var := from_handle(checker, func.type_variable);
|
||||
|
||||
cyan(*builder);
|
||||
// foo :: (f : float) {} (file_path:line_num)
|
||||
@@ -316,7 +316,7 @@ no_matching_overload_found :: (checker : *Semantic_Checker, call : *AST_Node, ov
|
||||
arg_list := call.children[0];
|
||||
indent(*builder, 2);
|
||||
|
||||
func_var := h2tv(checker, func.type_variable);
|
||||
func_var := from_handle(checker, func.type_variable);
|
||||
|
||||
if arg_list.children.count != func_var.children.count {
|
||||
print_to_builder(*builder, "Not enough arguments: Wanted %, got %.\n\n", func_var.children.count, arg_list.children.count);
|
||||
@@ -462,7 +462,7 @@ Attempting to access a field on a primitive type '%'.
|
||||
builder : String_Builder;
|
||||
init_string_builder(*builder,, temp);
|
||||
|
||||
variable := h2tv(checker, handle);
|
||||
variable := from_handle(checker, handle);
|
||||
print_to_builder(*builder, "Attempting to access a field on a primitive type '%'.\n", proper_type_to_string(checker, variable));
|
||||
|
||||
indent(*builder, 1);
|
||||
@@ -470,7 +470,7 @@ Attempting to access a field on a primitive type '%'.
|
||||
print_to_builder(*builder, "%\n", print_from_source_location(node.source_location));
|
||||
indent(*builder, 1);
|
||||
|
||||
node_variable := h2tv(checker, node.type_variable);
|
||||
node_variable := from_handle(checker, node.type_variable);
|
||||
|
||||
for 0..node.name.count - 1 {
|
||||
append(*builder, " ");
|
||||
@@ -490,8 +490,8 @@ Attempting to access a field on a primitive type '%'.
|
||||
}
|
||||
|
||||
type_mismatch :: (checker : *Semantic_Checker, usage_site : *AST_Node, expect_node : *AST_Node, expect : Type_Variable_Handle, got : Type_Variable_Handle) {
|
||||
expect_var := h2tv(checker, expect);
|
||||
got_var := h2tv(checker, got);
|
||||
expect_var := from_handle(checker, expect);
|
||||
got_var := from_handle(checker, got);
|
||||
|
||||
builder : String_Builder;
|
||||
init_string_builder(*builder,, temp);
|
||||
@@ -501,7 +501,7 @@ type_mismatch :: (checker : *Semantic_Checker, usage_site : *AST_Node, expect_no
|
||||
|
||||
for i: 0..got_var.children.count - 1{
|
||||
child_handle := got_var.children[i];
|
||||
child := h2tv(checker, child_handle);
|
||||
child := from_handle(checker, child_handle);
|
||||
|
||||
print_to_builder(*builder, "% : %", child.name, type_to_string(child));
|
||||
}
|
||||
@@ -667,7 +667,7 @@ new_type_variable :: (checker : *Semantic_Checker) -> *Type_Variable, Type_Varia
|
||||
handle := cast(Type_Variable_Handle)checker.result.type_variables.count + 1;
|
||||
array_add(*checker.result.type_variables, variable);
|
||||
|
||||
return h2tv(checker, handle), handle;
|
||||
return from_handle(checker, handle), handle;
|
||||
}
|
||||
|
||||
add_child :: (variable : *Type_Variable, child : Type_Variable_Handle) {
|
||||
@@ -678,7 +678,7 @@ add_child :: (variable : *Type_Variable, child : Type_Variable_Handle) {
|
||||
}
|
||||
|
||||
add_child :: (checker : *Semantic_Checker, handle : Type_Variable_Handle, child : Type_Variable_Handle) {
|
||||
variable := h2tv(checker, handle);
|
||||
variable := from_handle(checker, handle);
|
||||
assert(variable.children.count < Type_Variable.MAX_TYPE_VARIABLE_CHILDREN);
|
||||
array_add(*variable.children, child);
|
||||
}
|
||||
@@ -725,13 +725,13 @@ find_symbol :: (name : string, checker : *Semantic_Checker, containing_scope : *
|
||||
return find_symbol(checker, name, checker.current_scope, containing_scope);
|
||||
}
|
||||
|
||||
h2tv :: (variables : []Type_Variable, handle : Type_Variable_Handle) -> *Type_Variable {
|
||||
from_handle :: (variables : []Type_Variable, handle : Type_Variable_Handle) -> *Type_Variable {
|
||||
assert(handle > 0 && xx handle <= variables.count, tprint("Invalid handle: %. Range is: 1-%", handle, variables.count - 1));
|
||||
return *variables[handle - 1];
|
||||
}
|
||||
|
||||
h2tv :: (checker : *Semantic_Checker, handle : Type_Variable_Handle) -> *Type_Variable {
|
||||
return h2tv(checker.result.type_variables, handle);
|
||||
from_handle :: (checker : *Semantic_Checker, handle : Type_Variable_Handle) -> *Type_Variable {
|
||||
return from_handle(checker.result.type_variables, handle);
|
||||
}
|
||||
|
||||
proper_type_to_string :: (builder : *String_Builder, checker : *Semantic_Checker, var : Type_Variable) {
|
||||
@@ -766,7 +766,7 @@ proper_type_to_string :: (builder : *String_Builder, checker : *Semantic_Checker
|
||||
|
||||
if var.return_type_variable > 0 {
|
||||
append(builder, " -> ", );
|
||||
return_var := h2tv(checker, var.return_type_variable);
|
||||
return_var := from_handle(checker, var.return_type_variable);
|
||||
if is_proper(return_var) {
|
||||
proper_type_to_string(builder, checker, return_var);
|
||||
} else {
|
||||
@@ -822,7 +822,7 @@ get_type_from_identifier :: (checker : *Semantic_Checker, scope : Scope_Handle,
|
||||
|
||||
symbol := find_symbol(checker, type_string, scope);
|
||||
if symbol {
|
||||
symbol_var := h2tv(checker, symbol.type_variable);
|
||||
symbol_var := from_handle(checker, symbol.type_variable);
|
||||
if symbol_var.type == .Struct {
|
||||
if typename {
|
||||
typename.* = symbol_var.typename;
|
||||
@@ -874,10 +874,10 @@ declare_struct :: (checker : *Semantic_Checker, node : *AST_Node, name : string)
|
||||
for child : node.children {
|
||||
if child.kind == .FieldList {
|
||||
for field : child.children {
|
||||
type_var := check_node(checker, field);
|
||||
type_var := create_field(checker, field);
|
||||
|
||||
if type_var > 0 {
|
||||
h2tv(checker, type_var).scope = scope_handle;
|
||||
from_handle(checker, type_var).scope = scope_handle;
|
||||
add_child(checker, handle, type_var);
|
||||
}
|
||||
}
|
||||
@@ -900,7 +900,7 @@ declare_properties :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Va
|
||||
checker.result.property_name = name;
|
||||
}
|
||||
type_var := declare_struct(checker, node, name);
|
||||
var := h2tv(checker, type_var);
|
||||
var := from_handle(checker, type_var);
|
||||
var.type = .Properties;
|
||||
var.typename = "properties";
|
||||
var.resource_index = checker.current_buffer_index;
|
||||
@@ -910,7 +910,7 @@ declare_properties :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Va
|
||||
|
||||
declare_cbuffer :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle {
|
||||
type_var := declare_struct(checker, node);
|
||||
var := h2tv(checker, type_var);
|
||||
var := from_handle(checker, type_var);
|
||||
var.type = .CBuffer;
|
||||
var.resource_index = checker.current_buffer_index;
|
||||
checker.current_buffer_index += 1;
|
||||
@@ -977,7 +977,7 @@ declare_function :: (checker : *Semantic_Checker, node : *AST_Node, builtin : bo
|
||||
field_list := node.children[0];
|
||||
|
||||
for function : find_result.functions {
|
||||
func_var := h2tv(checker, function.type_variable);
|
||||
func_var := from_handle(checker, function.type_variable);
|
||||
if func_var.source_node.children[0].children.count != field_list.children.count {
|
||||
continue;
|
||||
}
|
||||
@@ -989,7 +989,7 @@ declare_function :: (checker : *Semantic_Checker, node : *AST_Node, builtin : bo
|
||||
|
||||
typename : string;
|
||||
arg_type := get_type_from_identifier(checker, checker.current_scope, node_child, *typename);
|
||||
other_arg := h2tv(checker, arg);
|
||||
other_arg := from_handle(checker, arg);
|
||||
|
||||
if arg_type != other_arg.type {
|
||||
all_same = false;
|
||||
@@ -1037,7 +1037,7 @@ declare_function :: (checker : *Semantic_Checker, node : *AST_Node, builtin : bo
|
||||
type_var := check_node(checker, field);
|
||||
if type_var > 0 {
|
||||
if builtin {
|
||||
var := h2tv(checker, type_var);
|
||||
var := from_handle(checker, type_var);
|
||||
var.builtin = true;
|
||||
}
|
||||
add_child(checker, handle, type_var);
|
||||
@@ -1049,7 +1049,7 @@ declare_function :: (checker : *Semantic_Checker, node : *AST_Node, builtin : bo
|
||||
if builtin && node.token.ident_value.count > 0 {
|
||||
return_var, return_handle := new_type_variable(checker);
|
||||
return_var.type = get_type_from_identifier(checker, checker.current_scope, node, *return_var.typename);
|
||||
h2tv(checker, handle).return_type_variable= return_handle;
|
||||
from_handle(checker, handle).return_type_variable= return_handle;
|
||||
}
|
||||
|
||||
if !builtin {
|
||||
@@ -1073,7 +1073,7 @@ create_function :: (checker : *Semantic_Checker, node : *AST_Node) {
|
||||
}
|
||||
|
||||
for function : find_result.functions {
|
||||
variable := h2tv(checker, function.type_variable);
|
||||
variable := from_handle(checker, function.type_variable);
|
||||
|
||||
assert(variable.scope > 0, "Declared function is missing scope.");
|
||||
|
||||
@@ -1090,7 +1090,7 @@ create_function :: (checker : *Semantic_Checker, node : *AST_Node) {
|
||||
} else {
|
||||
result_var := check_node(checker, statement);
|
||||
if result_var > 0 {
|
||||
stm := h2tv(checker, result_var);
|
||||
stm := from_handle(checker, result_var);
|
||||
add_child(variable, result_var);
|
||||
}
|
||||
}
|
||||
@@ -1113,7 +1113,7 @@ create_variable :: (checker : *Semantic_Checker, node : *AST_Node, struct_field_
|
||||
|
||||
if find_result {
|
||||
node.type_variable = find_result.type_variable;
|
||||
variable := h2tv(checker, find_result.type_variable);
|
||||
variable := from_handle(checker, find_result.type_variable);
|
||||
variable.struct_field_parent = struct_field_parent;
|
||||
|
||||
if get_scope(checker, checker.current_scope).kind == .Struct {
|
||||
@@ -1130,7 +1130,7 @@ create_variable :: (checker : *Semantic_Checker, node : *AST_Node, struct_field_
|
||||
lookup_name = variable.name;
|
||||
}
|
||||
struct_symbol := find_symbol(checker, lookup_name, checker.current_scope);
|
||||
type_variable := h2tv(checker, struct_symbol.type_variable);
|
||||
type_variable := from_handle(checker, struct_symbol.type_variable);
|
||||
|
||||
previous_scope := use_scope(checker, type_variable.scope);
|
||||
child := node.children[0];
|
||||
@@ -1175,7 +1175,7 @@ create_field :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable
|
||||
if variable.is_array {
|
||||
size_node := node.children[0];
|
||||
size_var := check_node(checker, size_node);
|
||||
if h2tv(checker, size_var).type != .Int {
|
||||
if from_handle(checker, size_var).type != .Int {
|
||||
//@Incomplete(niels): Type mismatch here. With integral type required message.
|
||||
}
|
||||
}
|
||||
@@ -1230,8 +1230,8 @@ create_field :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable
|
||||
return handle;
|
||||
}
|
||||
|
||||
l := h2tv(checker, handle);
|
||||
r := h2tv(checker, rhs);
|
||||
l := from_handle(checker, handle);
|
||||
r := from_handle(checker, rhs);
|
||||
assert(l.type != .Unresolved_Expression && r.type != .Unresolved_Expression);
|
||||
|
||||
if !types_compatible(checker, handle, rhs) {
|
||||
@@ -1295,7 +1295,7 @@ check_call :: (checker : *Semantic_Checker, node : *AST_Node, type_var : Type_Va
|
||||
break;
|
||||
}
|
||||
|
||||
function := h2tv(checker, func.type_variable);
|
||||
function := from_handle(checker, func.type_variable);
|
||||
|
||||
if arg_count != function.children.count {
|
||||
continue;
|
||||
@@ -1318,7 +1318,7 @@ check_call :: (checker : *Semantic_Checker, node : *AST_Node, type_var : Type_Va
|
||||
if all_args_match {
|
||||
arg_node = arg.node;
|
||||
}
|
||||
fun_param := h2tv(checker, function_param);
|
||||
fun_param := from_handle(checker, function_param);
|
||||
mismatch : Type_Mismatch_Data;
|
||||
mismatch.lhs = arg;
|
||||
mismatch.rhs = .{ function_param, fun_param.source_node };
|
||||
@@ -1333,8 +1333,8 @@ check_call :: (checker : *Semantic_Checker, node : *AST_Node, type_var : Type_Va
|
||||
|
||||
if overload_found {
|
||||
if function.return_type_variable > 0 {
|
||||
return_var := h2tv(checker, function.return_type_variable);
|
||||
constrained_var := h2tv(checker, type_var);
|
||||
return_var := from_handle(checker, function.return_type_variable);
|
||||
constrained_var := from_handle(checker, type_var);
|
||||
constrained_var.type = return_var.type;
|
||||
constrained_var.typename = return_var.typename;
|
||||
}
|
||||
@@ -1379,7 +1379,7 @@ check_node :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_H
|
||||
}
|
||||
|
||||
variable, handle := new_type_variable(checker);
|
||||
lhs_type := h2tv(checker, lhs_var);
|
||||
lhs_type := from_handle(checker, lhs_var);
|
||||
variable.type = lhs_type.type;
|
||||
variable.typename = lhs_type.typename;
|
||||
variable.scope = lhs_type.scope;
|
||||
@@ -1482,7 +1482,7 @@ traverse :: (checker : *Semantic_Checker) {
|
||||
|
||||
// find :: (checker : *Semantic_Checker, root_handle : Type_Variable_Handle) -> Type_Variable_Handle {
|
||||
// assert(root_handle > 0);
|
||||
// root := h2tv(checker, root_handle);
|
||||
// root := from_handle(checker, root_handle);
|
||||
|
||||
// // if root.uf_parent != root_handle {
|
||||
// // root.uf_parent = find(checker, root.uf_parent);
|
||||
@@ -1497,8 +1497,8 @@ Unification_Result :: enum {
|
||||
}
|
||||
|
||||
types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rhs : Type_Variable_Handle, param_matching : bool = false) -> bool {
|
||||
lhs_var := h2tv(checker, lhs);
|
||||
rhs_var := h2tv(checker, rhs);
|
||||
lhs_var := from_handle(checker, lhs);
|
||||
rhs_var := from_handle(checker, rhs);
|
||||
|
||||
if lhs_var.type == {
|
||||
case .Int; #through;
|
||||
@@ -1552,8 +1552,8 @@ types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rh
|
||||
return false;
|
||||
}
|
||||
|
||||
lhs_struct_var := h2tv(checker, lhs_struct.type_variable);
|
||||
rhs_struct_var := h2tv(checker, rhs_struct.type_variable);
|
||||
lhs_struct_var := from_handle(checker, lhs_struct.type_variable);
|
||||
rhs_struct_var := from_handle(checker, rhs_struct.type_variable);
|
||||
|
||||
if lhs_struct_var.children.count != rhs_struct_var.children.count {
|
||||
return false;
|
||||
@@ -1720,7 +1720,7 @@ pretty_print_function :: (checker : *Semantic_Checker, builder : *String_Builder
|
||||
for child : function.source_node.children {
|
||||
if child.kind == .FieldList {
|
||||
for field : child.children {
|
||||
tv := h2tv(checker, field.type_variable);
|
||||
tv := from_handle(checker, field.type_variable);
|
||||
if tv.type != .Function {
|
||||
if tv.builtin {
|
||||
print_to_builder(builder, "%", tv.name);
|
||||
@@ -1739,7 +1739,7 @@ pretty_print_function :: (checker : *Semantic_Checker, builder : *String_Builder
|
||||
}
|
||||
|
||||
if function.return_type_variable> 0 {
|
||||
print_to_builder(builder, ") -> %\n", type_to_string(h2tv(checker, function.return_type_variable)));
|
||||
print_to_builder(builder, ") -> %\n", type_to_string(from_handle(checker, function.return_type_variable)));
|
||||
} else {
|
||||
append(builder, ")\n");
|
||||
}
|
||||
@@ -1752,7 +1752,7 @@ pretty_print_struct :: (checker : *Semantic_Checker, builder : *String_Builder,
|
||||
|
||||
for 0..struct_type.children.count - 1 {
|
||||
child_handle := struct_type.children[it];
|
||||
child := h2tv(checker, child_handle);
|
||||
child := from_handle(checker, child_handle);
|
||||
print_to_builder(builder, child.name);
|
||||
append(builder, " : ");
|
||||
print_to_builder(builder, type_to_string(child));
|
||||
@@ -1790,7 +1790,7 @@ pretty_print_scope :: (checker : *Semantic_Checker, scope : *Scope, builder : *S
|
||||
|
||||
if value.functions.count > 0 {
|
||||
for func : value.functions {
|
||||
type_variable := h2tv(checker, func.type_variable);
|
||||
type_variable := from_handle(checker, func.type_variable);
|
||||
if type_variable.type == {
|
||||
case .Function; {
|
||||
pretty_print_function(checker, builder, key, type_variable, 1);
|
||||
@@ -1816,7 +1816,7 @@ pretty_print_scope :: (checker : *Semantic_Checker, scope : *Scope, builder : *S
|
||||
}
|
||||
}
|
||||
} else {
|
||||
type_variable := h2tv(checker, value.type_variable);
|
||||
type_variable := from_handle(checker, value.type_variable);
|
||||
if type_variable.type == {
|
||||
case .Function; {
|
||||
pretty_print_function(checker, builder, key, type_variable, 1);
|
||||
@@ -1936,7 +1936,7 @@ print_type_variable :: (builder : *String_Builder, variable : Type_Variable, che
|
||||
}
|
||||
|
||||
print_type_variable :: (builder : *String_Builder, checker : *Semantic_Checker, handle : Type_Variable_Handle) {
|
||||
variable := h2tv(checker, handle);
|
||||
variable := from_handle(checker, handle);
|
||||
print_type_variable(builder, variable, checker);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user