Alphabetical order of type members and better extends API.

このコミットが含まれているのは:
Cory Slep 2018-12-20 23:03:13 +01:00
コミット 43ab7d319c
1個のファイルの変更35行の追加12行の削除

ファイルの表示

@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"github.com/cjslep/activity/tools/exp/codegen" "github.com/cjslep/activity/tools/exp/codegen"
"github.com/dave/jennifer/jen" "github.com/dave/jennifer/jen"
"sort"
"strings" "strings"
"sync" "sync"
) )
@ -41,6 +42,7 @@ type Property interface {
PropertyName() string PropertyName() string
StructName() string StructName() string
SetKindFns(name string, ser, deser, less *codegen.Function) error SetKindFns(name string, ser, deser, less *codegen.Function) error
DeserializeFnName() string
} }
// TypeGenerator represents an ActivityStream type definition to generate in Go. // TypeGenerator represents an ActivityStream type definition to generate in Go.
@ -174,10 +176,10 @@ func (t *TypeGenerator) Definition() *codegen.Struct {
t.TypeName(), t.TypeName(),
[]*codegen.Method{ []*codegen.Method{
t.nameDefinition(), t.nameDefinition(),
t.extendsDefinition(),
m, m,
}, },
[]*codegen.Function{ []*codegen.Function{
t.extendsDefinition(),
t.extendedByDefinition(), t.extendedByDefinition(),
t.disjointWithDefinition(), t.disjointWithDefinition(),
ser, ser,
@ -207,11 +209,33 @@ func (t *TypeGenerator) allProperties() map[string]Property {
return p return p
} }
// sortedProperty is a slice of Properties that implements the Sort interface.
type sortedProperty []Property
func (s sortedProperty) Less(i, j int) bool {
return s[i].PropertyName() < s[j].PropertyName()
}
func (s sortedProperty) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
func (s sortedProperty) Len() int {
return len(s)
}
func (t *TypeGenerator) members() (members []jen.Code) { func (t *TypeGenerator) members() (members []jen.Code) {
p := t.allProperties() p := t.allProperties()
// Sort the properties for readability
sortedMembers := make(sortedProperty, 0, len(p))
for _, property := range p {
sortedMembers = append(sortedMembers, property)
}
sort.Sort(sortedMembers)
// Convert to jen.Code
members = make([]jen.Code, 0, len(p)) members = make([]jen.Code, 0, len(p))
for name, property := range p { for _, property := range sortedMembers {
members = append(members, jen.Id(strings.Title(name)).Id(property.StructName())) members = append(members, jen.Id(strings.Title(property.PropertyName())).Qual(property.PackageName(), property.StructName()))
} }
return return
} }
@ -241,18 +265,18 @@ func (t *TypeGenerator) getAllParentExtends(s []*TypeGenerator, tg *TypeGenerato
return s return s
} }
// extendsDefinition generates the golang method for determining if this // extendsDefinition generates the golang function for determining if this
// ActivityStreams type extends another type. It requires the Type interface. // ActivityStreams type extends another type. It requires the Type interface.
func (t *TypeGenerator) extendsDefinition() *codegen.Method { func (t *TypeGenerator) extendsDefinition() *codegen.Function {
var extends []*TypeGenerator var extends []*TypeGenerator
extends = t.getAllParentExtends(extends, t) extends = t.getAllParentExtends(extends, t)
extendNames := make([]string, 0, len(extends)) extendNames := make(map[string]struct{}, len(extends))
for _, ext := range extends { for _, ext := range extends {
extendNames = append(extendNames, ext.TypeName()) extendNames[ext.TypeName()] = struct{}{}
} }
extensions := make([]jen.Code, len(extendNames)) extensions := make([]jen.Code, len(extendNames))
for i, e := range extendNames { for e := range extendNames {
extensions[i] = jen.Lit(e) extensions = append(extensions, jen.Lit(e))
} }
impl := []jen.Code{jen.Comment("Shortcut implementation: this does not extend anything."), jen.Return(jen.False())} impl := []jen.Code{jen.Comment("Shortcut implementation: this does not extend anything."), jen.Return(jen.False())}
if len(extensions) > 0 { if len(extensions) > 0 {
@ -269,10 +293,9 @@ func (t *TypeGenerator) extendsDefinition() *codegen.Method {
), ),
jen.Return(jen.False())} jen.Return(jen.False())}
} }
return codegen.NewCommentedValueMethod( return codegen.NewCommentedFunction(
t.packageName, t.packageName,
t.extendsFnName(), t.extendsFnName(),
t.TypeName(),
[]jen.Code{jen.Id("other").Id(typeInterfaceName)}, []jen.Code{jen.Id("other").Id(typeInterfaceName)},
[]jen.Code{jen.Bool()}, []jen.Code{jen.Bool()},
impl, impl,
@ -406,7 +429,7 @@ func (t *TypeGenerator) KindSerializationFuncs() (ser, deser, less *codegen.Func
jen.List( jen.List(
jen.Id("p"), jen.Id("p"),
jen.Err(), jen.Err(),
).Op(":=").Qual(prop.PackageName(), deserializeMethod).Call(jen.Id("m")), ).Op(":=").Qual(prop.PackageName(), prop.DeserializeFnName()).Call(jen.Id("m")),
jen.Err().Op("!=").Nil(), jen.Err().Op("!=").Nil(),
).Block( ).Block(
jen.Return(jen.Nil(), jen.Err()), jen.Return(jen.Nil(), jen.Err()),