ww: implement package initialization

This commit is contained in:
2026-08-14 19:02:35 +09:00
parent 72e890d5aa
commit c6bec0914d
24 changed files with 5279 additions and 1009 deletions

View File

@@ -57,7 +57,7 @@ static const char *
wwi_use_path(Checker *c, const char *owner, int source, const char *alias)
{
for (Node *u = c->file->list; u; u = u->next) {
if (u->kind != N_USE || u->str == NULL
if (u->kind != N_USE || u->useblank || u->str == NULL
|| u->sourceid != source || strcmp(u->str, alias) != 0)
continue;
int same = owner == NULL ? u->imported == 0
@@ -592,6 +592,7 @@ factcmp(const void *a, const void *b)
static int
wwi_is_decl(Node *d)
{
if (d->initfn || d->initsynthetic) return 0;
return d->kind == N_FNDECL || d->kind == N_TYPEDECL
|| d->kind == N_DEF || d->kind == N_LET;
}
@@ -791,7 +792,7 @@ wwi_collect_decl(struct factset *fs, const char *owner, Node *d)
static int
wwi_use_owned(Node *u, const char *owner, int source)
{
return u->kind == N_USE && u->imported != 0
return u->kind == N_USE && !u->useblank && u->imported != 0
&& u->sourceid == source && wwi_mod_eq(u->module, owner);
}
@@ -803,7 +804,7 @@ wwi_emit_imports(FILE *of, Node *file, const char *owner, int source,
for (Node *u = file->list; u; u = u->next) {
int owned = imported ? wwi_use_owned(u, owner, source)
: u->kind == N_USE && u->imported == 0
&& u->sourceid == source;
&& !u->useblank && u->sourceid == source;
if (owned) nuse++;
}
if (nuse == 0) return;
@@ -813,7 +814,7 @@ wwi_emit_imports(FILE *of, Node *file, const char *owner, int source,
for (Node *u = file->list; u; u = u->next) {
int owned = imported ? wwi_use_owned(u, owner, source)
: u->kind == N_USE && u->imported == 0
&& u->sourceid == source;
&& !u->useblank && u->sourceid == source;
if (!owned) continue;
us[k].path = u->usepath ? u->usepath : u->str;
us[k].idx = k;
@@ -836,7 +837,7 @@ wwi_primary_section_has(Checker *c, Node *file, struct factset *fs,
struct declent *exports, int nexports, int source)
{
for (Node *u = file->list; u; u = u->next)
if (u->kind == N_USE && u->imported == 0
if (u->kind == N_USE && !u->useblank && u->imported == 0
&& u->sourceid == source)
return 1;
for (int i = 0; i < fs->nprivate; i++)