Add constructors in pkg and for types.

このコミットが含まれているのは:
Cory Slep 2019-01-12 12:30:08 +01:00
コミット a93c6aa678
4個のファイルの変更95行の追加4行の削除

ファイルの表示

@ -203,6 +203,12 @@ func (c Converter) convertToFiles(v vocabulary) (f []*File, e error) {
FileName: "gen_manager.go", FileName: "gen_manager.go",
Directory: pub.WriteDir(), Directory: pub.WriteDir(),
}) })
var files []*File
files, e = c.rootFiles(pub, v.Types)
if e != nil {
return
}
f = append(f, files...)
return return
} }
@ -554,6 +560,25 @@ func (c Converter) packageManager(s string) (pkg *props.PackageManager, e error)
return return
} }
func (c Converter) rootFiles(pkg props.Package, t map[string]*props.TypeGenerator) (f []*File, e error) {
tgs := make([]*props.TypeGenerator, 0, len(t))
for _, v := range t {
tgs = append(tgs, v)
}
pg := props.NewPackageGenerator()
ctors := pg.RootDefinitions(tgs)
file := jen.NewFilePath(pkg.Path())
for _, c := range ctors {
file.Add(c.Definition()).Line()
}
f = append(f, &File{
F: file,
FileName: "gen_ctors.go",
Directory: pkg.WriteDir(),
})
return
}
func (c Converter) packageFiles(t map[string]*props.TypeGenerator, func (c Converter) packageFiles(t map[string]*props.TypeGenerator,
fp map[string]*props.FunctionalPropertyGenerator, fp map[string]*props.FunctionalPropertyGenerator,
nfp map[string]*props.NonFunctionalPropertyGenerator) (f []*File, e error) { nfp map[string]*props.NonFunctionalPropertyGenerator) (f []*File, e error) {

ファイルの表示

@ -113,12 +113,35 @@ func NewTypePackageGenerator() *TypePackageGenerator {
return &TypePackageGenerator{} return &TypePackageGenerator{}
} }
// RootDefinitions creates functions needed at the root level of the package declarations.
func (t *TypePackageGenerator) RootDefinitions(tgs []*TypeGenerator) (ctors []*codegen.Function) {
// Type constructors
for _, tg := range tgs {
ctors = append(ctors, codegen.NewCommentedFunction(
tg.PublicPackage().Path(),
fmt.Sprintf("New%s%s", tg.PublicPackage().Name(), tg.TypeName()),
/*params=*/ nil,
[]jen.Code{jen.Qual(tg.PublicPackage().Path(), tg.InterfaceName())},
[]jen.Code{
jen.Return(
jen.Op("&").Qual(tg.PrivatePackage().Path(), tg.TypeName()).Values(
jen.Dict{
jen.Id(unknownMember): jen.Make(jen.Map(jen.String()).Interface(), jen.Lit(0)),
},
),
),
},
fmt.Sprintf("New%s%s creates a new %s", tg.PublicPackage().Name(), tg.TypeName(), tg.InterfaceName())))
}
return
}
// PublicDefinitions creates the public-facing code generated definitions needed // PublicDefinitions creates the public-facing code generated definitions needed
// once per package. // once per package.
// //
// Precondition: The passed-in generators are the complete set of type // Precondition: The passed-in generators are the complete set of type
// generators within a package. // generators within a package.
func (t *TypePackageGenerator) PublicDefinitions(tgs []*TypeGenerator) *codegen.Interface { func (t *TypePackageGenerator) PublicDefinitions(tgs []*TypeGenerator) (typeI *codegen.Interface) {
return TypeInterface(tgs[0].PublicPackage()) return TypeInterface(tgs[0].PublicPackage())
} }
@ -127,7 +150,7 @@ func (t *TypePackageGenerator) PublicDefinitions(tgs []*TypeGenerator) *codegen.
// //
// Precondition: The passed-in generators are the complete set of type // Precondition: The passed-in generators are the complete set of type
// generators within a package. // generators within a package.
func (t *TypePackageGenerator) PrivateDefinitions(tgs []*TypeGenerator) (*jen.Statement, *codegen.Interface, *codegen.Function) { func (t *TypePackageGenerator) PrivateDefinitions(tgs []*TypeGenerator) (mgrVar *jen.Statement, mgrI *codegen.Interface, setMgrFn *codegen.Function) {
fnsMap := make(map[string]codegen.FunctionSignature) fnsMap := make(map[string]codegen.FunctionSignature)
for _, tg := range tgs { for _, tg := range tgs {
for _, m := range tg.getAllManagerMethods() { for _, m := range tg.getAllManagerMethods() {
@ -208,6 +231,25 @@ func NewPackageGenerator() *PackageGenerator {
return &PackageGenerator{} return &PackageGenerator{}
} }
// RootDefinitions creates functions needed at the root level of the package declarations.
func (t *PackageGenerator) RootDefinitions(tgs []*TypeGenerator) (ctors []*codegen.Function) {
// Type constructors
for _, tg := range tgs {
ctors = append(ctors, codegen.NewCommentedFunction(
tg.PublicPackage().Path(),
fmt.Sprintf("New%s%s", tg.PublicPackage().Name(), tg.TypeName()),
/*params=*/ nil,
[]jen.Code{jen.Qual(tg.PublicPackage().Path(), tg.InterfaceName())},
[]jen.Code{
jen.Return(
tg.constructorFn().Call(),
),
},
fmt.Sprintf("New%s%s creates a new %s", tg.PublicPackage().Name(), tg.TypeName(), tg.InterfaceName())))
}
return
}
// PublicDefinitions creates the public-facing code generated definitions needed // PublicDefinitions creates the public-facing code generated definitions needed
// once per package. // once per package.
// //

ファイルの表示

@ -127,8 +127,8 @@ func (k Kind) isValue() bool {
// It also properly handles the concept of generating Go code for property // It also properly handles the concept of generating Go code for property
// iterators, which are needed for NonFunctional properties. // iterators, which are needed for NonFunctional properties.
type PropertyGenerator struct { type PropertyGenerator struct {
vocabName string vocabName string
managerMethods []*codegen.Method managerMethods []*codegen.Method
packageManager *PackageManager packageManager *PackageManager
name Identifier name Identifier
comment string comment string

ファイルの表示

@ -22,6 +22,7 @@ const (
getUnknownMethod = "GetUnknownProperties" getUnknownMethod = "GetUnknownProperties"
unknownMember = "unknown" unknownMember = "unknown"
getMethodFormat = "Get%s" getMethodFormat = "Get%s"
constructorName = "New"
) )
// TypeInterface returns the Type Interface that is needed for ActivityStream // TypeInterface returns the Type Interface that is needed for ActivityStream
@ -244,6 +245,7 @@ func (t *TypeGenerator) Definition() *codegen.Struct {
extendsFn, extendsMethod := t.extendsDefinition() extendsFn, extendsMethod := t.extendsDefinition()
getters := t.allGetters() getters := t.allGetters()
setters := t.allSetters() setters := t.allSetters()
constructor := t.constructorFn()
t.cachedStruct = codegen.NewStruct( t.cachedStruct = codegen.NewStruct(
t.Comments(), t.Comments(),
t.TypeName(), t.TypeName(),
@ -259,6 +261,7 @@ func (t *TypeGenerator) Definition() *codegen.Struct {
setters..., setters...,
), ),
[]*codegen.Function{ []*codegen.Function{
constructor,
t.extendedByDefinition(), t.extendedByDefinition(),
extendsFn, extendsFn,
t.disjointWithDefinition(), t.disjointWithDefinition(),
@ -732,3 +735,24 @@ func (t *TypeGenerator) getAllManagerMethods() (m []*codegen.Method) {
} }
return m return m
} }
// constructorFn creates a constructor for this type.
func (t *TypeGenerator) constructorFn() *codegen.Function {
return codegen.NewCommentedFunction(
t.PrivatePackage().Path(),
fmt.Sprintf("%s%s", constructorName, t.TypeName()),
/*params=*/ nil,
[]jen.Code{
jen.Op("*").Qual(t.PrivatePackage().Path(), t.TypeName()),
},
[]jen.Code{
jen.Return(
jen.Op("&").Qual(t.PrivatePackage().Path(), t.TypeName()).Values(
jen.Dict{
jen.Id(unknownMember): jen.Make(jen.Map(jen.String()).Interface(), jen.Lit(0)),
},
),
),
},
fmt.Sprintf("%s%s creates a new %s type", constructorName, t.TypeName(), t.TypeName()))
}