@@ -306,26 +306,32 @@ func localNamedToSchema(ctx *schemaContext, ident *ast.Ident) *apiextensionsv1.J
306306 ctx .requestSchema (pkgPath , typeNameInfo .Name ())
307307 link := TypeRefLink (pkgPath , typeNameInfo .Name ())
308308
309+ // For type aliases to slice/map types, include the underlying type information
310+ // so that markers like +listType can be applied at the field level.
311+ // This mirrors the behavior for basic type aliases (see above).
312+ props := & apiextensionsv1.JSONSchemaProps {
313+ Ref : & link ,
314+ }
315+
309316 // In cases where we have a named type, apply the type and format from the named schema
310317 // to allow markers that need this information to apply correctly.
311- var typ , fmt string
312318 if namedInfo , isNamed := typeInfo .(* types.Named ); isNamed {
313- // We don't want/need to do this for structs, maps, or arrays.
314- // These are already handled in infoToSchema if they have custom marshalling.
315- if _ , isBasic := namedInfo .Underlying ().(* types.Basic ); isBasic {
319+ switch namedInfo .Underlying ().(type ) {
320+ case * types.Slice :
321+ props .Type = "array"
322+ case * types.Map :
323+ props .Type = "object"
324+ case * types.Basic :
325+ // We don't want/need to do this for structs, maps, or arrays.
326+ // These are already handled in infoToSchema if they have custom marshalling.
316327 namedTypeInfo := ctx .schemaRequester .LookupType (ctx .pkg , namedInfo .Obj ().Name ())
317-
318328 namedSchema := infoToSchema (ctx .ForInfo (namedTypeInfo ))
319- typ = namedSchema .Type
320- fmt = namedSchema .Format
329+ props . Type = namedSchema .Type
330+ props . Format = namedSchema .Format
321331 }
322332 }
323333
324- return & apiextensionsv1.JSONSchemaProps {
325- Type : typ ,
326- Format : fmt ,
327- Ref : & link ,
328- }
334+ return props
329335}
330336
331337// namedSchema creates a schema (ref) for an explicitly external type reference.
@@ -340,10 +346,19 @@ func namedToSchema(ctx *schemaContext, named *ast.SelectorExpr) *apiextensionsv1
340346 nonVendorPath := loader .NonVendorPath (typeNameInfo .Pkg ().Path ())
341347 ctx .requestSchema (nonVendorPath , typeNameInfo .Name ())
342348 link := TypeRefLink (nonVendorPath , typeNameInfo .Name ())
343- return & apiextensionsv1.JSONSchemaProps {
349+ // For type aliases to slice/map types, include the underlying type information
350+ // so that markers like +listType can be applied at the field level.
351+ props := & apiextensionsv1.JSONSchemaProps {
344352 Ref : & link ,
345353 }
354+ switch typeInfoRaw .Underlying ().(type ) {
355+ case * types.Slice :
356+ props .Type = "array"
357+ case * types.Map :
358+ props .Type = "object"
359+ }
346360 // NB(directxman12): we special-case things like resource.Quantity during the "collapse" phase.
361+ return props
347362}
348363
349364// arrayToSchema creates a schema for the items of the given array, dealing appropriately
0 commit comments