aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/lib/io.felan2
-rw-r--r--code/main.felan10
-rw-r--r--src/compiler/ast-tree.c75
-rw-r--r--src/compiler/ast-tree.h2
-rw-r--r--src/compiler/lexer.c19
-rw-r--r--src/compiler/lexer.h1
-rw-r--r--src/compiler/parser.c10
-rw-r--r--src/compiler/parser.h1
-rw-r--r--src/runner/runner.c4
9 files changed, 97 insertions, 27 deletions
diff --git a/code/lib/io.felan b/code/lib/io.felan
index 1fe7cf9..3019092 100644
--- a/code/lib/io.felan
+++ b/code/lib/io.felan
@@ -1,7 +1,7 @@
@import("types.felan");
@import("operator.felan");
-libc :: @c_library("/lib/libc.so.6");
+libc :: @c_library("/usr/lib/libc.so.6");
puts :: @c_function(libc,"puts",(*u8)->i32);
putchar :: @c_function(libc,"putchar",(i32)->void);
diff --git a/code/main.felan b/code/main.felan
index 90b1d08..8b5903e 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,6 +1,12 @@
-@import("basic.felan");
+@import("lib/operator.felan");
+
+print :: (value:anytype) -> void {
+ if @type_of(value) == u8 {
+ @putc(value);
+ }
+};
main :: ()->void{
- print(1234);
+ print('a');
};
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,
diff --git a/src/runner/runner.c b/src/runner/runner.c
index 633e202..04f26b6 100644
--- a/src/runner/runner.c
+++ b/src/runner/runner.c
@@ -1567,6 +1567,7 @@ AstTree *runExpression(AstTree *expr, AstTreeScope *scope, bool *shouldRet,
return ret;
}
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_BOOL:
@@ -2197,6 +2198,7 @@ AstTree *toRawValue(AstTree *value) {
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
case AST_TREE_TOKEN_SCOPE:
case AST_TREE_TOKEN_NONE:
+ case AST_TREE_TOKEN_TYPE_ANY_TYPE:
case AST_TREE_TOKEN_BUILTIN_SIZE_OF:
case AST_TREE_TOKEN_BUILTIN_C_LIBRARY:
case AST_TREE_TOKEN_BUILTIN_C_FUNCTION:
@@ -2402,6 +2404,7 @@ AstTree *castTo(AstTree *tree, AstTree *to) {
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
case AST_TREE_TOKEN_SCOPE:
case AST_TREE_TOKEN_NONE:
+ case AST_TREE_TOKEN_TYPE_ANY_TYPE:
case AST_TREE_TOKEN_BUILTIN_SIZE_OF:
case AST_TREE_TOKEN_BUILTIN_C_LIBRARY:
case AST_TREE_TOKEN_BUILTIN_C_FUNCTION:
@@ -2549,6 +2552,7 @@ ffi_type *toFFIType(AstTree *type) {
case AST_TREE_TOKEN_OPERATOR_SHIFT_RIGHT:
case AST_TREE_TOKEN_OPERATOR_ARRAY_ACCESS:
case AST_TREE_TOKEN_SCOPE:
+ case AST_TREE_TOKEN_TYPE_ANY_TYPE:
case AST_TREE_TOKEN_NONE:
}
printLog("%s", AST_TREE_TOKEN_STRINGS[type->token]);