static size_t typeid(Parser* p, Type* type)
{
+ if (type == NULL) return -1;
size_t i;
for (i = 0; i < p->ntypes; i++)
{
return i;
}
+static char* modname(Parser* p, Symbol* sym)
+{
+ char* name = p->name;
+ if (sym->module > 0)
+ {
+ sym = symbol_getbyid(p, sym->module);
+ name = sym->name;
+ }
+ return name;
+}
+
void symbol_export(Parser* p, char* path)
{
(void)path;
{
Symbol* sym = &(p->syms[i]);
if (!sym->export) continue;
- printf("%c %s ", SymTypes[sym->class], sym->name);
- fflush(stdout);
- printf("%ld\n", typeid(p, sym->type));
+ if (sym->class == SYM_MODULE && sym->module != 0) continue;
+
+ printf("%c %s %s ",
+ SymTypes[sym->class],
+ modname(p, sym),
+ sym->name);
+
+ switch (sym->class)
+ {
+ case SYM_MODULE:
+ printf("<signature>\n");
+ break;
+
+ case SYM_CONST:
+ case SYM_VAR:
+ case SYM_TYPE:
+ case SYM_PROC:
+ printf("%ld\n", typeid(p, sym->type));
+ break;
+ }
}
}
void symbol_import(Parser* p, char* name, char* alias)
{
- Symbol* mod = symbol_new(p, 0, name, SYM_MODULE, false);
+ Symbol* mod = symbol_new(p, 0, name, SYM_MODULE, true);
size_t modid = symbol_getid(p, 0, mod->name, SYM_MODULE);
if (alias)
{
- Symbol* modalias = symbol_new(p, 0, alias, SYM_MODULE, false);
+ Symbol* modalias = symbol_new(p, 0, alias, SYM_MODULE, true);
modalias->module = modid; // Points to the aliased module
}
/* TODO: read symbols from real symbol file */
// All of these should set ->module = modid
- Symbol* sym = symbol_new(p, 0, "testint", SYM_CONST, false);
+ Symbol* sym = symbol_new(p, 0, "testint", SYM_CONST, true);
sym->module = modid;
sym->value = ast_int(42);
}