From 248a464c02a7b1161a9da152f2a85343a094e92d Mon Sep 17 00:00:00 2001 From: Cory Slep Date: Sat, 26 Jan 2019 19:46:25 +0100 Subject: [PATCH] Add property constructors. --- tools/exp/convert/convert.go | 5 +++-- tools/exp/gen/funcprop.go | 2 ++ tools/exp/gen/nonfuncprop.go | 1 + tools/exp/gen/pkg.go | 22 ++++++++++++++++++---- tools/exp/gen/property.go | 22 ++++++++++++++++++++++ 5 files changed, 46 insertions(+), 6 deletions(-) diff --git a/tools/exp/convert/convert.go b/tools/exp/convert/convert.go index a6c8448..959a085 100644 --- a/tools/exp/convert/convert.go +++ b/tools/exp/convert/convert.go @@ -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))) diff --git a/tools/exp/gen/funcprop.go b/tools/exp/gen/funcprop.go index eb51970..42a83ca 100644 --- a/tools/exp/gen/funcprop.go +++ b/tools/exp/gen/funcprop.go @@ -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()...) diff --git a/tools/exp/gen/nonfuncprop.go b/tools/exp/gen/nonfuncprop.go index 3dbb412..69a01eb 100644 --- a/tools/exp/gen/nonfuncprop.go +++ b/tools/exp/gen/nonfuncprop.go @@ -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()), diff --git a/tools/exp/gen/pkg.go b/tools/exp/gen/pkg.go index d34a3f9..dbfaa01 100644 --- a/tools/exp/gen/pkg.go +++ b/tools/exp/gen/pkg.go @@ -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 { diff --git a/tools/exp/gen/property.go b/tools/exp/gen/property.go index 36179f2..864cc05 100644 --- a/tools/exp/gen/property.go +++ b/tools/exp/gen/property.go @@ -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())) +}