From 9c7d2cad8ef9bcc019af3924fb72dd896c8c77e7 Mon Sep 17 00:00:00 2001
From: A404M <ahmadmahmoudiprogrammer@gmail.com>
Date: Thu, 29 May 2025 21:44:10 +0330
Subject: add any type

---
 src/compiler/ast-tree.c | 75 ++++++++++++++++++++++++++++++++++++++-----------
 src/compiler/ast-tree.h |  2 ++
 src/compiler/lexer.c    | 19 +++++++------
 src/compiler/lexer.h    |  1 +
 src/compiler/parser.c   | 10 +++++++
 src/compiler/parser.h   |  1 +
 6 files changed, 84 insertions(+), 24 deletions(-)

(limited to 'src/compiler')

diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index d89f816..497a791 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -19,6 +19,14 @@ AstTree AST_TREE_TYPE_TYPE = {
     .str_end = NULL,
 };
 
+AstTree AST_TREE_TYPE_ANY_TYPE = {
+    .token = AST_TREE_TOKEN_TYPE_ANY_TYPE,
+    .metadata = NULL,
+    .type = &AST_TREE_TYPE_TYPE,
+    .str_begin = NULL,
+    .str_end = NULL,
+};
+
 AstTree AST_TREE_VOID_TYPE = {
     .token = AST_TREE_TOKEN_TYPE_VOID,
     .metadata = NULL,
@@ -216,6 +224,7 @@ const char *AST_TREE_TOKEN_STRINGS[] = {
     "AST_TREE_TOKEN_TYPE_FUNCTION",
     "AST_TREE_TOKEN_TYPE_ARRAY",
     "AST_TREE_TOKEN_TYPE_TYPE",
+    "AST_TREE_TOKEN_TYPE_ANY_TYPE",
     "AST_TREE_TOKEN_TYPE_VOID",
     "AST_TREE_TOKEN_TYPE_I8",
     "AST_TREE_TOKEN_TYPE_U8",
@@ -368,6 +377,7 @@ void astTreePrint(const AstTree *tree, int indent) {
   case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
   case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_I8:
   case AST_TREE_TOKEN_TYPE_U8:
@@ -820,6 +830,7 @@ void astTreeDestroy(AstTree tree) {
   case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
   case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_I8:
   case AST_TREE_TOKEN_TYPE_U8:
@@ -1087,12 +1098,12 @@ void astTreeDelete(AstTree *tree) {
 }
 
 bool astTreeShouldDelete(AstTree *tree) {
-  return tree != &AST_TREE_TYPE_TYPE && tree != &AST_TREE_VOID_TYPE &&
-         tree != &AST_TREE_BOOL_TYPE && tree != &AST_TREE_I8_TYPE &&
-         tree != &AST_TREE_U8_TYPE && tree != &AST_TREE_I16_TYPE &&
-         tree != &AST_TREE_U16_TYPE && tree != &AST_TREE_I32_TYPE &&
-         tree != &AST_TREE_U32_TYPE && tree != &AST_TREE_I64_TYPE &&
-         tree != &AST_TREE_U64_TYPE &&
+  return tree != &AST_TREE_TYPE_TYPE && tree != &AST_TREE_TYPE_ANY_TYPE &&
+         tree != &AST_TREE_VOID_TYPE && tree != &AST_TREE_BOOL_TYPE &&
+         tree != &AST_TREE_I8_TYPE && tree != &AST_TREE_U8_TYPE &&
+         tree != &AST_TREE_I16_TYPE && tree != &AST_TREE_U16_TYPE &&
+         tree != &AST_TREE_I32_TYPE && tree != &AST_TREE_U32_TYPE &&
+         tree != &AST_TREE_I64_TYPE && tree != &AST_TREE_U64_TYPE &&
 #ifdef FLOAT_16_SUPPORT
          tree != &AST_TREE_F16_TYPE &&
 #endif
@@ -1153,6 +1164,7 @@ AstTree *copyAstTreeBack(AstTree *tree, AstTreeVariables oldVariables[],
   }
   switch (tree->token) {
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_TYPE_I8:
@@ -2191,6 +2203,7 @@ AstTreeRoot *makeAstRoot(const ParserNode *parsedRoot, char *filePath) {
       case PARSER_TOKEN_KEYWORD_WHILE:
       case PARSER_TOKEN_KEYWORD_COMPTIME:
       case PARSER_TOKEN_TYPE_TYPE:
+      case PARSER_TOKEN_TYPE_ANY_TYPE:
       case PARSER_TOKEN_TYPE_FUNCTION:
       case PARSER_TOKEN_TYPE_VOID:
       case PARSER_TOKEN_TYPE_I8:
@@ -2388,6 +2401,8 @@ AstTree *astTreeParse(const ParserNode *parserNode) {
     return astTreeParseKeyword(parserNode, AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT);
   case PARSER_TOKEN_TYPE_TYPE:
     return &AST_TREE_TYPE_TYPE;
+  case PARSER_TOKEN_TYPE_ANY_TYPE:
+    return &AST_TREE_TYPE_ANY_TYPE;
   case PARSER_TOKEN_TYPE_FUNCTION:
     return astTreeParseTypeFunction(parserNode);
   case PARSER_TOKEN_TYPE_VOID:
@@ -2654,6 +2669,7 @@ AstTree *astTreeParseFunction(const ParserNode *parserNode) {
     case PARSER_TOKEN_VALUE_CHAR:
     case PARSER_TOKEN_VALUE_STRING:
     case PARSER_TOKEN_TYPE_TYPE:
+    case PARSER_TOKEN_TYPE_ANY_TYPE:
     case PARSER_TOKEN_TYPE_FUNCTION:
     case PARSER_TOKEN_TYPE_VOID:
     case PARSER_TOKEN_TYPE_I8:
@@ -3268,6 +3284,7 @@ AstTree *astTreeParseCurlyBracket(const ParserNode *parserNode) {
     case PARSER_TOKEN_VALUE_CHAR:
     case PARSER_TOKEN_VALUE_STRING:
     case PARSER_TOKEN_TYPE_TYPE:
+    case PARSER_TOKEN_TYPE_ANY_TYPE:
     case PARSER_TOKEN_TYPE_FUNCTION:
     case PARSER_TOKEN_TYPE_VOID:
     case PARSER_TOKEN_TYPE_I8:
@@ -3555,7 +3572,8 @@ bool isFunction(AstTree *value) {
 
 bool isShapeShifter(AstTreeFunction *function) {
   for (size_t i = 0; i < function->arguments.size; ++i) {
-    if (function->arguments.data[i]->isConst) {
+    if (function->arguments.data[i]->isConst ||
+        function->arguments.data[i]->type == &AST_TREE_TYPE_ANY_TYPE) {
       return true;
     }
   }
@@ -3596,6 +3614,7 @@ bool isConst(AstTree *tree) {
   case AST_TREE_TOKEN_BUILTIN_SHIFT_LEFT:
   case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_FUNCTION:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_I8:
@@ -3738,6 +3757,7 @@ bool isConst(AstTree *tree) {
 AstTree *makeTypeOf(AstTree *value) {
   switch (value->token) {
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_FUNCTION:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_I8:
@@ -3983,6 +4003,10 @@ bool typeIsEqual(AstTree *type0, AstTree *type1) {
 }
 
 bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) {
+  if (type0->token == AST_TREE_TOKEN_TYPE_ANY_TYPE ||
+      type1->token == AST_TREE_TOKEN_TYPE_ANY_TYPE) {
+    return true;
+  }
   switch (type0->token) {
   case AST_TREE_TOKEN_BUILTIN_CAST:
   case AST_TREE_TOKEN_BUILTIN_TYPE_OF:
@@ -4066,6 +4090,7 @@ bool typeIsEqualBack(const AstTree *type0, const AstTree *type1) {
   case AST_TREE_TOKEN_SHAPE_SHIFTER_ELEMENT:
     return false;
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_I8:
   case AST_TREE_TOKEN_TYPE_U8:
@@ -4211,6 +4236,7 @@ AstTree *getValue(AstTree *tree, bool copy) {
   case AST_TREE_TOKEN_BUILTIN_SHIFT_RIGHT:
   case AST_TREE_TOKEN_TYPE_FUNCTION:
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_I8:
   case AST_TREE_TOKEN_TYPE_U8:
@@ -4379,6 +4405,7 @@ bool isIntType(AstTree *type) {
   case AST_TREE_TOKEN_TYPE_FUNCTION:
   case AST_TREE_TOKEN_TYPE_ARRAY:
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
 #ifdef FLOAT_16_SUPPORT
   case AST_TREE_TOKEN_TYPE_F16:
@@ -4500,6 +4527,7 @@ bool isFloatType(AstTree *type) {
   case AST_TREE_TOKEN_TYPE_FUNCTION:
   case AST_TREE_TOKEN_TYPE_ARRAY:
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_NAMESPACE:
@@ -4565,6 +4593,7 @@ bool isEqual(AstTree *left, AstTree *right) {
   }
   switch (left->token) {
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_I8:
   case AST_TREE_TOKEN_TYPE_U8:
@@ -4881,6 +4910,7 @@ bool setAllTypes(AstTree *tree, AstTreeSetTypesHelper helper,
   }
   switch (tree->token) {
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_BOOL:
   case AST_TREE_TOKEN_TYPE_I8:
@@ -5581,6 +5611,9 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) {
             if (arg->isConst) {
               arg->value = getValue(param.value, true);
             }
+            if (arg->type == &AST_TREE_TYPE_ANY_TYPE) {
+              arg->type = copyAstTree(param.value->type);
+            }
             initedArguments[j] = param;
             goto END_OF_NAMED_FOR1;
           }
@@ -5601,6 +5634,9 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) {
             if (arg->isConst) {
               arg->value = getValue(param.value, true);
             }
+            if (arg->type == &AST_TREE_TYPE_ANY_TYPE) {
+              arg->type = copyAstTree(param.value->type);
+            }
             initedArguments[j] = param;
             goto END_OF_UNNAMED_FOR1;
           }
@@ -5634,19 +5670,24 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) {
         continue;
 
       for (size_t i = 0; i < metadata->parameters_size; ++i) {
-        if (!shapeShifter->function->arguments.data[i]->isConst)
-          continue;
-
         AstTreeFunctionCallParam p0 = metadata->parameters[i];
         AstTreeFunctionCallParam p1 = call->parameters[i];
-        AstTree *v0 = getValue(p0.value, true);
-        AstTree *v1 = getValue(p1.value, true);
-        bool res = isEqual(v0, v1);
-        astTreeDelete(v0);
-        astTreeDelete(v1);
-        if (!res) {
+        if (!typeIsEqual(p0.value->type, p1.value->type)) {
           goto SEARCH_LOOP_CONTINUE;
         }
+        if (shapeShifter->function->arguments.data[i]->isConst) {
+          AstTree *v0 = getValue(p0.value, true);
+          AstTree *v1 = getValue(p1.value, true);
+
+          bool res = isEqual(v0, v1);
+
+          astTreeDelete(v0);
+          astTreeDelete(v1);
+
+          if (!res) {
+            goto SEARCH_LOOP_CONTINUE;
+          }
+        }
       }
       element_index = i;
       astTreeFunctionDestroy(*newFunction);
@@ -6789,6 +6830,7 @@ bool setTypesBuiltinUnary(AstTree *tree, AstTreeSetTypesHelper helper,
   case AST_TREE_TOKEN_TYPE_FUNCTION:
   case AST_TREE_TOKEN_TYPE_ARRAY:
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_VOID:
   case AST_TREE_TOKEN_TYPE_CODE:
   case AST_TREE_TOKEN_TYPE_NAMESPACE:
@@ -7808,6 +7850,7 @@ size_t getSizeOfType(AstTree *type) {
   case AST_TREE_TOKEN_TYPE_F32:
     return 4;
   case AST_TREE_TOKEN_TYPE_TYPE:
+  case AST_TREE_TOKEN_TYPE_ANY_TYPE:
   case AST_TREE_TOKEN_TYPE_FUNCTION:
   case AST_TREE_TOKEN_TYPE_I64:
   case AST_TREE_TOKEN_TYPE_U64:
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index 63e24b0..904d6f7 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -49,6 +49,7 @@ typedef enum AstTreeToken {
   AST_TREE_TOKEN_TYPE_ARRAY,
   AST_TREE_TOKEN_TYPE_TYPE,
   AST_TREE_TOKEN_STATIC_VARS_BEGIN = AST_TREE_TOKEN_TYPE_TYPE,
+  AST_TREE_TOKEN_TYPE_ANY_TYPE,
   AST_TREE_TOKEN_TYPE_VOID,
   AST_TREE_TOKEN_TYPE_I8,
   AST_TREE_TOKEN_TYPE_U8,
@@ -136,6 +137,7 @@ typedef struct AstTree {
 } AstTree;
 
 extern AstTree AST_TREE_TYPE_TYPE;
+extern AstTree AST_TREE_TYPE_ANY_TYPE;
 extern AstTree AST_TREE_VOID_TYPE;
 extern AstTree AST_TREE_BOOL_TYPE;
 extern AstTree AST_TREE_I8_TYPE;
diff --git a/src/compiler/lexer.c b/src/compiler/lexer.c
index f79868a..08ecc6e 100644
--- a/src/compiler/lexer.c
+++ b/src/compiler/lexer.c
@@ -40,6 +40,7 @@ const char *LEXER_TOKEN_STRINGS[] = {
     "LEXER_TOKEN_BUILTIN_SHIFT_LEFT",
     "LEXER_TOKEN_BUILTIN_SHIFT_RIGHT",
     "LEXER_TOKEN_KEYWORD_TYPE",
+    "LEXER_TOKEN_KEYWORD_ANY_TYPE",
     "LEXER_TOKEN_KEYWORD_VOID",
     "LEXER_TOKEN_KEYWORD_I8",
     "LEXER_TOKEN_KEYWORD_U8",
@@ -188,9 +189,9 @@ static const size_t LEXER_SYMBOL_SIZE =
     sizeof(LEXER_SYMBOL_TOKENS) / sizeof(*LEXER_SYMBOL_TOKENS);
 
 static const char *LEXER_KEYWORD_STRINGS[] = {
-    "type",      "void",          "i8",       "u8",
-    "i16",       "u16",           "i32",      "u32",
-    "i64",       "u64",
+    "type",      "anytype",       "void",     "i8",
+    "u8",        "i16",           "u16",      "i32",
+    "u32",       "i64",           "u64",
 #ifdef FLOAT_16_SUPPORT
     "f16",
 #endif
@@ -202,11 +203,12 @@ static const char *LEXER_KEYWORD_STRINGS[] = {
     "c_library", "c_function",
 };
 static const LexerToken LEXER_KEYWORD_TOKENS[] = {
-    LEXER_TOKEN_KEYWORD_TYPE,      LEXER_TOKEN_KEYWORD_VOID,
-    LEXER_TOKEN_KEYWORD_I8,        LEXER_TOKEN_KEYWORD_U8,
-    LEXER_TOKEN_KEYWORD_I16,       LEXER_TOKEN_KEYWORD_U16,
-    LEXER_TOKEN_KEYWORD_I32,       LEXER_TOKEN_KEYWORD_U32,
-    LEXER_TOKEN_KEYWORD_I64,       LEXER_TOKEN_KEYWORD_U64,
+    LEXER_TOKEN_KEYWORD_TYPE,      LEXER_TOKEN_KEYWORD_ANY_TYPE,
+    LEXER_TOKEN_KEYWORD_VOID,      LEXER_TOKEN_KEYWORD_I8,
+    LEXER_TOKEN_KEYWORD_U8,        LEXER_TOKEN_KEYWORD_I16,
+    LEXER_TOKEN_KEYWORD_U16,       LEXER_TOKEN_KEYWORD_I32,
+    LEXER_TOKEN_KEYWORD_U32,       LEXER_TOKEN_KEYWORD_I64,
+    LEXER_TOKEN_KEYWORD_U64,
 #ifdef FLOAT_16_SUPPORT
     LEXER_TOKEN_KEYWORD_F16,
 #endif
@@ -465,6 +467,7 @@ lexerPushClear(LexerNodeArray *array, size_t *array_size, char const *iter,
     // fall through
   PUSH:
   case LEXER_TOKEN_KEYWORD_TYPE:
+  case LEXER_TOKEN_KEYWORD_ANY_TYPE:
   case LEXER_TOKEN_KEYWORD_VOID:
   case LEXER_TOKEN_KEYWORD_I8:
   case LEXER_TOKEN_KEYWORD_U8:
diff --git a/src/compiler/lexer.h b/src/compiler/lexer.h
index 8c2806d..f3292ae 100644
--- a/src/compiler/lexer.h
+++ b/src/compiler/lexer.h
@@ -42,6 +42,7 @@ typedef enum LexerToken {
   LEXER_TOKEN_BUILTIN_SHIFT_LEFT,
   LEXER_TOKEN_BUILTIN_SHIFT_RIGHT,
   LEXER_TOKEN_KEYWORD_TYPE,
+  LEXER_TOKEN_KEYWORD_ANY_TYPE,
   LEXER_TOKEN_KEYWORD_VOID,
   LEXER_TOKEN_KEYWORD_I8,
   LEXER_TOKEN_KEYWORD_U8,
diff --git a/src/compiler/parser.c b/src/compiler/parser.c
index e90d5fb..65fd3c9 100644
--- a/src/compiler/parser.c
+++ b/src/compiler/parser.c
@@ -48,6 +48,7 @@ const char *PARSER_TOKEN_STRINGS[] = {
     "PARSER_TOKEN_VALUE_STRING",
 
     "PARSER_TOKEN_TYPE_TYPE",
+    "PARSER_TOKEN_TYPE_ANY_TYPE",
     "PARSER_TOKEN_TYPE_FUNCTION",
     "PARSER_TOKEN_TYPE_VOID",
     "PARSER_TOKEN_TYPE_BOOL",
@@ -298,6 +299,7 @@ void parserNodePrint(const ParserNode *node, int indent) {
   case PARSER_TOKEN_BUILTIN_SHIFT_LEFT:
   case PARSER_TOKEN_BUILTIN_SHIFT_RIGHT:
   case PARSER_TOKEN_TYPE_TYPE:
+  case PARSER_TOKEN_TYPE_ANY_TYPE:
   case PARSER_TOKEN_TYPE_VOID:
   case PARSER_TOKEN_TYPE_BOOL:
   case PARSER_TOKEN_TYPE_I8:
@@ -620,6 +622,7 @@ void parserNodeDelete(ParserNode *node) {
   case PARSER_TOKEN_BUILTIN_SHIFT_LEFT:
   case PARSER_TOKEN_BUILTIN_SHIFT_RIGHT:
   case PARSER_TOKEN_TYPE_TYPE:
+  case PARSER_TOKEN_TYPE_ANY_TYPE:
   case PARSER_TOKEN_TYPE_VOID:
   case PARSER_TOKEN_TYPE_BOOL:
   case PARSER_TOKEN_TYPE_I8:
@@ -971,6 +974,8 @@ ParserNode *parseNode(LexerNode *node, LexerNode *begin, LexerNode *end,
     return parserNoMetadata(node, parent, PARSER_TOKEN_BUILTIN_SHIFT_RIGHT);
   case LEXER_TOKEN_KEYWORD_TYPE:
     return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_TYPE);
+  case LEXER_TOKEN_KEYWORD_ANY_TYPE:
+    return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_ANY_TYPE);
   case LEXER_TOKEN_KEYWORD_VOID:
     return parserNoMetadata(node, parent, PARSER_TOKEN_TYPE_VOID);
   case LEXER_TOKEN_KEYWORD_I8:
@@ -1810,6 +1815,7 @@ ParserNode *parserFunction(LexerNode *node, LexerNode *begin, LexerNode *end,
       case PARSER_TOKEN_VALUE_CHAR:
       case PARSER_TOKEN_VALUE_STRING:
       case PARSER_TOKEN_TYPE_TYPE:
+      case PARSER_TOKEN_TYPE_ANY_TYPE:
       case PARSER_TOKEN_TYPE_FUNCTION:
       case PARSER_TOKEN_TYPE_VOID:
       case PARSER_TOKEN_TYPE_BOOL:
@@ -2396,6 +2402,7 @@ bool isExpression(ParserNode *node) {
   case PARSER_TOKEN_KEYWORD_WHILE:
   case PARSER_TOKEN_KEYWORD_COMPTIME:
   case PARSER_TOKEN_TYPE_TYPE:
+  case PARSER_TOKEN_TYPE_ANY_TYPE:
   case PARSER_TOKEN_TYPE_FUNCTION:
   case PARSER_TOKEN_TYPE_VOID:
   case PARSER_TOKEN_TYPE_BOOL:
@@ -2516,6 +2523,7 @@ bool parserIsFunction(ParserNode *node) {
   case PARSER_TOKEN_KEYWORD_WHILE:
   case PARSER_TOKEN_KEYWORD_COMPTIME:
   case PARSER_TOKEN_TYPE_TYPE:
+  case PARSER_TOKEN_TYPE_ANY_TYPE:
   case PARSER_TOKEN_TYPE_FUNCTION:
   case PARSER_TOKEN_TYPE_VOID:
   case PARSER_TOKEN_TYPE_BOOL:
@@ -2555,6 +2563,7 @@ bool parserIsFunction(ParserNode *node) {
 bool isType(ParserNode *node) {
   switch (node->token) {
   case PARSER_TOKEN_TYPE_TYPE:
+  case PARSER_TOKEN_TYPE_ANY_TYPE:
   case PARSER_TOKEN_TYPE_FUNCTION:
   case PARSER_TOKEN_TYPE_VOID:
   case PARSER_TOKEN_TYPE_I8:
@@ -2742,6 +2751,7 @@ bool isValue(ParserNode *node) {
   case PARSER_TOKEN_OPERATOR_SHIFT_RIGHT:
   case PARSER_TOKEN_TYPE_FUNCTION:
   case PARSER_TOKEN_TYPE_TYPE:
+  case PARSER_TOKEN_TYPE_ANY_TYPE:
   case PARSER_TOKEN_TYPE_VOID:
   case PARSER_TOKEN_TYPE_BOOL:
   case PARSER_TOKEN_TYPE_I8:
diff --git a/src/compiler/parser.h b/src/compiler/parser.h
index dc48511..fd40078 100644
--- a/src/compiler/parser.h
+++ b/src/compiler/parser.h
@@ -45,6 +45,7 @@ typedef enum ParserToken {
   PARSER_TOKEN_VALUE_STRING,
 
   PARSER_TOKEN_TYPE_TYPE,
+  PARSER_TOKEN_TYPE_ANY_TYPE,
   PARSER_TOKEN_TYPE_FUNCTION,
   PARSER_TOKEN_TYPE_VOID,
   PARSER_TOKEN_TYPE_BOOL,
-- 
cgit v1.2.3