Add missing codegen for minusequals and etc. Do proper type checking on else blocks. Spread single arg constructors not supported in hlsl.
This commit is contained in:
33
Codegen.jai
33
Codegen.jai
@@ -190,6 +190,24 @@ emit_call :: (state : *Codegen_State, node : *AST_Node, indentation : int) {
|
|||||||
append(*state.builder, ", ");
|
append(*state.builder, ", ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if starts_with(node.name, "float") && node.children[0].children.count == 1 {
|
||||||
|
args := node.children[0];
|
||||||
|
|
||||||
|
print_to_builder(*state.builder, "%(", node.name);
|
||||||
|
|
||||||
|
number : string;
|
||||||
|
number.data = *node.name.data[5];
|
||||||
|
number.count = node.name.count - 5;
|
||||||
|
count := parse_int(*number, s32);
|
||||||
|
|
||||||
|
for i : 0..count - 1 {
|
||||||
|
child := args.children[0];
|
||||||
|
emit_node(state, child, 0);
|
||||||
|
|
||||||
|
if i != count - 1 {
|
||||||
|
append(*state.builder, ", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
print_to_builder(*state.builder, "%(", node.name);
|
print_to_builder(*state.builder, "%(", node.name);
|
||||||
@@ -354,6 +372,21 @@ emit_operator :: (state : *Codegen_State, op_kind : Token_Kind) {
|
|||||||
case .TOKEN_SLASH; {
|
case .TOKEN_SLASH; {
|
||||||
append(*state.builder, "/");
|
append(*state.builder, "/");
|
||||||
}
|
}
|
||||||
|
case .TOKEN_MINUSEQUALS; {
|
||||||
|
append(*state.builder, "-=");
|
||||||
|
}
|
||||||
|
case .TOKEN_PLUSEQUALS; {
|
||||||
|
append(*state.builder, "+=");
|
||||||
|
}
|
||||||
|
case .TOKEN_DIVEQUALS; {
|
||||||
|
append(*state.builder, "/=");
|
||||||
|
}
|
||||||
|
case .TOKEN_TIMESEQUALS; {
|
||||||
|
append(*state.builder, "*=");
|
||||||
|
}
|
||||||
|
case .TOKEN_MODEQUALS; {
|
||||||
|
append(*state.builder, "%=");
|
||||||
|
}
|
||||||
case .TOKEN_ISEQUAL; {
|
case .TOKEN_ISEQUAL; {
|
||||||
append(*state.builder, "==");
|
append(*state.builder, "==");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1506,7 +1506,11 @@ check_node :: (checker : *Semantic_Checker, node : *AST_Node) -> Type_Variable_H
|
|||||||
body_var := check_block(checker, node.children[1]);
|
body_var := check_block(checker, node.children[1]);
|
||||||
|
|
||||||
if node.children.count == 3 {
|
if node.children.count == 3 {
|
||||||
else_var := check_node(checker, node.children[2]);
|
if node.children[2].kind == .If {
|
||||||
|
check_node(checker, node.children[2]);
|
||||||
|
} else {
|
||||||
|
check_block(checker, node.children[2]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case .Variable; {
|
case .Variable; {
|
||||||
|
|||||||
@@ -285,3 +285,5 @@ int4x4 :: struct {
|
|||||||
#foreign lerp :: (float2, float2, float) -> float2;
|
#foreign lerp :: (float2, float2, float) -> float2;
|
||||||
#foreign lerp :: (float3, float3, float) -> float3;
|
#foreign lerp :: (float3, float3, float) -> float3;
|
||||||
#foreign lerp :: (float4, float4, float) -> float4;
|
#foreign lerp :: (float4, float4, float) -> float4;
|
||||||
|
|
||||||
|
#foreign fmod :: (float, float) -> float;
|
||||||
|
|||||||
Reference in New Issue
Block a user