summaryrefslogtreecommitdiff
path: root/types.c
diff options
context:
space:
mode:
Diffstat (limited to 'types.c')
-rw-r--r--types.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/types.c b/types.c
index 07b46d9..2d6f6d4 100644
--- a/types.c
+++ b/types.c
@@ -981,12 +981,18 @@ static bool types_expr(Typer *tr, Expression *e) {
char *name_cstr = typer_malloc(tr, name_str_len + 1);
memcpy(name_cstr, name_str.data, name_str_len);
name_cstr[name_str.n] = '\0';
- Identifier name_ident = ident_insert(tr->idents, &name_cstr);
- assert(!*name_cstr);
+ char *name_ptr = name_cstr;
+ Identifier name_ident = ident_insert(tr->idents, &name_ptr);
+ if (*name_ptr) {
+ err_print(name_expr->where, "Package name (\"%s\") is not a valid identifier.",
+ name_cstr);
+ return false;
+ }
e->pkg.name_ident = name_ident;
if (!name_ident->pkg) {
char *filename = typer_malloc(tr, name_str_len + 5);
Package *pkg = name_ident->pkg = err_calloc(1, sizeof *pkg);
+ pkg->c.prefix = name_cstr;
memcpy(filename, name_str.data, name_str_len);
strcpy(filename + name_str.n, ".top");
/* TODO: library paths */
@@ -1931,7 +1937,18 @@ static bool types_expr(Typer *tr, Expression *e) {
Value pkg_val;
if (!eval_expr(tr->evalr, lhs, &pkg_val))
return false;
+ lhs->kind = EXPR_VAL;
+ lhs->val = pkg_val;
e->binary.dot.pkg_ident = ident_translate(rhs->ident, &pkg_val.pkg->idents);
+ if (!e->binary.dot.pkg_ident) {
+ char *ident_name = ident_to_str(rhs->ident),
+ *pkg_name = ident_to_str(pkg_val.pkg->name);
+
+ err_print(e->where, "%s was not imported from package %s.", ident_name, pkg_name);
+ free(ident_name);
+ free(pkg_name);
+ return false;
+ }
if (!type_of_ident(tr, e->where, e->binary.dot.pkg_ident, t)) {
return false;
}