Changed some naming in sem checker.
This commit is contained in:
@@ -13,7 +13,7 @@ VERTEX_MAIN_FUNCTION_PREFIX :: "vertex";
|
|||||||
PIXEL_MAIN_FUNCTION_PREFIX :: "pixel";
|
PIXEL_MAIN_FUNCTION_PREFIX :: "pixel";
|
||||||
PROPERTIES_PREFIX :: "properties";
|
PROPERTIES_PREFIX :: "properties";
|
||||||
|
|
||||||
Semantic_Type :: enum {
|
Type_Kind :: enum {
|
||||||
Invalid :: 128;
|
Invalid :: 128;
|
||||||
|
|
||||||
Int :: 0;
|
Int :: 0;
|
||||||
@@ -56,7 +56,7 @@ Typenames :: string.[
|
|||||||
];
|
];
|
||||||
|
|
||||||
Type_Variable :: struct {
|
Type_Variable :: struct {
|
||||||
type : Semantic_Type;
|
type : Type_Kind;
|
||||||
kind : Type_Variable_Kind;
|
kind : Type_Variable_Kind;
|
||||||
builtin : bool;
|
builtin : bool;
|
||||||
|
|
||||||
@@ -844,16 +844,16 @@ proper_type_to_string :: (variables : []Type_Variable, var : Type_Variable, allo
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
get_type_from_identifier :: (checker : *Semantic_Checker, scope : Scope_Handle, node : *AST_Node, typename : *string = null) -> Semantic_Type {
|
get_type_from_identifier :: (checker : *Semantic_Checker, scope : Scope_Handle, node : *AST_Node, typename : *string = null) -> Type_Kind {
|
||||||
type_string := node.token.ident_value;
|
type_string := node.token.ident_value;
|
||||||
|
|
||||||
if type_string == {
|
if type_string == {
|
||||||
case Typenames[Semantic_Type.Int]; return .Int;
|
case Typenames[Type_Kind.Int]; return .Int;
|
||||||
case Typenames[Semantic_Type.Half]; return .Half;
|
case Typenames[Type_Kind.Half]; return .Half;
|
||||||
case Typenames[Semantic_Type.Float]; return .Float;
|
case Typenames[Type_Kind.Float]; return .Float;
|
||||||
case Typenames[Semantic_Type.Double]; return .Double;
|
case Typenames[Type_Kind.Double]; return .Double;
|
||||||
case Typenames[Semantic_Type.Sampler]; return .Sampler;
|
case Typenames[Type_Kind.Sampler]; return .Sampler;
|
||||||
case Typenames[Semantic_Type.Texture2D]; return .Texture2D;
|
case Typenames[Type_Kind.Texture2D]; return .Texture2D;
|
||||||
}
|
}
|
||||||
|
|
||||||
symbol := find_symbol(checker, type_string, scope);
|
symbol := find_symbol(checker, type_string, scope);
|
||||||
@@ -910,7 +910,7 @@ declare_struct :: (checker : *Semantic_Checker, node : *AST_Node, name : string)
|
|||||||
for child : node.children {
|
for child : node.children {
|
||||||
if child.kind == .FieldList {
|
if child.kind == .FieldList {
|
||||||
for field : child.children {
|
for field : child.children {
|
||||||
type_var := create_field(checker, field);
|
type_var := check_field(checker, field);
|
||||||
|
|
||||||
if type_var > 0 {
|
if type_var > 0 {
|
||||||
from_handle(checker, type_var).scope = scope_handle;
|
from_handle(checker, type_var).scope = scope_handle;
|
||||||
@@ -1095,7 +1095,7 @@ declare_function :: (checker : *Semantic_Checker, node : *AST_Node, builtin : bo
|
|||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
create_function :: (checker : *Semantic_Checker, node : *AST_Node) {
|
check_function :: (checker : *Semantic_Checker, node : *AST_Node) {
|
||||||
name_to_check := get_actual_function_name(node);
|
name_to_check := get_actual_function_name(node);
|
||||||
find_result := find_symbol(checker, name_to_check, checker.current_scope);
|
find_result := find_symbol(checker, name_to_check, checker.current_scope);
|
||||||
|
|
||||||
@@ -1142,7 +1142,7 @@ create_function :: (checker : *Semantic_Checker, node : *AST_Node) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
create_variable :: (checker : *Semantic_Checker, node : *AST_Node, struct_field_parent : *AST_Node = null) -> Type_Variable_Handle {
|
check_variable :: (checker : *Semantic_Checker, node : *AST_Node, struct_field_parent : *AST_Node = null) -> Type_Variable_Handle {
|
||||||
find_result := find_symbol(checker, node.name, checker.current_scope);
|
find_result := find_symbol(checker, node.name, checker.current_scope);
|
||||||
// x : int;
|
// x : int;
|
||||||
// x.d = 5;
|
// x.d = 5;
|
||||||
@@ -1175,7 +1175,7 @@ create_variable :: (checker : *Semantic_Checker, node : *AST_Node, struct_field_
|
|||||||
field_not_defined_on_struct(checker, child, struct_symbol);
|
field_not_defined_on_struct(checker, child, struct_symbol);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
access := create_variable(checker, child, node);
|
access := check_variable(checker, child, node);
|
||||||
use_scope(checker, previous_scope);
|
use_scope(checker, previous_scope);
|
||||||
return access;
|
return access;
|
||||||
}
|
}
|
||||||
@@ -1188,10 +1188,10 @@ create_variable :: (checker : *Semantic_Checker, node : *AST_Node, struct_field_
|
|||||||
}
|
}
|
||||||
|
|
||||||
can_declare :: (checker : *Semantic_Checker, name : string) -> bool {
|
can_declare :: (checker : *Semantic_Checker, name : string) -> bool {
|
||||||
max_value := Semantic_Type.Max_Builtin;
|
max_value := Type_Kind.Max_Builtin;
|
||||||
|
|
||||||
for i : 0..max_value - 1 {
|
for i : 0..max_value - 1 {
|
||||||
kind := cast(Semantic_Type)i;
|
kind := cast(Type_Kind)i;
|
||||||
if name == Typenames[kind] {
|
if name == Typenames[kind] {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1200,7 +1200,7 @@ can_declare :: (checker : *Semantic_Checker, name : string) -> bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//@Incomplete(niels): Handle meta stuff here
|
//@Incomplete(niels): Handle meta stuff here
|
||||||
create_field :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle {
|
check_field :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle {
|
||||||
variable, handle := new_type_variable(checker);
|
variable, handle := new_type_variable(checker);
|
||||||
variable.name = node.name;
|
variable.name = node.name;
|
||||||
typename : string;
|
typename : string;
|
||||||
@@ -1399,15 +1399,15 @@ check_call :: (checker : *Semantic_Checker, node : *AST_Node, type_var : Type_Va
|
|||||||
check_node :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle {
|
check_node :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_Handle {
|
||||||
if node.kind == {
|
if node.kind == {
|
||||||
case .Function; {
|
case .Function; {
|
||||||
create_function(checker, node);
|
check_function(checker, node);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case. Field; {
|
case. Field; {
|
||||||
field_var := create_field(checker, node);
|
field_var := check_field(checker, node);
|
||||||
return field_var;
|
return field_var;
|
||||||
}
|
}
|
||||||
case .Unnamed_Field; {
|
case .Unnamed_Field; {
|
||||||
field_var := create_field(checker, node);
|
field_var := check_field(checker, node);
|
||||||
return field_var;
|
return field_var;
|
||||||
}
|
}
|
||||||
case .Unary; {
|
case .Unary; {
|
||||||
@@ -1497,7 +1497,7 @@ check_node :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_H
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
case .Variable; {
|
case .Variable; {
|
||||||
return create_variable(checker, node);
|
return check_variable(checker, node);
|
||||||
}
|
}
|
||||||
case .Integer; {
|
case .Integer; {
|
||||||
type_variable, handle := new_type_variable(checker);
|
type_variable, handle := new_type_variable(checker);
|
||||||
@@ -1565,22 +1565,6 @@ traverse :: (checker : *Semantic_Checker) {
|
|||||||
traverse(checker, checker.program_root);
|
traverse(checker, checker.program_root);
|
||||||
}
|
}
|
||||||
|
|
||||||
// find :: (checker : *Semantic_Checker, root_handle : Type_Variable_Handle) -> Type_Variable_Handle {
|
|
||||||
// assert(root_handle > 0);
|
|
||||||
// root := from_handle(checker, root_handle);
|
|
||||||
|
|
||||||
// // if root.uf_parent != root_handle {
|
|
||||||
// // root.uf_parent = find(checker, root.uf_parent);
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// return root.uf_parent;
|
|
||||||
// }
|
|
||||||
|
|
||||||
Unification_Result :: enum {
|
|
||||||
Unification_Success;
|
|
||||||
Unification_Failure;
|
|
||||||
}
|
|
||||||
|
|
||||||
types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rhs : Type_Variable_Handle, param_matching : bool = false) -> bool {
|
types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rhs : Type_Variable_Handle, param_matching : bool = false) -> bool {
|
||||||
lhs_var := from_handle(checker, lhs);
|
lhs_var := from_handle(checker, lhs);
|
||||||
rhs_var := from_handle(checker, rhs);
|
rhs_var := from_handle(checker, rhs);
|
||||||
@@ -1662,12 +1646,6 @@ types_compatible :: (checker : *Semantic_Checker, lhs : Type_Variable_Handle, rh
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// HLSL_BUILTIN :: #run -> string {
|
|
||||||
// T := #load "hlsl_builtin.jai";
|
|
||||||
|
|
||||||
// return "";
|
|
||||||
// };
|
|
||||||
|
|
||||||
add_hlsl_builtins :: (checker : *Semantic_Checker) {
|
add_hlsl_builtins :: (checker : *Semantic_Checker) {
|
||||||
source_location := #location().fully_pathed_filename;
|
source_location := #location().fully_pathed_filename;
|
||||||
path_array := split(source_location, "/");
|
path_array := split(source_location, "/");
|
||||||
@@ -1746,7 +1724,7 @@ check :: (result : *Compile_Result) {
|
|||||||
checker.current_sampler_index = 0;
|
checker.current_sampler_index = 0;
|
||||||
checker.current_texture_index = 0;
|
checker.current_texture_index = 0;
|
||||||
checker.result_file = file;
|
checker.result_file = file;
|
||||||
array_reserve(*checker.messages, 16);
|
array_reserve(*checker.messages, 32);
|
||||||
|
|
||||||
init_semantic_checker(*checker, file.ast_root, file.file.path);
|
init_semantic_checker(*checker, file.ast_root, file.file.path);
|
||||||
|
|
||||||
@@ -1755,30 +1733,11 @@ check :: (result : *Compile_Result) {
|
|||||||
|
|
||||||
type_check(*checker, file.ast_root);
|
type_check(*checker, file.ast_root);
|
||||||
|
|
||||||
// file.vertex_entry_point.node = checker.result.vertex_entry_point;
|
|
||||||
// file.pixel_entry_point.node = checker.result.pixel_entry_point;
|
|
||||||
|
|
||||||
result.had_error |= checker.had_error;
|
result.had_error |= checker.had_error;
|
||||||
copy_messages(checker.messages, *result.messages);
|
copy_messages(checker.messages, *result.messages);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check :: (checker : *Semantic_Checker, root : *AST_Node) -> Semantic_Check_Result {
|
|
||||||
// checker.current_buffer_index = 0;
|
|
||||||
// checker.current_sampler_index = 0;
|
|
||||||
// checker.current_texture_index = 0;
|
|
||||||
// array_reserve(*checker.messages, 16);
|
|
||||||
// add_hlsl_builtins(checker);
|
|
||||||
|
|
||||||
// type_check(checker, root);
|
|
||||||
|
|
||||||
// return checker.result;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// check :: (checker : *Semantic_Checker) -> Semantic_Check_Result {
|
|
||||||
// return check(checker, checker.program_root);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// ===========================================================
|
// ===========================================================
|
||||||
// Pretty printing
|
// Pretty printing
|
||||||
|
|
||||||
@@ -1805,7 +1764,6 @@ type_to_string :: (type_variable : Type_Variable) -> string {
|
|||||||
case .Array;
|
case .Array;
|
||||||
return "array";
|
return "array";
|
||||||
}
|
}
|
||||||
|
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
#load "Semantic_Analysis.jai";
|
#load "Semantic_Analysis.jai";
|
||||||
#load "Codegen.jai";
|
#load "Codegen.jai";
|
||||||
|
|
||||||
|
|
||||||
add_define :: (env : *Environment, key : string) {
|
add_define :: (env : *Environment, key : string) {
|
||||||
for define : env.defines {
|
for define : env.defines {
|
||||||
if define == key {
|
if define == key {
|
||||||
|
|||||||
Reference in New Issue
Block a user