From 3590bf34071bfdfe4d18bb8b32e4c88869bc5f7b Mon Sep 17 00:00:00 2001 From: Bruce Hill Date: Sun, 21 Apr 2024 14:58:33 -0400 Subject: [PATCH] Better imports for types --- compile.c | 10 ++++++---- environment.c | 2 ++ test/use.tm | 9 +++++++++ test/use_import.tm | 7 +++++++ typecheck.c | 13 +++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 test/use.tm create mode 100644 test/use_import.tm diff --git a/compile.c b/compile.c index 8c3717d..f8f2dfe 100644 --- a/compile.c +++ b/compile.c @@ -816,7 +816,7 @@ CORD expr_as_text(env_t *env, CORD expr, type_t *t, CORD color) } case ArrayType: return CORD_asprintf("Array$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(env, t)); case TableType: return CORD_asprintf("Table$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(env, t)); - case FunctionType: return CORD_asprintf("Func$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(env, t)); + case FunctionType: case ClosureType: return CORD_asprintf("Func$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(env, t)); case PointerType: return CORD_asprintf("Pointer$as_text(stack(%r), %r, %r)", expr, color, compile_type_info(env, t)); case StructType: case EnumType: return CORD_asprintf("(%r)->CustomInfo.as_text(stack(%r), %r, %r)", compile_type_info(env, t), expr, color, compile_type_info(env, t)); @@ -1922,6 +1922,8 @@ CORD compile_type_info(env_t *env, type_t *t) return CORD_asprintf("$ClosureInfo(%r)", Text$quoted(type_to_cord(t), false)); } case TypeInfoType: return "&$TypeInfo"; + case MemoryType: return "&$Memory"; + case VoidType: return "&$Void"; default: compiler_err(NULL, 0, 0, "I couldn't convert to a type info: %T", t); } @@ -2147,15 +2149,15 @@ module_code_t compile_file(ast_t *ast) .env=env, .object_files=env->code->object_files, .header=CORD_all( - // CORD_asprintf("#line 1 %r\n", Text$quoted(ast->file->filename, false)), + // "#line 1 ", Text$quoted(ast->file->filename, false), "\n", "#include \n", + env->code->imports, "\n", env->code->typedefs, "\n", env->code->typecode, "\n", env->code->fndefs, "\n" ), .c_file=CORD_all( - // CORD_asprintf("#line 1 %r\n", Text$quoted(ast->file->filename, false)), - env->code->imports, "\n", + // "#line 1 ", Text$quoted(ast->file->filename, false), "\n", env->code->staticdefs, "\n", env->code->funcs, "\n", env->code->typeinfos, "\n" diff --git a/environment.c b/environment.c index 08274d8..05ca510 100644 --- a/environment.c +++ b/environment.c @@ -49,6 +49,8 @@ env_t *new_compilation_unit(void) CORD struct_val; array_t namespace; } global_types[] = { + {"Void", Type(VoidType), "Void_t", "$Void", {}}, + {"Memory", Type(MemoryType), "Memory_t", "$Memory", {}}, {"Bool", Type(BoolType), "Bool_t", "$Bool", TypedArray(ns_entry_t, {"from_text", "Bool$from_text", "func(text:Text, success=!Bool)->Bool"}, )}, diff --git a/test/use.tm b/test/use.tm new file mode 100644 index 0000000..a759180 --- /dev/null +++ b/test/use.tm @@ -0,0 +1,9 @@ +imported := use ./use_import + +func asdf()->imported.ImportedType + return imported.get_value() + +func main() + >> [:imported.ImportedType] + >> asdf() + = ImportedType(name="Hello") diff --git a/test/use_import.tm b/test/use_import.tm new file mode 100644 index 0000000..fb5f71e --- /dev/null +++ b/test/use_import.tm @@ -0,0 +1,7 @@ +struct ImportedType(name:Text) + +func get_value()->ImportedType + return ImportedType("Hello") + +func main() + pass diff --git a/typecheck.c b/typecheck.c index bd03588..72551d9 100644 --- a/typecheck.c +++ b/typecheck.c @@ -21,6 +21,19 @@ type_t *parse_type_ast(env_t *env, type_ast_t *ast) const char *name = Match(ast, VarTypeAST)->name; type_t *t = Table$str_get(*env->types, name); if (t) return t; + while (strchr(name, '.')) { + char *module_name = heap_strn(name, strcspn(name, ".")); + binding_t *b = get_binding(env, module_name); + if (!b || b->type->tag != ModuleType) + code_err(ast, "I don't know a module with the name '%s'", module_name); + + env_t *imported = Table$str_get(*env->imports, Match(b->type, ModuleType)->name); + assert(imported); + env = imported; + name = strchr(name, '.') + 1; + t = Table$str_get(*env->types, name); + if (t) return t; + } code_err(ast, "I don't know a type with the name '%s'", name); } case PointerTypeAST: {