From 5d9a1ab17baa4e6f1b0543d92e849c06a56ccf59 Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Wed, 16 Apr 2025 10:39:34 +0330
Subject: add better array type system

---
 code/main.felan         | 71 +++----------------------------------------------
 src/compiler/ast-tree.c | 56 +++++++++++++++++++++++---------------
 2 files changed, 38 insertions(+), 89 deletions(-)

diff --git a/code/main.felan b/code/main.felan
index 23c774b..470479f 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -5,76 +5,11 @@ main :: () -> void {
     putc a[i];
     i += 1;
   }
+  print(a);
 };
 
-print :: (value:[10]u8)->void{
-  println(23);
-};
-
-println :: ()->void{
-  putc '\n';
-};
-
-println :: (value:i64)->void{
-  print(value);
-  putc '\n';
-};
-
-println :: (value:u64)->void{
-  print(value);
-  putc '\n';
-};
-
-println :: (value:bool)->void{
-  print(value);
-  putc '\n';
-};
-
-print :: (value:i64)->void{
-  value := value;
-  a : [20]u8 = undefined;
+print :: (value:[]u8)->void{
   i := 0;
-  while {
-    a[i] = '0' + @cast(value % 10,u8);
-    i += 1;
-    value /= 10;
-    value != 0;
-  } {}
-
-  while i > 0 {
-    putc a[i-1];
-    i -= 1;
-  }
-};
-
-print :: (value:u64)->void{
-  value := value;
-  a : [20]u8 = undefined;
-  i := 0;
-  while {
-    a[i] = '0' + @cast(value % 10,u8);
-    i += 1;
-    value /= 10;
-    value != 0;
-  } {}
-
-  while i > 0 {
-    putc a[i-1];
-    i -= 1;
-  }
+  putc 'h';
 };
 
-print :: (value:bool)->void{
-  if value {
-    putc 't';
-    putc 'r';
-    putc 'u';
-    putc 'e';
-  }else{
-    putc 'f';
-    putc 'a';
-    putc 'l';
-    putc 's';
-    putc 'e';
-  }
-};
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index b8fe4a0..ab12408 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -2029,10 +2029,16 @@ AstTree *astTreeParseString(ParserNode *parserNode, AstTreeHelper *helper) {
 
   AstTreeBracket *type_metadata = a404m_malloc(sizeof(*type_metadata));
   type_metadata->operand = &AST_TREE_U8_TYPE;
+
+  AstTreeInt *parameter_metadata = a404m_malloc(sizeof(*parameter_metadata));
+  *parameter_metadata = metadata->variables.size;
+  AstTree *parameter = newAstTree(AST_TREE_TOKEN_VALUE_INT, parameter_metadata,
+                                  &AST_TREE_I64_TYPE, NULL, NULL);
+
   type_metadata->parameters.size = 1;
   type_metadata->parameters.data = a404m_malloc(
       type_metadata->parameters.size * sizeof(*type_metadata->parameters.data));
-  type_metadata->parameters.data[0] = &AST_TREE_U8_TYPE;
+  type_metadata->parameters.data[0] = parameter;
 
   return newAstTree(AST_TREE_TOKEN_VALUE_OBJECT, metadata,
                     newAstTree(AST_TREE_TOKEN_TYPE_ARRAY, type_metadata,
@@ -3045,14 +3051,20 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) {
     return typeIsEqual(type0_metadata, type1_metadata);
   }
   case AST_TREE_TOKEN_TYPE_ARRAY: {
-    if (type1->token != type0->token)
+    if (type1->token != type0->token) {
       return false;
+    }
 
     AstTreeBracket *type0_metadata = type0->metadata;
     AstTreeBracket *type1_metadata = type1->metadata;
 
-    if (!typeIsEqual(type0_metadata->operand, type1_metadata->operand) ||
-        type0_metadata->parameters.size != type1_metadata->parameters.size) {
+    if (!typeIsEqual(type0_metadata->operand, type1_metadata->operand)) {
+      return false;
+    } else if (type0_metadata->parameters.size == 0 ||
+               type1_metadata->parameters.size == 0) {
+      return true;
+    } else if (type0_metadata->parameters.size !=
+               type1_metadata->parameters.size) {
       return false;
     }
 
@@ -4558,28 +4570,30 @@ bool setTypesTypeArray(AstTree *tree, AstTreeSetTypesHelper helper) {
     return false;
   }
 
-  if (metadata->parameters.size != 1) {
+  if (metadata->parameters.size == 0) {
+    // left empty
+  } else if (metadata->parameters.size == 1) {
+    AstTreeSetTypesHelper newHelper = {
+        .lookingType = &AST_TREE_U64_TYPE,
+        .dependencies = helper.dependencies,
+    };
+
+    for (size_t i = 0; i < metadata->parameters.size; ++i) {
+      AstTree *param = metadata->parameters.data[i];
+      if (!setAllTypes(param, newHelper, NULL, NULL)) {
+        return false;
+      } else if (!isIntType(param->type)) {
+        printError(param->str_begin, param->str_end,
+                   "Should only be int (for now)");
+        return false;
+      }
+    }
+  } else {
     printError(tree->str_begin, tree->str_end,
                "Multiple param in array is not yet supported");
     return false;
   }
 
-  AstTreeSetTypesHelper newHelper = {
-      .lookingType = &AST_TREE_U64_TYPE,
-      .dependencies = helper.dependencies,
-  };
-
-  for (size_t i = 0; i < metadata->parameters.size; ++i) {
-    AstTree *param = metadata->parameters.data[i];
-    if (!setAllTypes(param, newHelper, NULL, NULL)) {
-      return false;
-    } else if (!isIntType(param->type)) {
-      printError(param->str_begin, param->str_end,
-                 "Should only be int (for now)");
-      return false;
-    }
-  }
-
   tree->type = copyAstTree(&AST_TREE_TYPE_TYPE);
   return true;
 }
-- 
cgit v1.2.3