Add constructors in pkg and for types.
このコミットが含まれているのは:
コミット
a93c6aa678
|
@ -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()))
|
||||||
|
}
|
||||||
|
|
読み込み中…
新しいイシューから参照