From 8f4df1382f0277cfa2d0984df4bce541f24bcf2a Mon Sep 17 00:00:00 2001 From: Raphael Simon Date: Mon, 11 Aug 2025 00:34:13 -0700 Subject: [PATCH] =?UTF-8?q?jsonrpc:=20transformObject=20=E2=80=93=20cast?= =?UTF-8?q?=20array=20default=20elements=20only=20for=20alias=20element=20?= =?UTF-8?q?types;=20support=20[]any,=20[]string,=20[]{int,uint,float,bool}?= =?UTF-8?q?=20and=20expr.ArrayVal;=20avoid=20reflection=20and=20unify=20ha?= =?UTF-8?q?ndling;=20fix=20linter=20if-else=20chain?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- codegen/funcs.go | 3 +- codegen/go_transform.go | 72 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/codegen/funcs.go b/codegen/funcs.go index eee8e173b5..7df06cf91b 100644 --- a/codegen/funcs.go +++ b/codegen/funcs.go @@ -191,8 +191,9 @@ func SnakeCase(name string) string { // between with a single underscore name = strings.Join(strings.Fields(name), "_") - // Special handling for dashes to convert them into underscores + // Special handling for dashes and slashes to convert them into underscores name = strings.ReplaceAll(name, "-", "_") + name = strings.ReplaceAll(name, "/", "_") var b bytes.Buffer ln := len(name) diff --git a/codegen/go_transform.go b/codegen/go_transform.go index 7c63c2e7e9..8b4f1f90a2 100644 --- a/codegen/go_transform.go +++ b/codegen/go_transform.go @@ -271,9 +271,77 @@ func transformObject(source, target *expr.AttributeExpr, sourceVar, targetVar st case ta.SourceCtx.IsPrimitivePointer(n, srcMatt.AttributeExpr) || !expr.IsPrimitive(srcc.Type): // source attribute is a primitive pointer or not a primitive code += fmt.Sprintf("if %s == nil {\n\t", srcVar) - if ta.TargetCtx.IsPrimitivePointer(n, tgtMatt.AttributeExpr) && expr.IsPrimitive(tgtc.Type) { + switch { + case ta.TargetCtx.IsPrimitivePointer(n, tgtMatt.AttributeExpr) && expr.IsPrimitive(tgtc.Type): code += fmt.Sprintf("var tmp %s = %#v\n\t%s = &tmp\n", GoNativeTypeName(tgtc.Type), tdef, tgtVar) - } else { + case expr.IsArray(tgtc.Type): + arr := expr.AsArray(tgtc.Type) + if expr.IsAlias(arr.ElemType.Type) { + // Render typed array default literals for aliased element types, + // e.g. []pkg.EnumType{pkg.EnumType("val")}. + elemRef := ta.TargetCtx.Scope.Ref(arr.ElemType, ta.TargetCtx.Pkg(arr.ElemType)) + var items []string + switch dv := tdef.(type) { + case expr.ArrayVal: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []any: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []string: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []int: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []int32: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []int64: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []uint: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []uint32: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []uint64: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []float32: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []float64: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + case []bool: + for _, de := range dv { + items = append(items, fmt.Sprintf("%s(%#v)", elemRef, de)) + } + default: + // Fallback to raw default if we don't recognize the element slice + code += fmt.Sprintf("%s = %#v\n", tgtVar, tdef) + } + if len(items) > 0 { + code += fmt.Sprintf("%s = []%s{%s}\n", tgtVar, elemRef, strings.Join(items, ", ")) + } + } else { + // Non-alias element type: use raw default without casting elements + code += fmt.Sprintf("%s = %#v\n", tgtVar, tdef) + } + default: code += fmt.Sprintf("%s = %#v\n", tgtVar, tdef) } code += "}\n"