aboutsummaryrefslogtreecommitdiff
path: root/typecheck.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2024-03-09 18:22:12 -0500
committerBruce Hill <bruce@bruce-hill.com>2024-03-09 18:22:12 -0500
commit2b83ab279dbfb77cfd699d6da944c51c2353e64a (patch)
tree820f23b5c418e9d501a9fecf4fc84d2e26158cb2 /typecheck.c
parent1b8f7307a9c9cef191f6277cea5f2d11ef0a5788 (diff)
Add langs to the language
Diffstat (limited to 'typecheck.c')
-rw-r--r--typecheck.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/typecheck.c b/typecheck.c
index 671326d0..bab1920b 100644
--- a/typecheck.c
+++ b/typecheck.c
@@ -179,6 +179,24 @@ void bind_statement(env_t *env, ast_t *statement)
break;
}
+ case LangDef: {
+ auto def = Match(statement, LangDef);
+
+ type_t *type = Type(TextType, .lang=def->name);
+ Table_str_set(env->types, def->name, type);
+ env_t *ns_env = namespace_env(env, def->name);
+
+ set_binding(ns_env, "from_unsafe_text",
+ new(binding_t, .type=Type(FunctionType, .args=new(arg_t, .name="text", .type=Type(TextType)), .ret=type),
+ .code=CORD_all("(", def->name, "_t)")));
+
+ for (ast_list_t *stmt = def->namespace ? Match(def->namespace, Block)->statements : NULL; stmt; stmt = stmt->next)
+ bind_statement(ns_env, stmt->ast);
+
+ type_t *typeinfo_type = Type(TypeInfoType, .name=def->name, .type=type);
+ Table_str_set(env->globals, def->name, new(binding_t, .type=typeinfo_type));
+ break;
+ }
default: break;
}
}
@@ -269,8 +287,9 @@ type_t *get_type(env_t *env, ast_t *ast)
code_err(ast, "'&' stack references can only be used on variables or fields of variables");
}
- case TextJoin: case TextLiteral: {
- return Type(TextType);
+ case TextLiteral: return Type(TextType);
+ case TextJoin: {
+ return Type(TextType, .lang=Match(ast, TextJoin)->lang);
}
case Var: {
auto var = Match(ast, Var);
@@ -448,7 +467,7 @@ type_t *get_type(env_t *env, ast_t *ast)
// Early out if the type is knowable without any context from the block:
switch (last->ast->tag) {
- case UpdateAssign: case Assign: case Declare: case FunctionDef: case StructDef: case EnumDef:
+ case UpdateAssign: case Assign: case Declare: case FunctionDef: case StructDef: case EnumDef: case LangDef:
return Type(VoidType);
default: break;
}
@@ -624,7 +643,7 @@ type_t *get_type(env_t *env, ast_t *ast)
return Type(ClosureType, Type(FunctionType, .args=args, .ret=ret));
}
- case FunctionDef: case StructDef: case EnumDef: {
+ case FunctionDef: case StructDef: case EnumDef: case LangDef: {
return Type(VoidType);
}
@@ -749,7 +768,7 @@ type_t *get_type(env_t *env, ast_t *ast)
bool is_discardable(env_t *env, ast_t *ast)
{
switch (ast->tag) {
- case UpdateAssign: case Assign: case Declare: case FunctionDef: case StructDef: case EnumDef: case Use:
+ case UpdateAssign: case Assign: case Declare: case FunctionDef: case StructDef: case EnumDef: case LangDef: case Use:
return true;
default: break;
}