aboutsummaryrefslogtreecommitdiff
path: root/typecheck.c
diff options
context:
space:
mode:
Diffstat (limited to 'typecheck.c')
-rw-r--r--typecheck.c20
1 files changed, 5 insertions, 15 deletions
diff --git a/typecheck.c b/typecheck.c
index ce8b07ed..4938bc9d 100644
--- a/typecheck.c
+++ b/typecheck.c
@@ -578,8 +578,6 @@ type_t *get_type(env_t *env, ast_t *ast)
key_type = parse_type_ast(env, table->key_type);
value_type = parse_type_ast(env, table->value_type);
} else {
- if (table->default_value)
- value_type = get_type(env, table->default_value);
for (ast_list_t *entry = table->entries; entry; entry = entry->next) {
ast_t *entry_ast = entry->ast;
env_t *scope = env;
@@ -660,25 +658,16 @@ type_t *get_type(env_t *env, ast_t *ast)
}
type_t *value_t = value_type(indexed_t);
- switch (value_t->tag) {
- case ArrayType: {
+ if (value_t->tag == ArrayType) {
if (!indexing->index) return indexed_t;
type_t *index_t = get_type(env, indexing->index);
- switch (index_t->tag) {
- case IntType:
+ if (index_t->tag == IntType) {
return Match(value_t, ArrayType)->item_type;
- default: code_err(indexing->index, "I only know how to index lists using integers, not %T", index_t);
}
- }
- case TableType: {
- return Match(value_t, TableType)->value_type;
- }
- // TODO: support ranges like (99..123)[5]
- // TODO: support slicing arrays like ([1,2,3,4])[2..10]
- default: {
+ code_err(indexing->index, "I only know how to index lists using integers, not %T", index_t);
+ } else {
code_err(ast, "I don't know how to index %T values", indexed_t);
}
- }
}
case FunctionCall: {
auto call = Match(ast, FunctionCall);
@@ -741,6 +730,7 @@ type_t *get_type(env_t *env, ast_t *ast)
if (streq(call->name, "get")) return table->value_type;
else if (streq(call->name, "has")) return Type(BoolType);
else if (streq(call->name, "set")) return Type(VoidType);
+ else if (streq(call->name, "bump")) return Type(VoidType);
else if (streq(call->name, "remove")) return Type(VoidType);
else if (streq(call->name, "clear")) return Type(VoidType);
else if (streq(call->name, "sorted")) return self_value_t;