This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch main
in repository ego.

View the commit online.

commit c9935e8bcfa743db0df32c148b0d45532f8aba0d
Author: [email protected] <[email protected]>
AuthorDate: Mon Mar 30 14:13:44 2026 -0600

    feat(ego-gen): add per-value type dispatch to multi-value templates
    
    Multi-value getter/setter templates now handle string, Eo pointer,
    enum typedef, and bool values individually instead of assuming all
    values are simple scalar casts. Applied to both regular property
    and indexed property template paths.
    
    Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---
 cmd/ego-gen/generator_test.go       | 60 +++++++++++++++++++++++++++++++++++++
 cmd/ego-gen/templates/class.go.tmpl | 40 ++++++++++++++++++++-----
 2 files changed, 92 insertions(+), 8 deletions(-)

diff --git a/cmd/ego-gen/generator_test.go b/cmd/ego-gen/generator_test.go
index c63104b..88dbfd6 100644
--- a/cmd/ego-gen/generator_test.go
+++ b/cmd/ego-gen/generator_test.go
@@ -622,6 +622,66 @@ func TestIsMultiValueCompatible(t *testing.T) {
 	}
 }
 
+func TestGenerateClass_MultiValueWithEo(t *testing.T) {
+	g, outDir := newTestGenerator(t)
+
+	data := ClassData{
+		PackageName:   "canvas",
+		GoName:        "VgNode",
+		EolianName:    "Efl.Canvas.Vg.Node",
+		CClassName:    "EFL_CANVAS_VG_NODE_CLASS",
+		CClassGetFunc: "efl_canvas_vg_node_class_get",
+		CPrefix:       "efl_canvas_vg_node",
+		EOHeaderFile:  "efl_canvas_vg_node.eo.h",
+		IsAbstract:    true,
+		Properties: []PropertyData{
+			{
+				GoGetter:     "CompMethod",
+				GoSetter:     "SetCompMethod",
+				CGetName:     "efl_canvas_vg_node_comp_method_get",
+				CSetName:     "efl_canvas_vg_node_comp_method_set",
+				HasGet:       true,
+				HasSet:       true,
+				IsMultiValue: true,
+				MultiGetValues: []MultiValueData{
+					{GoName: "Other", LowerGoName: "other", GoType: "unsafe.Pointer", CType: "Efl_Canvas_Vg_Node *", IsEo: true},
+					{GoName: "Method", LowerGoName: "method", GoType: "int", CType: "int"},
+				},
+				MultiSetValues: []MultiValueData{
+					{GoName: "Other", LowerGoName: "other", GoType: "unsafe.Pointer", CType: "Efl_Canvas_Vg_Node *", IsEo: true},
+					{GoName: "Method", LowerGoName: "method", GoType: "int", CType: "int"},
+				},
+			},
+		},
+	}
+
+	if err := g.GenerateClass(data); err != nil {
+		t.Fatalf("GenerateClass: %v", err)
+	}
+
+	outFile := filepath.Join(outDir, "canvas", "vg_node.go")
+	content, err := os.ReadFile(outFile)
+	if err != nil {
+		t.Fatalf("output file not found at %s: %v", outFile, err)
+	}
+
+	src := string(content)
+
+	mustContain := []string{
+		"func (o *VgNode) CompMethod() (other unsafe.Pointer, method int)",
+		"var cOther *C.Eo",
+		"unsafe.Pointer(cOther)",
+		"func (o *VgNode) SetCompMethod(other efl.Objecter, method int)",
+		"(*C.Eo)(other.Eo())",
+	}
+
+	for _, want := range mustContain {
+		if !strings.Contains(src, want) {
+			t.Errorf("output missing expected pattern %q\nfile content:\n%s", want, src)
+		}
+	}
+}
+
 func TestGenerateClass_MultiValueMixedTypes(t *testing.T) {
 	g, outDir := newTestGenerator(t)
 
diff --git a/cmd/ego-gen/templates/class.go.tmpl b/cmd/ego-gen/templates/class.go.tmpl
index b7fe33d..f716351 100644
--- a/cmd/ego-gen/templates/class.go.tmpl
+++ b/cmd/ego-gen/templates/class.go.tmpl
@@ -257,12 +257,18 @@ func {{$opt.GoOptionName}}(val {{$opt.StructGoType}}) efl.Option {
 
 {{- if $prop.IsMultiValue}}
 // {{$prop.GoGetter}} returns the {{$prop.GoGetter}} property of the {{$.GoName}}.
-func (o *{{$.GoName}}) {{$prop.GoGetter}}() ({{range $i, $v := $prop.MultiGetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{$v.GoType}}{{end}}) {
+func (o *{{$.GoName}}) {{$prop.GoGetter}}() ({{range $i, $v := $prop.MultiGetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{if needsStringConversion $v.CType}}string{{else if $v.IsEo}}unsafe.Pointer{{else}}{{$v.GoType}}{{end}}{{end}}) {
 {{- range $v := $prop.MultiGetValues}}
+{{- if needsStringConversion $v.CType}}
+    var c{{$v.GoName}} *C.char
+{{- else if $v.IsEo}}
+    var c{{$v.GoName}} *C.Eo
+{{- else}}
     var c{{$v.GoName}} C.{{cTypeToCgo $v.CType}}
+{{- end}}
 {{- end}}
     C.{{$prop.CGetName}}((*C.Eo)(o.Eo()){{range $prop.MultiGetValues}}, &c{{.GoName}}{{end}})
-    return {{range $i, $v := $prop.MultiGetValues}}{{if $i}}, {{end}}{{- if isBoolType $v.CType}}c{{$v.GoName}} != 0{{else}}{{$v.GoType}}(c{{$v.GoName}}){{end}}{{end}}
+    return {{range $i, $v := $prop.MultiGetValues}}{{if $i}}, {{end}}{{- if needsStringConversion $v.CType}}C.GoString(c{{$v.GoName}}){{else if isBoolType $v.CType}}c{{$v.GoName}} != 0{{else if $v.IsEo}}unsafe.Pointer(c{{$v.GoName}}){{else if isEnumTypedefKey $v.CType}}unsafe.Pointer(uintptr(c{{$v.GoName}})){{else}}{{$v.GoType}}(c{{$v.GoName}}){{end}}{{end}}
 }
 {{- else}}
 // {{$prop.GoGetter}} returns the {{$prop.GoGetter}} property of the {{$.GoName}}.
@@ -290,8 +296,14 @@ func (o *{{$.GoName}}) {{$prop.GoGetter}}() {{$prop.GoType}} {
 
 {{- if $prop.IsMultiValue}}
 // {{$prop.GoSetter}} sets the {{$prop.GoGetter}} property of the {{$.GoName}}.
-func (o *{{$.GoName}}) {{$prop.GoSetter}}({{range $i, $v := $prop.MultiSetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{$v.GoType}}{{end}}) {
-    C.{{$prop.CSetName}}((*C.Eo)(o.Eo()){{range $prop.MultiSetValues}}{{- if isBoolType .CType}}, func() C.{{cTypeToCgo .CType}} { if {{.LowerGoName}} { return 1 }; return 0 }(){{else}}, C.{{cTypeToCgo .CType}}({{.LowerGoName}}){{end}}{{end}})
+func (o *{{$.GoName}}) {{$prop.GoSetter}}({{range $i, $v := $prop.MultiSetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{if needsStringConversion $v.CType}}string{{else if $v.IsEo}}efl.Objecter{{else}}{{$v.GoType}}{{end}}{{end}}) {
+{{- range $v := $prop.MultiSetValues}}
+{{- if needsStringConversion $v.CType}}
+    c{{$v.GoName}} := C.CString({{$v.LowerGoName}})
+    defer C.free(unsafe.Pointer(c{{$v.GoName}}))
+{{- end}}
+{{- end}}
+    C.{{$prop.CSetName}}((*C.Eo)(o.Eo()){{range $prop.MultiSetValues}}{{- if needsStringConversion .CType}}, c{{.GoName}}{{else if isBoolType .CType}}, func() C.{{cTypeToCgo .CType}} { if {{.LowerGoName}} { return 1 }; return 0 }(){{else if .IsEo}}, (*C.Eo)({{.LowerGoName}}.Eo()){{else if isEnumTypedefKey .CType}}, C.{{cTypeToCgo .CType}}(uintptr({{.LowerGoName}})){{else}}, C.{{cTypeToCgo .CType}}({{.LowerGoName}}){{end}}{{end}})
 }
 {{- else}}
 // {{$prop.GoSetter}} sets the {{$prop.GoGetter}} property of the {{$.GoName}}.
@@ -376,7 +388,7 @@ func (o *{{$.GoName}}) {{$ip.GoAccessorMethod}}({{range $i, $k := $ip.Keys}}{{if
 {{- if $ip.HasGet}}
 {{- if $ip.IsMultiValue}}
 // Get returns the values for the captured key(s).
-func (p {{$ip.AccessorTypeName}}) Get() ({{range $i, $v := $ip.MultiGetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{$v.GoType}}{{end}}) {
+func (p {{$ip.AccessorTypeName}}) Get() ({{range $i, $v := $ip.MultiGetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{if needsStringConversion $v.CType}}string{{else if $v.IsEo}}unsafe.Pointer{{else}}{{$v.GoType}}{{end}}{{end}}) {
 {{- range $ip.Keys}}
 {{- if needsStringConversion .CType}}
     c{{.GoName}} := C.CString(p.{{.GoName}})
@@ -384,10 +396,16 @@ func (p {{$ip.AccessorTypeName}}) Get() ({{range $i, $v := $ip.MultiGetValues}}{
 {{- end}}
 {{- end}}
 {{- range $v := $ip.MultiGetValues}}
+{{- if needsStringConversion $v.CType}}
+    var c{{$v.GoName}} *C.char
+{{- else if $v.IsEo}}
+    var c{{$v.GoName}} *C.Eo
+{{- else}}
     var c{{$v.GoName}} C.{{cTypeToCgo $v.CType}}
+{{- end}}
 {{- end}}
     C.{{$ip.CGetName}}(p.obj{{range $ip.Keys}}, {{template "indexedKeyArg" .}}{{end}}{{range $ip.MultiGetValues}}, &c{{.GoName}}{{end}})
-    return {{range $i, $v := $ip.MultiGetValues}}{{if $i}}, {{end}}{{- if isBoolType $v.CType}}c{{$v.GoName}} != 0{{else}}{{$v.GoType}}(c{{$v.GoName}}){{end}}{{end}}
+    return {{range $i, $v := $ip.MultiGetValues}}{{if $i}}, {{end}}{{- if needsStringConversion $v.CType}}C.GoString(c{{$v.GoName}}){{else if isBoolType $v.CType}}c{{$v.GoName}} != 0{{else if $v.IsEo}}unsafe.Pointer(c{{$v.GoName}}){{else if isEnumTypedefKey $v.CType}}unsafe.Pointer(uintptr(c{{$v.GoName}})){{else}}{{$v.GoType}}(c{{$v.GoName}}){{end}}{{end}}
 }
 {{- else}}
 // Get returns the value for the captured key(s).
@@ -423,14 +441,20 @@ func (p {{$ip.AccessorTypeName}}) Get() {{if $ip.IsStruct}}{{$ip.StructGoType}}{
 {{- if $ip.HasSet}}
 {{- if $ip.IsMultiValue}}
 // Set sets the values for the captured key(s).
-func (p {{$ip.AccessorTypeName}}) Set({{range $i, $v := $ip.MultiSetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{$v.GoType}}{{end}}) {
+func (p {{$ip.AccessorTypeName}}) Set({{range $i, $v := $ip.MultiSetValues}}{{if $i}}, {{end}}{{$v.LowerGoName}} {{if needsStringConversion $v.CType}}string{{else if $v.IsEo}}efl.Objecter{{else}}{{$v.GoType}}{{end}}{{end}}) {
 {{- range $ip.Keys}}
 {{- if needsStringConversion .CType}}
     c{{.GoName}} := C.CString(p.{{.GoName}})
     defer C.free(unsafe.Pointer(c{{.GoName}}))
 {{- end}}
 {{- end}}
-    C.{{$ip.CSetName}}(p.obj{{range $ip.Keys}}, {{template "indexedKeyArg" .}}{{end}}{{range $ip.MultiSetValues}}{{- if isBoolType .CType}}, func() C.{{cTypeToCgo .CType}} { if {{.LowerGoName}} { return 1 }; return 0 }(){{else}}, C.{{cTypeToCgo .CType}}({{.LowerGoName}}){{end}}{{end}})
+{{- range $v := $ip.MultiSetValues}}
+{{- if needsStringConversion $v.CType}}
+    c{{$v.GoName}} := C.CString({{$v.LowerGoName}})
+    defer C.free(unsafe.Pointer(c{{$v.GoName}}))
+{{- end}}
+{{- end}}
+    C.{{$ip.CSetName}}(p.obj{{range $ip.Keys}}, {{template "indexedKeyArg" .}}{{end}}{{range $ip.MultiSetValues}}{{- if needsStringConversion .CType}}, c{{.GoName}}{{else if isBoolType .CType}}, func() C.{{cTypeToCgo .CType}} { if {{.LowerGoName}} { return 1 }; return 0 }(){{else if .IsEo}}, (*C.Eo)({{.LowerGoName}}.Eo()){{else if isEnumTypedefKey .CType}}, C.{{cTypeToCgo .CType}}(uintptr({{.LowerGoName}})){{else}}, C.{{cTypeToCgo .CType}}({{.LowerGoName}}){{end}}{{end}})
 }
 {{- else}}
 // Set sets the value for the captured key(s).

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to