diff --git a/generics.go b/generics.go index 2e59890e8..89202765a 100644 --- a/generics.go +++ b/generics.go @@ -268,13 +268,19 @@ func getExtendedGenericFieldType(file *ast.File, field ast.Expr, genericParamTyp case *ast.Ident: if genericParamTypeDefs != nil { if typeSpec, ok := genericParamTypeDefs[fieldType.Name]; ok { - if typeSpec.TypeSpec == nil && IsGolangPrimitiveType(typeSpec.Name) { - return typeSpec.Name, nil - } - return typeSpec.TypeSpec.FullName(), nil + return typeSpec.Name, nil } } - return getFieldType(file, field) + if fieldType.Obj == nil { + return fieldType.Name, nil + } + + tSpec := &TypeSpecDef{ + File: file, + TypeSpec: fieldType.Obj.Decl.(*ast.TypeSpec), + PkgPath: file.Name.Name, + } + return tSpec.FullName(), nil default: return getFieldType(file, field) } @@ -334,15 +340,13 @@ func getGenericFieldType(file *ast.File, field ast.Expr, genericParamTypeDefs ma func getGenericTypeName(file *ast.File, field ast.Expr, genericParamTypeDefs map[string]*genericTypeSpec) (string, error) { switch fieldType := field.(type) { case *ast.Ident: - if fieldType.Obj == nil { - if genericParamTypeDefs != nil { - if typeSpec, ok := genericParamTypeDefs[fieldType.Name]; ok { - if typeSpec.TypeSpec == nil && IsGolangPrimitiveType(typeSpec.Name) { - return typeSpec.Name, nil - } - return typeSpec.TypeSpec.FullName(), nil - } + if genericParamTypeDefs != nil { + if typeSpec, ok := genericParamTypeDefs[fieldType.Name]; ok { + return typeSpec.Name, nil } + } + + if fieldType.Obj == nil { return fieldType.Name, nil } diff --git a/testdata/generics_property/api/api.go b/testdata/generics_property/api/api.go index 4c0ceb80c..e68938f81 100644 --- a/testdata/generics_property/api/api.go +++ b/testdata/generics_property/api/api.go @@ -22,6 +22,8 @@ type CreateMovie struct { Producer types.Field[*Person] Audience Audience[Person] AudienceNames Audience[string] + Detail1 types.Field[types.Field[Person]] + Detail2 types.Field[types.Field[string]] } type Person struct { diff --git a/testdata/generics_property/expected.json b/testdata/generics_property/expected.json index 4b95f41a1..36acc18ca 100644 --- a/testdata/generics_property/expected.json +++ b/testdata/generics_property/expected.json @@ -120,6 +120,12 @@ "cameraPeople": { "$ref": "#/definitions/types.Field-array_api_Person" }, + "detail1": { + "$ref": "#/definitions/types.Field-types_Field_api_Person" + }, + "detail2": { + "$ref": "#/definitions/types.Field-types_Field_string" + }, "directors": { "$ref": "#/definitions/types.Field-array_api_Person" }, @@ -292,6 +298,62 @@ } } }, + "types.Field-types_Field_api_Person": { + "type": "object", + "properties": { + "value": { + "$ref": "#/definitions/types.Field-api_Person" + }, + "value2": { + "$ref": "#/definitions/types.Field-api_Person" + }, + "value3": { + "type": "array", + "items": { + "$ref": "#/definitions/types.Field-api_Person" + } + }, + "value4": { + "type": "object", + "properties": { + "subValue1": { + "$ref": "#/definitions/types.Field-api_Person" + }, + "subValue2": { + "type": "string" + } + } + } + } + }, + "types.Field-types_Field_string": { + "type": "object", + "properties": { + "value": { + "$ref": "#/definitions/types.Field-string" + }, + "value2": { + "$ref": "#/definitions/types.Field-string" + }, + "value3": { + "type": "array", + "items": { + "$ref": "#/definitions/types.Field-string" + } + }, + "value4": { + "type": "object", + "properties": { + "subValue1": { + "$ref": "#/definitions/types.Field-string" + }, + "subValue2": { + "type": "string" + } + } + } + } + }, "types.Post": { "type": "object", "properties": {