Reproducible empty interface code generation

Prior to this commit, the code generator for package empty doesn't have
a defined order. This commit now sorts the packages before generation,
which gets rid of the main map's undefined order.
This commit is contained in:
diamondburned 2020-10-03 23:24:15 -07:00
parent dd4e230e0f
commit e08064021e
2 changed files with 54 additions and 34 deletions

View File

@ -5,6 +5,7 @@ import (
"log"
"os"
"path"
"sort"
"strings"
"github.com/dave/jennifer/jen"
@ -23,33 +24,52 @@ var comment = repository.Comment{Raw: `
in cchat's root and text packages.
`}
type Package struct {
Path string
repository.Package
}
func main() {
gen := jen.NewFile("empty")
gen.HeaderComment("DO NOT EDIT: THIS FILE IS GENERATED!")
gen.PackageComment(comment.GoString(1))
for pkgpath, pk := range repository.Main {
gen.ImportName(pkgpath, path.Base(pkgpath))
// Sort.
var packages = make([]Package, 0, len(repository.Main))
for _, iface := range pk.Interfaces {
for pkgpath, pk := range repository.Main {
packages = append(packages, Package{
Path: pkgpath,
Package: pk,
})
}
sort.Slice(packages, func(i, j int) bool {
return packages[i].Path < packages[j].Path
})
for _, pkg := range packages {
gen.ImportName(pkg.Path, path.Base(pkg.Path))
for _, iface := range pkg.Interfaces {
// Skip structs without asserter methods.
if !hasAsserter(iface) {
continue
}
var ifaceName = newIfaceName(pkgpath, iface)
var ifaceName = newIfaceName(pkg.Path, iface)
gen.Commentf("%[1]s provides no-op asserters for cchat.%[1]s.", ifaceName)
gen.Type().Id(ifaceName).Struct()
gen.Line()
for _, embed := range iface.Embeds {
if iface := pk.Interface(embed.InterfaceName); iface != nil {
genIfaceMethods(gen, *iface, ifaceName, pkgpath)
if iface := pkg.Interface(embed.InterfaceName); iface != nil {
genIfaceMethods(gen, *iface, ifaceName, pkg.Path)
}
}
genIfaceMethods(gen, iface, ifaceName, pkgpath)
genIfaceMethods(gen, iface, ifaceName, pkg.Path)
gen.Line()
}

View File

@ -9,33 +9,6 @@ import (
"github.com/diamondburned/cchat/text"
)
// TextSegment provides no-op asserters for cchat.TextSegment.
type TextSegment struct{}
// AsColorer returns nil.
func (TextSegment) AsColorer() text.Colorer { return nil }
// AsLinker returns nil.
func (TextSegment) AsLinker() text.Linker { return nil }
// AsImager returns nil.
func (TextSegment) AsImager() text.Imager { return nil }
// AsAvatarer returns nil.
func (TextSegment) AsAvatarer() text.Avatarer { return nil }
// AsMentioner returns nil.
func (TextSegment) AsMentioner() text.Mentioner { return nil }
// AsAttributor returns nil.
func (TextSegment) AsAttributor() text.Attributor { return nil }
// AsCodeblocker returns nil.
func (TextSegment) AsCodeblocker() text.Codeblocker { return nil }
// AsQuoteblocker returns nil.
func (TextSegment) AsQuoteblocker() text.Quoteblocker { return nil }
// Namer provides no-op asserters for cchat.Namer.
type Namer struct{}
@ -140,3 +113,30 @@ func (SendableMessage) AsNoncer() cchat.Noncer { return nil }
// AsAttachments returns nil.
func (SendableMessage) AsAttachments() cchat.Attachments { return nil }
// TextSegment provides no-op asserters for cchat.TextSegment.
type TextSegment struct{}
// AsColorer returns nil.
func (TextSegment) AsColorer() text.Colorer { return nil }
// AsLinker returns nil.
func (TextSegment) AsLinker() text.Linker { return nil }
// AsImager returns nil.
func (TextSegment) AsImager() text.Imager { return nil }
// AsAvatarer returns nil.
func (TextSegment) AsAvatarer() text.Avatarer { return nil }
// AsMentioner returns nil.
func (TextSegment) AsMentioner() text.Mentioner { return nil }
// AsAttributor returns nil.
func (TextSegment) AsAttributor() text.Attributor { return nil }
// AsCodeblocker returns nil.
func (TextSegment) AsCodeblocker() text.Codeblocker { return nil }
// AsQuoteblocker returns nil.
func (TextSegment) AsQuoteblocker() text.Quoteblocker { return nil }