From 34d6eaa258fd36cd9494fa29e241a1d5277b85a6 Mon Sep 17 00:00:00 2001 From: Surawich Laprattanatrai Date: Sun, 8 Feb 2026 17:17:46 +0700 Subject: [PATCH] Fix generation of map parameters --- CHANGELOG.md | 6 ++++++ internal/codegen/function.go | 3 +++ internal/codegen/function_test.go | 26 ++++++++++++++++++++++++++ main.go | 2 +- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 527dd00..a65c3b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Unreleased +## v0.4.1 - 2025-02-08 + +### Fixed + +- Fixed failed generation when the interface parameter has map type which contains a named type. + ## v0.4.0 - 2025-02-08 ### Breaking Changes diff --git a/internal/codegen/function.go b/internal/codegen/function.go index 01c783c..0d97eab 100644 --- a/internal/codegen/function.go +++ b/internal/codegen/function.go @@ -65,6 +65,9 @@ func TypeToString(pkg *types.Package, t types.Type) string { case *types.Slice: return fmt.Sprintf("[]%s", TypeToString(pkg, t.Elem())) + case *types.Map: + return fmt.Sprintf("map[%s]%s", TypeToString(pkg, t.Key()), TypeToString(pkg, t.Elem())) + case *types.Named: if pkg == nil || (t.Obj().Pkg() != nil && t.Obj().Pkg().Path() != pkg.Path()) { return fmt.Sprintf("%s.%s", t.Obj().Pkg().Name(), t.Obj().Name()) diff --git a/internal/codegen/function_test.go b/internal/codegen/function_test.go index d67c662..ecd076a 100644 --- a/internal/codegen/function_test.go +++ b/internal/codegen/function_test.go @@ -173,6 +173,27 @@ func TestTypeToString(t *testing.T) { typ: types.NewSlice(code.TypeString), want: "[]string", }, + { + name: "map type", + typ: types.NewMap(code.TypeString, code.TypeInt), + want: "map[string]int", + }, + { + name: "map with internal named type", + typ: types.NewMap( + types.NewNamed(types.NewTypeName(token.NoPos, internalPkg, "User", nil), nil, nil), + types.NewNamed(types.NewTypeName(token.NoPos, internalPkg, "Gender", nil), nil, nil), + ), + want: "map[User]Gender", + }, + { + name: "map with external named value type", + typ: types.NewMap( + types.NewNamed(types.NewTypeName(token.NoPos, externalPkg, "User", nil), nil, nil), + types.NewNamed(types.NewTypeName(token.NoPos, externalPkg, "Gender", nil), nil, nil), + ), + want: "map[bar.User]bar.Gender", + }, { name: "named type internal", typ: types.NewNamed(types.NewTypeName(token.NoPos, internalPkg, "User", nil), nil, nil), @@ -235,6 +256,11 @@ func TestTypeToString_PkgNil(t *testing.T) { typ: types.NewSlice(code.TypeString), want: "[]string", }, + { + name: "map type", + typ: types.NewMap(code.TypeString, code.TypeInt), + want: "map[string]int", + }, { name: "named type external", typ: types.NewNamed(types.NewTypeName(token.NoPos, externalPkg, "User", nil), nil, nil), diff --git a/main.go b/main.go index f4aa870..401455c 100644 --- a/main.go +++ b/main.go @@ -19,7 +19,7 @@ const usageText = `repogen generates MongoDB repository implementation from repo Supported options:` // version indicates the version of repogen. -const version = "v0.5-next" +const version = "v0.4.1" func main() { flag.Usage = printUsage