From ed09e1a5b9216ba54c1bcad8653e57a4f6811e9c Mon Sep 17 00:00:00 2001 From: Randy Reddig Date: Tue, 20 May 2025 16:34:48 -0700 Subject: [PATCH 1/3] wit: elide WIT package if filtering Fixes #347. --- testdata/issues/issue347.wit | 16 ++++ testdata/issues/issue347.wit.json | 78 ++++++++++++++++++++ testdata/issues/issue347.wit.json.golden.wit | 16 ++++ wit/wit.go | 6 +- 4 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 testdata/issues/issue347.wit create mode 100644 testdata/issues/issue347.wit.json create mode 100644 testdata/issues/issue347.wit.json.golden.wit diff --git a/testdata/issues/issue347.wit b/testdata/issues/issue347.wit new file mode 100644 index 00000000..00f720b5 --- /dev/null +++ b/testdata/issues/issue347.wit @@ -0,0 +1,16 @@ +/// This comment must exist to trigger failure. +package issues:issue347; + +world foo-command { + import issues:inner/custom; +} + +package issues:inner { + interface custom { + words: func(text: string) -> list; + } + + world the-world { + export custom; + } +} diff --git a/testdata/issues/issue347.wit.json b/testdata/issues/issue347.wit.json new file mode 100644 index 00000000..7a0014e5 --- /dev/null +++ b/testdata/issues/issue347.wit.json @@ -0,0 +1,78 @@ +{ + "worlds": [ + { + "name": "the-world", + "imports": {}, + "exports": { + "interface-0": { + "interface": { + "id": 0 + } + } + }, + "package": 0 + }, + { + "name": "foo-command", + "imports": { + "interface-0": { + "interface": { + "id": 0 + } + } + }, + "exports": {}, + "package": 1 + } + ], + "interfaces": [ + { + "name": "custom", + "types": {}, + "functions": { + "words": { + "name": "words", + "kind": "freestanding", + "params": [ + { + "name": "text", + "type": "string" + } + ], + "result": 0 + } + }, + "package": 0 + } + ], + "types": [ + { + "name": null, + "kind": { + "list": "string" + }, + "owner": null + } + ], + "packages": [ + { + "name": "issues:inner", + "interfaces": { + "custom": 0 + }, + "worlds": { + "the-world": 0 + } + }, + { + "name": "issues:issue347", + "docs": { + "contents": "This comment must exist to trigger failure." + }, + "interfaces": {}, + "worlds": { + "foo-command": 1 + } + } + ] +} \ No newline at end of file diff --git a/testdata/issues/issue347.wit.json.golden.wit b/testdata/issues/issue347.wit.json.golden.wit new file mode 100644 index 00000000..7185f7d1 --- /dev/null +++ b/testdata/issues/issue347.wit.json.golden.wit @@ -0,0 +1,16 @@ +/// This comment must exist to trigger failure. +package issues:issue347; + +world foo-command { + import issues:inner/custom; +} + +package issues:inner { + interface custom { + words: func(text: string) -> list; + } + + world the-world { + export custom; + } +} diff --git a/wit/wit.go b/wit/wit.go index c1f8b70f..8a425f2d 100644 --- a/wit/wit.go +++ b/wit/wit.go @@ -1206,9 +1206,9 @@ func (p *Package) WIT(ctx Node, name string) string { b.WriteString("}\n") } // Return empty string if package has no contents - // if i == 0 { - // return "" - // } + if filter != nil && i == 0 { + return "" + } return b.String() } From d4d23211566a3ed626e86bf4dc49ae8c87ecd817 Mon Sep 17 00:00:00 2001 From: Randy Reddig Date: Thu, 22 May 2025 09:22:42 -0700 Subject: [PATCH 2/3] wit/bindgen: create Go packages on-demand --- wit/bindgen/generator.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/wit/bindgen/generator.go b/wit/bindgen/generator.go index cb52900a..ed404f42 100644 --- a/wit/bindgen/generator.go +++ b/wit/bindgen/generator.go @@ -227,11 +227,6 @@ func (g *generator) define(dir wit.Direction, v wit.Node) (defined bool) { func (g *generator) defineWorlds() error { g.opts.logger.Infof("Generating Go for %d world(s)\n", len(g.res.Worlds)) for _, w := range g.res.Worlds { - // Define a Go package for every world, regardless of use - _, err := g.newPackage(w, nil, "") - if err != nil { - return err - } if w == g.world || g.world == nil { err := g.defineWorld(w) if err != nil { @@ -2289,9 +2284,17 @@ func (g *generator) cgoFileFor(owner wit.TypeOwner) *gen.File { func (g *generator) packageFor(owner wit.TypeOwner) *gen.Package { pkg := g.witPackages[owner] + if pkg != nil { + return pkg + } + var err error + switch owner := (owner).(type) { + case *wit.World: + pkg, err = g.newPackage(owner, nil, "") + } if pkg == nil { - panic(fmt.Sprintf("BUG: nil package for wit.TypeOwner %s (%T: %p)", - owner.WITPackage().Name.String(), owner, owner)) + panic(fmt.Sprintf("BUG: cannot create Go package for wit.TypeOwner %s (%T: %p): %v", + owner.WITPackage().Name.String(), owner, owner, err)) } return pkg } From 32a5643db1074b4aa0f7e14e30eb2c19c278c094 Mon Sep 17 00:00:00 2001 From: Randy Reddig Date: Sun, 25 May 2025 10:53:50 -0700 Subject: [PATCH 3/3] Revert "wit/bindgen: create Go packages on-demand" This reverts commit d4d23211566a3ed626e86bf4dc49ae8c87ecd817. --- wit/bindgen/generator.go | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/wit/bindgen/generator.go b/wit/bindgen/generator.go index ed404f42..cb52900a 100644 --- a/wit/bindgen/generator.go +++ b/wit/bindgen/generator.go @@ -227,6 +227,11 @@ func (g *generator) define(dir wit.Direction, v wit.Node) (defined bool) { func (g *generator) defineWorlds() error { g.opts.logger.Infof("Generating Go for %d world(s)\n", len(g.res.Worlds)) for _, w := range g.res.Worlds { + // Define a Go package for every world, regardless of use + _, err := g.newPackage(w, nil, "") + if err != nil { + return err + } if w == g.world || g.world == nil { err := g.defineWorld(w) if err != nil { @@ -2284,17 +2289,9 @@ func (g *generator) cgoFileFor(owner wit.TypeOwner) *gen.File { func (g *generator) packageFor(owner wit.TypeOwner) *gen.Package { pkg := g.witPackages[owner] - if pkg != nil { - return pkg - } - var err error - switch owner := (owner).(type) { - case *wit.World: - pkg, err = g.newPackage(owner, nil, "") - } if pkg == nil { - panic(fmt.Sprintf("BUG: cannot create Go package for wit.TypeOwner %s (%T: %p): %v", - owner.WITPackage().Name.String(), owner, owner, err)) + panic(fmt.Sprintf("BUG: nil package for wit.TypeOwner %s (%T: %p)", + owner.WITPackage().Name.String(), owner, owner)) } return pkg }