aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--code/main.felan28
-rw-r--r--src/compiler/ast-tree.c115
-rw-r--r--src/compiler/ast-tree.h2
3 files changed, 23 insertions, 122 deletions
diff --git a/code/main.felan b/code/main.felan
index b13442c..c146dce 100644
--- a/code/main.felan
+++ b/code/main.felan
@@ -1,33 +1,11 @@
-// @import("basic.felan");
+@import("basic.felan");
-/*
t :: (comptime b:u8) -> void {
print(b);
};
-*/
-
-__equal__ :: (a:u8,b:u8) -> bool {
- return @equal(a,b);
-};
-
-h :: (a:u8,b:u8) macro -> void {
- if a == 0u8 {
- if b == 0u8 {
- @putc('0');
- }else{
- @putc('1');
- }
- }else{
- @putc('2');
- }
-};
-
-f :: (a:u8,c:u8) -> u8 {
- @putc(c);
- return a;
-};
main :: () -> void {
- h(f(1u8,'a'),f(0u8,'b'));
+ a := 3u8;
+ t(2u8);
};
diff --git a/src/compiler/ast-tree.c b/src/compiler/ast-tree.c
index 3dd2308..f2b3ca3 100644
--- a/src/compiler/ast-tree.c
+++ b/src/compiler/ast-tree.c
@@ -5891,92 +5891,7 @@ bool setTypesFunction(AstTree *tree, AstTreeSetTypesHelper _helper) {
return true;
}
- // TODO: do something about macros
-
- AstTreeSetTypesHelper helper = {
- .lookingType = NULL,
- .dependencies = _helper.dependencies,
- .variables.data =
- a404m_malloc((_helper.variables.size + metadata->arguments.size +
- metadata->scope.variables.size) *
- sizeof(*helper.variables.data)),
- .variables.size = _helper.variables.size,
- .root = _helper.root,
- .loops = NULL,
- .loops_size = 0,
- .scope = &metadata->scope,
- .isInScope = true,
- };
-
- for (size_t i = 0; i < _helper.variables.size; ++i) {
- helper.variables.data[i] = _helper.variables.data[i];
- }
-
- AstTreeVariable *deps[helper.dependencies.size];
- size_t deps_size = 0;
-
- for (size_t i = 0; i < metadata->arguments.size; ++i) {
- AstTreeVariable *variable = metadata->arguments.data[i];
- if (!setTypesAstVariable(variable, helper)) {
- return false;
- }
- helper.variables.data[helper.variables.size++] = variable;
- }
-
- if (!setAllTypes(metadata->returnType, helper, NULL, NULL)) {
- return false;
- }
- metadata->returnType = getValue(metadata->returnType, false, helper.scope);
-
- tree->type = makeTypeOf(tree);
-
- for (size_t i = 0; i < helper.dependencies.size; ++i) {
- AstTreeVariable *var = helper.dependencies.data[i];
- if (var->value == tree || var->initValue == tree) {
- continue;
- }
- deps[deps_size] = helper.dependencies.data[i];
- deps_size += 1;
- }
-
- helper.dependencies.data = deps;
- helper.dependencies.size = deps_size;
-
- for (size_t i = 0; i < metadata->scope.variables.size; ++i) {
- AstTreeVariable *variable = metadata->scope.variables.data[i];
- if (variable->isConst) {
- if (!setTypesAstVariable(variable, helper)) {
- return false;
- }
- helper.variables.data[helper.variables.size++] = variable;
- }
- }
-
- for (size_t i = 0; i < metadata->scope.expressions_size; ++i) {
- AstTree *expr = metadata->scope.expressions[i];
- if (expr->token == AST_TREE_TOKEN_VARIABLE_DEFINE) {
- AstTreeVariable *variable = expr->metadata;
- if (!setTypesAstVariable(variable, helper)) {
- return false;
- }
- size_t variables_capacity =
- a404m_malloc_usable_size(helper.variables.data) /
- sizeof(*helper.variables.data);
- if (variables_capacity == helper.variables.size) {
- variables_capacity += variables_capacity / 2 + 1;
- helper.variables.data =
- a404m_realloc(helper.variables.data,
- variables_capacity * sizeof(*helper.variables.data));
- }
- helper.variables.data[helper.variables.size++] = variable;
- }
- if (!setAllTypes(expr, helper, metadata, NULL)) {
- return false;
- }
- }
-
- free(helper.variables.data);
- return true;
+ return setTypesAstFunction(metadata, tree, _helper);
}
bool setTypesReturn(AstTree *tree, AstTreeSetTypesHelper _helper,
@@ -6149,7 +6064,7 @@ bool setTypesFunctionCall(AstTree *tree, AstTreeSetTypesHelper _helper) {
AstTreeFunction *function =
copyAstTreeFunction(macro->function, NULL, NULL, 0, true);
- if (!setTypesAstFunction(function, helper)) {
+ if (!setTypesAstFunction(function,NULL, helper)) {
astTreeFunctionDestroy(*function);
free(function);
return false;
@@ -8003,7 +7918,7 @@ bool setTypesAstInfix(AstTreePureInfix *infix, AstTreeSetTypesHelper _helper) {
return setAllTypes(infix->right, helper, NULL, NULL);
}
-bool setTypesAstFunction(AstTreeFunction *metadata,
+bool setTypesAstFunction(AstTreeFunction *metadata, AstTree *tree,
AstTreeSetTypesHelper _helper) {
AstTreeSetTypesHelper helper = {
.lookingType = NULL,
@@ -8011,11 +7926,11 @@ bool setTypesAstFunction(AstTreeFunction *metadata,
.variables.data =
a404m_malloc((_helper.variables.size + metadata->arguments.size +
metadata->scope.variables.size) *
- sizeof(*_helper.variables.data)),
+ sizeof(*helper.variables.data)),
.variables.size = _helper.variables.size,
.root = _helper.root,
- .loops = _helper.loops,
- .loops_size = _helper.loops_size,
+ .loops = NULL,
+ .loops_size = 0,
.scope = &metadata->scope,
.isInScope = true,
};
@@ -8040,9 +7955,17 @@ bool setTypesAstFunction(AstTreeFunction *metadata,
}
metadata->returnType = getValue(metadata->returnType, false, helper.scope);
- for (size_t i = 0; i < helper.dependencies.size; ++i) {
- deps[deps_size] = helper.dependencies.data[i];
- deps_size += 1;
+ if (tree != NULL) {
+ tree->type = makeTypeOf(tree);
+
+ for (size_t i = 0; i < helper.dependencies.size; ++i) {
+ AstTreeVariable *var = helper.dependencies.data[i];
+ if (var->value == tree || var->initValue == tree) {
+ continue;
+ }
+ deps[deps_size] = helper.dependencies.data[i];
+ deps_size += 1;
+ }
}
helper.dependencies.data = deps;
@@ -8185,7 +8108,7 @@ AstTreeVariable *setTypesFindVariable(const char *name_begin,
AstTreeFunction *function =
copyAstTreeFunction(macro->function, NULL, NULL, 0, true);
- if (!setTypesAstFunction(function, helper)) {
+ if (!setTypesAstFunction(function,NULL, helper)) {
astTreeFunctionDestroy(*function);
free(function);
return NULL;
@@ -8378,7 +8301,7 @@ AstTree *getShapeShifterElement(AstTreeFunctionCall *metadata,
newHelper.variables.size += 1;
}
- if (!setTypesAstFunction(newFunction, helper)) {
+ if (!setTypesAstFunction(newFunction,NULL, helper)) {
return NULL;
}
diff --git a/src/compiler/ast-tree.h b/src/compiler/ast-tree.h
index 7d4eb84..f6d9394 100644
--- a/src/compiler/ast-tree.h
+++ b/src/compiler/ast-tree.h
@@ -555,7 +555,7 @@ bool setTypesBuiltinCFunction(AstTree *tree, AstTreeSetTypesHelper helper,
bool setTypesBuiltinInsert(AstTree *tree, AstTreeSetTypesHelper helper,
AstTreeFunctionCall *functionCall);
bool setTypesTypeArray(AstTree *tree, AstTreeSetTypesHelper helper);
-bool setTypesAstFunction(AstTreeFunction *function,
+bool setTypesAstFunction(AstTreeFunction *function,AstTree *tree,
AstTreeSetTypesHelper helper);
bool setTypesAstVariable(AstTreeVariable *variable,