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