aboutsummaryrefslogtreecommitdiffstats
path: root/binapigen/generate.go
diff options
context:
space:
mode:
authorOndrej Fabry <ofabry@cisco.com>2020-08-28 20:42:20 +0200
committerOndrej Fabry <ofabry@cisco.com>2020-08-28 20:42:20 +0200
commit15c53e7a9da6f61448b77339b5b762ada0050aff (patch)
treed27febeb074d855ace564d09ad609f2556d5e63d /binapigen/generate.go
parenta4e8bf2efe9189ce795f87ab07adbb3780d01d7d (diff)
fix(binapigen): Fix name conflict for union field constructors
PROBLEM Issue discovered in flow_types.api on master (20.09-rc0), where generator encountered inconsistent naming for union type Flow, causing name conflicts with their constructors. SOLUTION Previous cases of union types (address, punt) both contain suffix "Union", thus generator now adds "Union" suffix it is not defined. This way we won't break previously generated code for users. Change-Id: Iffadc167774d66d8416fe36485782bb68ca2a70d Signed-off-by: Ondrej Fabry <ofabry@cisco.com>
Diffstat (limited to 'binapigen/generate.go')
-rw-r--r--binapigen/generate.go25
1 files changed, 18 insertions, 7 deletions
diff --git a/binapigen/generate.go b/binapigen/generate.go
index 698c798..834c989 100644
--- a/binapigen/generate.go
+++ b/binapigen/generate.go
@@ -285,8 +285,10 @@ func genUnion(g *GenFile, union *Union) {
g.P("type ", union.GoName, " struct {")
+ // generate field comments
+ g.P("// ", union.GoName, " can be one of:")
for _, field := range union.Fields {
- g.P("// ", field.GoName, " *", getFieldType(g, field))
+ g.P("// - ", field.GoName, " *", getFieldType(g, field))
}
// generate data field
@@ -299,22 +301,23 @@ func genUnion(g *GenFile, union *Union) {
// generate methods for fields
for _, field := range union.Fields {
- genUnionFieldMethods(g, union.GoName, field)
+ genUnionField(g, union, field)
}
g.P()
}
-func genUnionFieldMethods(g *GenFile, structName string, field *Field) {
- getterStruct := fieldGoType(g, field)
+func genUnionField(g *GenFile, union *Union, field *Field) {
+ fieldType := fieldGoType(g, field)
+ constructorName := union.GoName + field.GoName
// Constructor
- g.P("func ", structName, field.GoName, "(a ", getterStruct, ") (u ", structName, ") {")
+ g.P("func ", constructorName, "(a ", fieldType, ") (u ", union.GoName, ") {")
g.P(" u.Set", field.GoName, "(a)")
g.P(" return")
g.P("}")
// Setter
- g.P("func (u *", structName, ") Set", field.GoName, "(a ", getterStruct, ") {")
+ g.P("func (u *", union.GoName, ") Set", field.GoName, "(a ", fieldType, ") {")
g.P(" buf := ", govppCodecPkg.Ident("NewBuffer"), "(u.", fieldUnionData, "[:])")
encodeField(g, field, "a", func(name string) string {
return "a." + name
@@ -322,16 +325,24 @@ func genUnionFieldMethods(g *GenFile, structName string, field *Field) {
g.P("}")
// Getter
- g.P("func (u *", structName, ") Get", field.GoName, "() (a ", getterStruct, ") {")
+ g.P("func (u *", union.GoName, ") Get", field.GoName, "() (a ", fieldType, ") {")
g.P(" buf := ", govppCodecPkg.Ident("NewBuffer"), "(u.", fieldUnionData, "[:])")
decodeField(g, field, "a", func(name string) string {
return "a." + name
}, 0)
g.P(" return")
g.P("}")
+
g.P()
}
+func withSuffix(s string, suffix string) string {
+ if strings.HasSuffix(s, suffix) {
+ return s
+ }
+ return s + suffix
+}
+
func genField(g *GenFile, fields []*Field, i int) {
field := fields[i]