From 8e5ac02b143588f598a058f5a5ae44181e493ef4 Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Sun, 23 Feb 2025 17:56:14 +0330
Subject: fix inline if

---
 src/compiler/ast-tree.c | 20 +++++++++++++----
 src/compiler/parser.c   | 60 ++++++++++++++++++++++++-------------------------
 src/runner/runner.c     |  1 +
 test/main.felan         | 16 +++----------
 4 files changed, 50 insertions(+), 47 deletions(-)

diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 6f96f49..7c520aa 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -2048,6 +2048,13 @@ bool typeIsEqual(const AstTree *type0, const AstTree *type1) {
     if (type0_metadata->arguments_size != type1_metadata->arguments_size) {
       return false;
     }
+    for (size_t i = 0; i < type0_metadata->arguments_size; ++i) {
+      AstTree *p0 = type0_metadata->arguments[i];
+      AstTree *p1 = type1_metadata->arguments[i];
+      if (!typeIsEqual(p0, p1)) {
+        return false;
+      }
+    }
     return true;
   case AST_TREE_TOKEN_FUNCTION_CALL:
     printError(type0->str_begin, type0->str_end, "Not implemented yet");
@@ -2713,8 +2720,8 @@ bool setTypesIf(AstTree *tree, AstTreeSetTypesHelper helper,
   }
 
   if (metadata->elseBody != NULL &&
-      typeIsEqual(metadata->ifBody, metadata->elseBody)) {
-    tree->type = copyAstTree(metadata->ifBody);
+      typeIsEqual(metadata->ifBody->type, metadata->elseBody->type)) {
+    tree->type = copyAstTree(metadata->ifBody->type);
   } else {
     tree->type = &AST_TREE_VOID_TYPE;
   }
@@ -2745,8 +2752,6 @@ bool setTypesScope(AstTree *tree, AstTreeSetTypesHelper helper,
                    AstTreeFunction *function) {
   AstTreeScope *metadata = tree->metadata;
 
-  tree->type = &AST_TREE_VOID_TYPE;
-
   for (size_t i = 0; i < metadata->expressions_size; ++i) {
     if (!setAllTypes(metadata->expressions[i], helper, function)) {
       return false;
@@ -2759,6 +2764,13 @@ bool setTypesScope(AstTree *tree, AstTreeSetTypesHelper helper,
     }
   }
 
+  if (metadata->expressions_size == 0) {
+    tree->type = &AST_TREE_VOID_VALUE;
+  } else {
+    tree->type = copyAstTree(
+        metadata->expressions[metadata->expressions_size - 1]->type);
+  }
+
   return true;
 }
 
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index a47869d..2476e32 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -318,11 +318,11 @@ void parserNodePrint(const ParserNode *node, int indent) {
   }
     goto RETURN_SUCCESS;
   case PARSER_TOKEN_OPERATOR_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
-case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
   case PARSER_TOKEN_OPERATOR_SUM:
   case PARSER_TOKEN_OPERATOR_SUB:
   case PARSER_TOKEN_OPERATOR_MULTIPLY:
@@ -494,11 +494,11 @@ void parserNodeDelete(ParserNode *node) {
   }
     goto RETURN_SUCCESS;
   case PARSER_TOKEN_OPERATOR_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
-case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
   case PARSER_TOKEN_OPERATOR_SUM:
   case PARSER_TOKEN_OPERATOR_SUB:
   case PARSER_TOKEN_OPERATOR_MULTIPLY:
@@ -1154,11 +1154,11 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
       case PARSER_TOKEN_SYMBOL_PARENTHESIS:
       case PARSER_TOKEN_SYMBOL_COMMA:
       case PARSER_TOKEN_OPERATOR_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
-case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
+      case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
+      case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
+      case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
+      case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
+      case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
       case PARSER_TOKEN_OPERATOR_PLUS:
       case PARSER_TOKEN_OPERATOR_MINUS:
       case PARSER_TOKEN_OPERATOR_SUM:
@@ -1490,11 +1490,11 @@ bool isExpression(ParserNode *node) {
   case PARSER_TOKEN_KEYWORD_PRINT_U64:
   case PARSER_TOKEN_KEYWORD_RETURN:
   case PARSER_TOKEN_OPERATOR_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
-case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
   case PARSER_TOKEN_OPERATOR_PLUS:
   case PARSER_TOKEN_OPERATOR_MINUS:
   case PARSER_TOKEN_OPERATOR_SUM:
@@ -1576,11 +1576,11 @@ bool isType(ParserNode *node) {
   case PARSER_TOKEN_KEYWORD_PRINT_U64:
   case PARSER_TOKEN_KEYWORD_RETURN:
   case PARSER_TOKEN_OPERATOR_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
-case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
   case PARSER_TOKEN_OPERATOR_PLUS:
   case PARSER_TOKEN_OPERATOR_MINUS:
   case PARSER_TOKEN_OPERATOR_SUM:
@@ -1610,11 +1610,11 @@ bool isValue(ParserNode *node) {
   case PARSER_TOKEN_VALUE_BOOL:
   case PARSER_TOKEN_IDENTIFIER:
   case PARSER_TOKEN_OPERATOR_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
-case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
-case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
-case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUM_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_SUB_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MULTIPLY_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_DIVIDE_ASSIGN:
+  case PARSER_TOKEN_OPERATOR_MODULO_ASSIGN:
   case PARSER_TOKEN_OPERATOR_PLUS:
   case PARSER_TOKEN_OPERATOR_MINUS:
   case PARSER_TOKEN_OPERATOR_SUM:
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 81154f5..b5f0cb3 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -164,6 +164,7 @@ void runnerVariableSetValue(RunnerVariablePages *pages,
     }
   }
 
+  printError(variable->name_begin,variable->name_end,"Variable not found");
   UNREACHABLE;
 }
 
diff --git a/test/main.felan b/test/main.felan
index ca2694c..7d80a9c 100644
--- a/test/main.felan
+++ b/test/main.felan
@@ -1,16 +1,6 @@
 main :: () -> void {
-  a :getType(i64,u64)= 0;
-  while a < 10 {
-    print_u64 a;
-    a += 1;
-  }
+  a :u64= 2;
+  a += (if a == 2 1 else 2);
+  print_u64 a;
 };
 
-signed :: false;
-
-getType :: (a:type,b:type)->type {
-  if signed
-    return a;
-  else
-    return b;
-};
-- 
cgit v1.2.3