Added missing methods from embedded interfaces

This commit adds missing empty asserter methods from the interfaces
embedded in the parent interface.
This commit is contained in:
diamondburned 2020-10-03 19:56:58 -07:00
parent 59778af1dd
commit 2d00544d67
2 changed files with 47 additions and 22 deletions

View File

@ -37,36 +37,20 @@ func main() {
continue
}
var ifaceName string
if pkgpath == repository.RootPath {
ifaceName = iface.Name
} else {
ifaceName = strings.Title(repository.TrimRoot(pkgpath)) + iface.Name
}
var ifaceName = newIfaceName(pkgpath, iface)
gen.Commentf("%[1]s provides no-op asserters for cchat.%[1]s.", ifaceName)
gen.Type().Id(ifaceName).Struct()
gen.Line()
for _, method := range iface.Methods {
am, ok := method.(repository.AsserterMethod)
if !ok {
continue
for _, embed := range iface.Embeds {
if iface := pk.Interface(embed.InterfaceName); iface != nil {
genIfaceMethods(gen, *iface, ifaceName, pkgpath)
}
name := fmt.Sprintf("As%s", am.ChildType)
gen.Comment(fmt.Sprintf("%s returns nil.", name))
stmt := jen.Func()
stmt.Parens(jen.Id(ifaceName))
stmt.Id(fmt.Sprintf("As%s", am.ChildType))
stmt.Params()
stmt.Add(genutils.GenerateExternType(pkgpath, am))
stmt.Values(jen.Return(jen.Nil()))
gen.Add(stmt)
}
genIfaceMethods(gen, iface, ifaceName, pkgpath)
gen.Line()
}
}
@ -82,6 +66,35 @@ func main() {
}
}
func newIfaceName(pkgpath string, iface repository.Interface) string {
if pkgpath == repository.RootPath {
return iface.Name
} else {
return strings.Title(repository.TrimRoot(pkgpath)) + iface.Name
}
}
func genIfaceMethods(gen *jen.File, iface repository.Interface, ifaceName, pkgpath string) {
for _, method := range iface.Methods {
am, ok := method.(repository.AsserterMethod)
if !ok {
continue
}
name := fmt.Sprintf("As%s", am.ChildType)
gen.Comment(fmt.Sprintf("%s returns nil.", name))
stmt := jen.Func()
stmt.Parens(jen.Id(ifaceName))
stmt.Id(name)
stmt.Params()
stmt.Add(genutils.GenerateExternType(pkgpath, am))
stmt.Values(jen.Return(jen.Nil()))
gen.Add(stmt)
}
}
func hasAsserter(iface repository.Interface) bool {
for _, method := range iface.Methods {
if _, isA := method.(repository.AsserterMethod); isA {

View File

@ -45,6 +45,9 @@ func (Namer) AsIconer() cchat.Iconer { return nil }
// Service provides no-op asserters for cchat.Service.
type Service struct{}
// AsIconer returns nil.
func (Service) AsIconer() cchat.Iconer { return nil }
// AsConfigurator returns nil.
func (Service) AsConfigurator() cchat.Configurator { return nil }
@ -54,6 +57,9 @@ func (Service) AsSessionRestorer() cchat.SessionRestorer { return nil }
// Session provides no-op asserters for cchat.Session.
type Session struct{}
// AsIconer returns nil.
func (Session) AsIconer() cchat.Iconer { return nil }
// AsCommander returns nil.
func (Session) AsCommander() cchat.Commander { return nil }
@ -69,6 +75,9 @@ func (Commander) AsCompleter() cchat.Completer { return nil }
// Server provides no-op asserters for cchat.Server.
type Server struct{}
// AsIconer returns nil.
func (Server) AsIconer() cchat.Iconer { return nil }
// AsLister returns nil.
func (Server) AsLister() cchat.Lister { return nil }
@ -117,6 +126,9 @@ func (Sender) AsCompleter() cchat.Completer { return nil }
// MemberSection provides no-op asserters for cchat.MemberSection.
type MemberSection struct{}
// AsIconer returns nil.
func (MemberSection) AsIconer() cchat.Iconer { return nil }
// AsMemberDynamicSection returns nil.
func (MemberSection) AsMemberDynamicSection() cchat.MemberDynamicSection { return nil }