From c7f1cd8e8e3702096516b82068b662a29eb79dea Mon Sep 17 00:00:00 2001 From: Kristoffer Fage Jensen Date: Thu, 11 Jul 2024 10:16:42 +0200 Subject: [PATCH] adds support for pointer function scoped fields (#1841) --- packages.go | 19 +++++++++++-------- parser_test.go | 16 +++++++++++++++- testdata/simple/api/api.go | 7 ++++++- testdata/simple/expected.json | 11 +++++++++++ 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/packages.go b/packages.go index 274fc3081..d0640334e 100644 --- a/packages.go +++ b/packages.go @@ -216,18 +216,21 @@ func (pkgDefs *PackagesDefinitions) parseFunctionScopedTypesFromFile(astFile *as fullName := typeSpecDef.TypeName() if structType, ok := typeSpecDef.TypeSpec.Type.(*ast.StructType); ok { for _, field := range structType.Fields.List { - if idt, ok := field.Type.(*ast.Ident); ok && !IsGolangPrimitiveType(idt.Name) { + var idt *ast.Ident + var ok bool + switch field.Type.(type) { + case *ast.Ident: + idt, ok = field.Type.(*ast.Ident) + case *ast.StarExpr: + idt, ok = field.Type.(*ast.StarExpr).X.(*ast.Ident) + case *ast.ArrayType: + idt, ok = field.Type.(*ast.ArrayType).Elt.(*ast.Ident) + } + if ok && !IsGolangPrimitiveType(idt.Name) { if functype, ok := functionScopedTypes[idt.Name]; ok { idt.Name = functype.TypeName() } } - if art, ok := field.Type.(*ast.ArrayType); ok { - if idt, ok := art.Elt.(*ast.Ident); ok && !IsGolangPrimitiveType(idt.Name) { - if functype, ok := functionScopedTypes[idt.Name]; ok { - idt.Name = functype.TypeName() - } - } - } } } diff --git a/parser_test.go b/parser_test.go index c2bc7546d..a8bcd46e4 100644 --- a/parser_test.go +++ b/parser_test.go @@ -3407,8 +3407,18 @@ func Fun() { Name string } + type pointerChild struct { + Name string + } + + type arrayChild struct { + Name string + } + type child struct { - GrandChild grandChild + GrandChild grandChild + PointerChild *pointerChild + ArrayChildren []arrayChild } type response struct { @@ -3430,6 +3440,10 @@ func Fun() { assert.True(t, ok) _, ok = p.swagger.Definitions["main.Fun.grandChild"] assert.True(t, ok) + _, ok = p.swagger.Definitions["main.Fun.pointerChild"] + assert.True(t, ok) + _, ok = p.swagger.Definitions["main.Fun.arrayChild"] + assert.True(t, ok) } func TestParseFunctionScopedStructRequestResponseJSON(t *testing.T) { diff --git a/testdata/simple/api/api.go b/testdata/simple/api/api.go index 8c3205708..3896ef9e1 100644 --- a/testdata/simple/api/api.go +++ b/testdata/simple/api/api.go @@ -146,7 +146,12 @@ func GetPet6FunctionScopedComplexResponse() { Name string } + type pointerPet struct { + Name string + } + type response struct { - Pets []pet + Pets []pet + PointerPet *pointerPet } } diff --git a/testdata/simple/expected.json b/testdata/simple/expected.json index ad2adf27d..e1bcadb7d 100644 --- a/testdata/simple/expected.json +++ b/testdata/simple/expected.json @@ -421,6 +421,14 @@ } } }, + "api.GetPet6FunctionScopedComplexResponse.pointerPet": { + "type": "object", + "properties": { + "Name": { + "type": "string" + } + } + }, "api.GetPet6FunctionScopedComplexResponse.response": { "type": "object", "properties": { @@ -429,6 +437,9 @@ "items": { "$ref": "#/definitions/api.GetPet6FunctionScopedComplexResponse.pet" } + }, + "PointerPet": { + "$ref": "#/definitions/api.GetPet6FunctionScopedComplexResponse.pointerPet" } } },