You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2023/06/13 14:56:24 UTC
[plc4x] 01/03: feat(plc4go/gen): added couple of missing features
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit 2931bd6df94db3390b446c71a647f3184aabe082
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Tue Jun 13 16:36:03 2023 +0200
feat(plc4go/gen): added couple of missing features
+ starExpr support
+ int and int32 support
---
plc4go/tools/plc4xgenerator/gen.go | 66 ++++++++++++++++++++++++++++++++++++--
1 file changed, 63 insertions(+), 3 deletions(-)
diff --git a/plc4go/tools/plc4xgenerator/gen.go b/plc4go/tools/plc4xgenerator/gen.go
index 6adad0b554..ee26100406 100644
--- a/plc4go/tools/plc4xgenerator/gen.go
+++ b/plc4go/tools/plc4xgenerator/gen.go
@@ -222,8 +222,9 @@ func (g *Generator) generate(typeName string) {
g.Printf("\t\treturn err\n")
g.Printf("\t}\n")
for _, field := range fields {
+ fieldType := field.fieldType
if field.isDelegate {
- g.Printf("\t\t\tif err := d.%s.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {\n", field.fieldType.(*ast.Ident).Name)
+ g.Printf("\t\t\tif err := d.%s.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {\n", fieldType.(*ast.Ident).Name)
g.Printf("\t\t\t\treturn err\n")
g.Printf("\t\t\t}\n")
continue
@@ -234,11 +235,47 @@ func (g *Generator) generate(typeName string) {
g.Printf(stringFieldSerialize, "d."+field.name+".String()", fieldNameUntitled)
continue
}
- switch fieldType := field.fieldType.(type) {
+ needsDereference := false
+ if starFieldType, ok := fieldType.(*ast.StarExpr); ok {
+ fieldType = starFieldType.X
+ needsDereference = true
+ _ = needsDereference // TODO: implement
+ }
+ switch fieldType := fieldType.(type) {
case *ast.SelectorExpr:
+ {
+ // TODO: bit hacky but not sure how else we catch those ones
+ x := fieldType.X
+ sel := fieldType.Sel
+ xIdent, xIsIdent := x.(*ast.Ident)
+ if xIsIdent {
+ if xIdent.Name == "atomic" {
+ if sel.Name == "Int32" {
+ g.Printf(int32FieldSerialize, "d."+field.name+".Load()", fieldNameUntitled)
+ continue
+ }
+ if sel.Name == "Bool" {
+ g.Printf(boolFieldSerialize, "d."+field.name+".Load()", fieldNameUntitled)
+ continue
+ }
+ if sel.Name == "Value" {
+ g.Printf(serializableFieldTemplate, "d."+field.name+".Load()", fieldNameUntitled)
+ continue
+ }
+ }
+ if xIdent.Name == "sync" {
+ fmt.Printf("\t skipping field %s because it is %v.%v\n", fieldName, x, sel)
+ continue
+ }
+ }
+ }
g.Printf(serializableFieldTemplate, "d."+field.name, fieldNameUntitled)
case *ast.Ident:
switch fieldType.Name {
+ case "int":
+ g.Printf(int64FieldSerialize, "int64(d."+field.name+")", fieldNameUntitled)
+ case "int32":
+ g.Printf(int32FieldSerialize, "int32(d."+field.name+")", fieldNameUntitled)
case "uint32":
g.Printf(uint32FieldSerialize, "d."+field.name, fieldNameUntitled)
case "bool":
@@ -249,18 +286,22 @@ func (g *Generator) generate(typeName string) {
g.Printf(errorFieldSerialize, "d."+field.name, fieldNameUntitled)
default:
fmt.Printf("\t no support implemented for Ident with type %v\n", fieldType)
+ g.Printf("{\n")
g.Printf("_value := fmt.Sprintf(\"%%v\", d.%s)\n", fieldName)
g.Printf(stringFieldSerialize, "_value", fieldNameUntitled)
+ g.Printf("}\n")
}
case *ast.ArrayType:
g.Printf("if err := writeBuffer.PushContext(%s, utils.WithRenderAsList(true)); err != nil {\n\t\treturn err\n\t}\n", fieldNameUntitled)
g.Printf("for _, elem := range d.%s {", field.name)
switch eltType := fieldType.Elt.(type) {
- case *ast.SelectorExpr:
+ case *ast.SelectorExpr, *ast.StarExpr:
g.Printf("\n\t\tvar elem any = elem\n")
g.Printf(serializableFieldTemplate, "elem", "\"value\"")
case *ast.Ident:
switch eltType.Name {
+ case "int":
+ g.Printf(int64FieldSerialize, "int64(d."+field.name+")", fieldNameUntitled)
case "uint32":
g.Printf(uint32FieldSerialize, "d."+field.name, fieldNameUntitled)
case "bool":
@@ -419,6 +460,13 @@ func (f *File) genDecl(node ast.Node) bool {
default:
panic(fmt.Sprintf("Only pointer to struct delegates supported now. Type %T", field.Type))
}
+ case *ast.SelectorExpr:
+ f.fields = append(f.fields, Field{
+ fieldType: ft.Sel,
+ isDelegate: true,
+ isStringer: isStringer,
+ })
+ continue
default:
panic(fmt.Sprintf("Only struct delegates supported now. Type %T", field.Type))
}
@@ -486,6 +534,18 @@ var serializableFieldTemplate = `
}
`
+var int32FieldSerialize = `
+ if err := writeBuffer.WriteInt32(%[2]s, 32, %[1]s); err != nil {
+ return err
+ }
+`
+
+var int64FieldSerialize = `
+ if err := writeBuffer.WriteInt64(%[2]s, 64, %[1]s); err != nil {
+ return err
+ }
+`
+
var uint32FieldSerialize = `
if err := writeBuffer.WriteUint32(%[2]s, 32, %[1]s); err != nil {
return err