Alphabetical order of type members and better extends API.
このコミットが含まれているのは:
コミット
43ab7d319c
|
@ -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()),
|
||||||
|
|
読み込み中…
新しいイシューから参照