@@ -106,25 +106,38 @@ func (s *NameScope) GoTypeDef(att *expr.AttributeExpr, ptr, useDefault bool) str
106106 return s .goTypeDef (att , ptr , useDefault , pkg )
107107}
108108
109- func (s * NameScope ) goTypeDef (att * expr.AttributeExpr , ptr , useDefault bool , pkg string ) string {
109+ // GoTypeDefWithTargetPkg returns the Go type definition string, qualifying any
110+ // user types inside inline structs with the provided target package. This helps
111+ // when generating JSON-RPC client types that embed inline structs referencing
112+ // user types defined in a separate package (e.g., gen/types).
113+ func (s * NameScope ) GoTypeDefWithTargetPkg (att * expr.AttributeExpr , ptr , useDefault bool , targetPkg string ) string {
114+ return s .goTypeDefWithPkgOverride (att , ptr , useDefault , "" , targetPkg )
115+ }
116+
117+ // goTypeDefWithPkgOverride generates the Go type definition string for the attribute.
118+ // When targetPkg is not empty, user types referenced inside inline structs are
119+ // qualified against targetPkg unless they are defined in a different package,
120+ // in which case their own package is used. When targetPkg is empty, the
121+ // package qualification falls back to pkg and the user type location.
122+ func (s * NameScope ) goTypeDefWithPkgOverride (att * expr.AttributeExpr , ptr , useDefault bool , pkg , targetPkg string ) string {
110123 switch actual := att .Type .(type ) {
111124 case expr.Primitive :
112125 if t , _ := GetMetaType (att ); t != "" {
113126 return t
114127 }
115128 return GoNativeTypeName (actual )
116129 case * expr.Array :
117- d := s .goTypeDef (actual .ElemType , ptr , useDefault , pkg )
130+ d := s .goTypeDefWithPkgOverride (actual .ElemType , ptr , useDefault , pkg , targetPkg )
118131 if expr .IsObject (actual .ElemType .Type ) {
119132 d = "*" + d
120133 }
121134 return "[]" + d
122135 case * expr.Map :
123- keyDef := s .goTypeDef (actual .KeyType , ptr , useDefault , pkg )
136+ keyDef := s .goTypeDefWithPkgOverride (actual .KeyType , ptr , useDefault , pkg , targetPkg )
124137 if expr .IsObject (actual .KeyType .Type ) {
125138 keyDef = "*" + keyDef
126139 }
127- elemDef := s .goTypeDef (actual .ElemType , ptr , useDefault , pkg )
140+ elemDef := s .goTypeDefWithPkgOverride (actual .ElemType , ptr , useDefault , pkg , targetPkg )
128141 if expr .IsObject (actual .ElemType .Type ) {
129142 elemDef = "*" + elemDef
130143 }
@@ -145,7 +158,7 @@ func (s *NameScope) goTypeDef(att *expr.AttributeExpr, ptr, useDefault bool, pkg
145158 )
146159 {
147160 fn = GoifyAtt (at , name , true )
148- tdef = s .goTypeDef (at , ptr , useDefault , pkg )
161+ tdef = s .goTypeDefWithPkgOverride (at , ptr , useDefault , pkg , targetPkg )
149162 if expr .IsObject (at .Type ) ||
150163 att .IsPrimitivePointer (name , useDefault ) ||
151164 (ptr && expr .IsPrimitive (at .Type ) && at .Type .Kind () != expr .AnyKind && at .Type .Kind () != expr .BytesKind ) {
@@ -165,15 +178,29 @@ func (s *NameScope) goTypeDef(att *expr.AttributeExpr, ptr, useDefault bool, pkg
165178 return "struct {}"
166179 }
167180 var prefix string
168- if loc := UserTypeLocation (actual ); loc != nil && loc .PackageName () != pkg {
169- prefix = loc .PackageName () + "."
181+ if loc := UserTypeLocation (actual ); loc != nil {
182+ if targetPkg != "" {
183+ if loc .PackageName () != targetPkg {
184+ prefix = loc .PackageName () + "."
185+ } else {
186+ prefix = targetPkg + "."
187+ }
188+ } else if loc .PackageName () != pkg {
189+ prefix = loc .PackageName () + "."
190+ }
191+ } else if targetPkg != "" {
192+ prefix = targetPkg + "."
170193 }
171194 return prefix + s .GoTypeName (att )
172195 default :
173196 panic (fmt .Sprintf ("unknown data type %T" , actual )) // bug
174197 }
175198}
176199
200+ func (s * NameScope ) goTypeDef (att * expr.AttributeExpr , ptr , useDefault bool , pkg string ) string {
201+ return s .goTypeDefWithPkgOverride (att , ptr , useDefault , pkg , "" )
202+ }
203+
177204// GoVar returns the Go code that returns the address of a variable of the Go type
178205// which matches the given attribute type.
179206func (* NameScope ) GoVar (varName string , dt expr.DataType ) string {
0 commit comments