Add property constructors.

このコミットが含まれているのは:
Cory Slep 2019-01-26 19:46:25 +01:00
コミット 248a464c02
5個のファイルの変更46行の追加6行の削除

ファイルの表示

@ -875,9 +875,10 @@ func (c Converter) packageManager(s, vocabName string) (pkg *gen.PackageManager,
// are the ones typically used by developers.
func (c Converter) rootFiles(pkg gen.Package, vocabName string, v vocabulary, m *gen.ManagerGenerator) (f []*File, e error) {
pg := gen.NewPackageGenerator()
ctors, ext, disj, extBy := pg.RootDefinitions(vocabName, m, v.typeArray(), v.propArray())
typeCtors, propCtors, ext, disj, extBy := pg.RootDefinitions(vocabName, m, v.typeArray(), v.propArray())
lowerVocabName := strings.ToLower(vocabName)
f = append(f, funcsToFile(pkg, ctors, fmt.Sprintf("gen_pkg_%s_constructors.go", lowerVocabName)))
f = append(f, funcsToFile(pkg, typeCtors, fmt.Sprintf("gen_pkg_%s_type_constructors.go", lowerVocabName)))
f = append(f, funcsToFile(pkg, propCtors, fmt.Sprintf("gen_pkg_%s_property_constructors.go", lowerVocabName)))
f = append(f, funcsToFile(pkg, ext, fmt.Sprintf("gen_pkg_%s_extends.go", lowerVocabName)))
f = append(f, funcsToFile(pkg, disj, fmt.Sprintf("gen_pkg_%s_disjoint.go", lowerVocabName)))
f = append(f, funcsToFile(pkg, extBy, fmt.Sprintf("gen_pkg_%s_extendedby.go", lowerVocabName)))

ファイルの表示

@ -472,6 +472,7 @@ func (p *FunctionalPropertyGenerator) singleTypeDef() *codegen.Struct {
ser, deser := p.serializationFuncs()
methods = append(methods, ser)
funcs = append(funcs, deser)
funcs = append(funcs, p.constructorFn())
methods = append(methods, p.singleTypeFuncs()...)
methods = append(methods, p.funcs()...)
methods = append(methods, p.commonMethods()...)
@ -721,6 +722,7 @@ func (p *FunctionalPropertyGenerator) multiTypeDef() *codegen.Struct {
ser, deser := p.serializationFuncs()
methods = append(methods, ser)
funcs = append(funcs, deser)
funcs = append(funcs, p.constructorFn())
methods = append(methods, p.multiTypeFuncs()...)
methods = append(methods, p.funcs()...)
methods = append(methods, p.commonMethods()...)

ファイルの表示

@ -69,6 +69,7 @@ func (p *NonFunctionalPropertyGenerator) Definitions() (*codegen.Struct, *codege
ser, deser := p.serializationFuncs()
methods = append(methods, ser)
funcs = append(funcs, deser)
funcs = append(funcs, p.constructorFn())
methods = append(methods, p.funcs()...)
property := codegen.NewStruct(
fmt.Sprintf("%s is the non-functional property %q. It is permitted to have one or more values, and of different value types.", p.StructName(), p.PropertyName()),

ファイルの表示

@ -202,7 +202,7 @@ func (t *PackageGenerator) InitDefinitions(pkg Package, tgs []*TypeGenerator, pg
}
// RootDefinitions creates functions needed at the root level of the package declarations.
func (t *PackageGenerator) RootDefinitions(vocabName string, m *ManagerGenerator, tgs []*TypeGenerator, pgs []*PropertyGenerator) (ctors, ext, disj, extBy []*codegen.Function) {
func (t *PackageGenerator) RootDefinitions(vocabName string, m *ManagerGenerator, tgs []*TypeGenerator, pgs []*PropertyGenerator) (typeCtors, propCtors, ext, disj, extBy []*codegen.Function) {
return rootDefinitions(vocabName, m, tgs, pgs)
}
@ -280,10 +280,10 @@ func publicTypeDefinitions(tgs []*TypeGenerator) (typeI *codegen.Interface) {
// rootDefinitions creates common functions needed at the root level of the
// package declarations.
func rootDefinitions(vocabName string, m *ManagerGenerator, tgs []*TypeGenerator, pgs []*PropertyGenerator) (ctors, ext, disj, extBy []*codegen.Function) {
func rootDefinitions(vocabName string, m *ManagerGenerator, tgs []*TypeGenerator, pgs []*PropertyGenerator) (typeCtors, propCtors, ext, disj, extBy []*codegen.Function) {
// Type constructors
for _, tg := range tgs {
ctors = append(ctors, codegen.NewCommentedFunction(
typeCtors = append(typeCtors, codegen.NewCommentedFunction(
m.pkg.Path(),
fmt.Sprintf("New%s%s", vocabName, tg.TypeName()),
/*params=*/ nil,
@ -293,7 +293,21 @@ func rootDefinitions(vocabName string, m *ManagerGenerator, tgs []*TypeGenerator
tg.constructorFn().Call(),
),
},
fmt.Sprintf("New%s%s creates a new %s", tg.PublicPackage().Name(), tg.TypeName(), tg.InterfaceName())))
fmt.Sprintf("New%s%s creates a new %s", vocabName, tg.TypeName(), tg.InterfaceName())))
}
// Property Constructors
for _, pg := range pgs {
propCtors = append(propCtors, codegen.NewCommentedFunction(
m.pkg.Path(),
fmt.Sprintf("New%s%s", vocabName, pg.StructName()),
/*params=*/ nil,
[]jen.Code{jen.Qual(pg.GetPublicPackage().Path(), pg.InterfaceName())},
[]jen.Code{
jen.Return(
pg.constructorFn().Call(),
),
},
fmt.Sprintf("New%s%s creates a new %s", vocabName, pg.StructName(), pg.InterfaceName())))
}
// Extends
for _, tg := range tgs {

ファイルの表示

@ -380,3 +380,25 @@ func (p *PropertyGenerator) commonMethods() []*codegen.Method {
func (p *PropertyGenerator) isMethodName(i int) string {
return fmt.Sprintf("%s%s", isMethod, p.kindCamelName(i))
}
// constructorFn creates a constructor function with a default vocabulary
// alias.
func (p *PropertyGenerator) constructorFn() *codegen.Function {
return codegen.NewCommentedFunction(
p.GetPrivatePackage().Path(),
fmt.Sprintf("%s%s", constructorName, p.StructName()),
/*params=*/ nil,
[]jen.Code{
jen.Op("*").Qual(p.GetPrivatePackage().Path(), p.StructName()),
},
[]jen.Code{
jen.Return(
jen.Op("&").Qual(p.GetPrivatePackage().Path(), p.StructName()).Values(
jen.Dict{
jen.Id(aliasMember): jen.Lit(p.vocabAlias),
},
),
),
},
fmt.Sprintf("%s%s creates a new %s property.", constructorName, p.StructName(), p.PropertyName()))
}