From 42d905a3933b785fb1edc4ab065afb1aecd54339 Mon Sep 17 00:00:00 2001 From: Rangel Reale Date: Tue, 20 Aug 2024 12:57:59 -0300 Subject: [PATCH] support types.Alias --- pkg/generator.go | 11 +------ pkg/generator_alias.go | 12 +++++++ pkg/generator_alias_go123.go | 23 +++++++++++++ pkg/generator_go123_test.go | 63 ++++++++++++++++++++++++++++++++++++ 4 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 pkg/generator_alias.go create mode 100644 pkg/generator_alias_go123.go create mode 100644 pkg/generator_go123_test.go diff --git a/pkg/generator.go b/pkg/generator.go index ca5afec0..a393b331 100644 --- a/pkg/generator.go +++ b/pkg/generator.go @@ -509,16 +509,7 @@ func (g *Generator) renderType(ctx context.Context, typ types.Type) string { } return fmt.Sprintf("%s[%s]", name, strings.Join(args, ",")) case *types.Alias: - name := g.getPackageScopedType(ctx, t.Obj()) - if t.TypeArgs() == nil || t.TypeArgs().Len() == 0 { - return name - } - args := make([]string, 0, t.TypeArgs().Len()) - for i := 0; i < t.TypeArgs().Len(); i++ { - arg := t.TypeArgs().At(i) - args = append(args, g.renderType(ctx, arg)) - } - return fmt.Sprintf("%s[%s]", name, strings.Join(args, ",")) + return g.renderTypeAlias(ctx, t) case *types.TypeParam: if t.Constraint() != nil { name := t.Obj().Name() diff --git a/pkg/generator_alias.go b/pkg/generator_alias.go new file mode 100644 index 00000000..aef17f27 --- /dev/null +++ b/pkg/generator_alias.go @@ -0,0 +1,12 @@ +//go:build !go1.23 + +package pkg + +import ( + "context" + "go/types" +) + +func (g *Generator) renderTypeAlias(ctx context.Context, t *types.Alias) string { + return g.getPackageScopedType(ctx, t.Obj()) +} diff --git a/pkg/generator_alias_go123.go b/pkg/generator_alias_go123.go new file mode 100644 index 00000000..a83b7e20 --- /dev/null +++ b/pkg/generator_alias_go123.go @@ -0,0 +1,23 @@ +//go:build go1.23 + +package pkg + +import ( + "context" + "fmt" + "go/types" + "strings" +) + +func (g *Generator) renderTypeAlias(ctx context.Context, t *types.Alias) string { + name := g.getPackageScopedType(ctx, t.Obj()) + if t.TypeArgs() == nil || t.TypeArgs().Len() == 0 { + return name + } + args := make([]string, 0, t.TypeArgs().Len()) + for i := 0; i < t.TypeArgs().Len(); i++ { + arg := t.TypeArgs().At(i) + args = append(args, g.renderType(ctx, arg)) + } + return fmt.Sprintf("%s[%s]", name, strings.Join(args, ",")) +} diff --git a/pkg/generator_go123_test.go b/pkg/generator_go123_test.go new file mode 100644 index 00000000..fa0dab19 --- /dev/null +++ b/pkg/generator_go123_test.go @@ -0,0 +1,63 @@ +//go:build go1.23 + +package pkg + +import "regexp" + +func (s *GeneratorSuite) TestReplaceTypePackagePrologueGo123() { + expected := `package mocks + +import baz "github.com/vektra/mockery/v2/pkg/fixtures/example_project/baz" +import mock "github.com/stretchr/testify/mock" + +` + generator := NewGenerator( + s.ctx, + GeneratorConfig{InPackage: false}, + s.getInterfaceFromFile("example_project/baz/foo.go", "Foo"), + pkg, + ) + + s.checkPrologueGeneration(generator, expected) +} + +func (s *GeneratorSuite) TestReplaceTypePackageGo123() { + cfg := GeneratorConfig{InPackage: false} + + s.checkGenerationRegexWithConfig("example_project/baz/foo.go", "Foo", cfg, []regexpExpected{ + // func (_m *Foo) GetBaz() (*baz.Baz, error) + {true, regexp.MustCompile(`func \([^\)]+\) GetBaz\(\) \(\*baz\.Baz`)}, + // func (_m *Foo) GetBaz() (*foo.InternalBaz, error) + {false, regexp.MustCompile(`func \([^\)]+\) GetBaz\(\) \(\*foo\.InternalBaz`)}, + }) +} + +func (s *GeneratorSuite) TestReplaceTypePackageMultiplePrologueGo123() { + expected := `package mocks + +import mock "github.com/stretchr/testify/mock" +import replace_type "github.com/vektra/mockery/v2/pkg/fixtures/example_project/replace_type" +import rt1 "github.com/vektra/mockery/v2/pkg/fixtures/example_project/replace_type/rti/rt1" +import rt2 "github.com/vektra/mockery/v2/pkg/fixtures/example_project/replace_type/rti/rt2" + +` + generator := NewGenerator( + s.ctx, + GeneratorConfig{InPackage: false}, + s.getInterfaceFromFile("example_project/replace_type/rt.go", "RType"), + pkg, + ) + + s.checkPrologueGeneration(generator, expected) +} + +func (s *GeneratorSuite) TestReplaceTypePackageMultipleGo123() { + cfg := GeneratorConfig{InPackage: false} + + s.checkGenerationRegexWithConfig("example_project/replace_type/rt.go", "RType", cfg, []regexpExpected{ + // func (_m *RType) Replace1(f rt1.RType1) + {true, regexp.MustCompile(`func \([^\)]+\) Replace1\(f rt1\.RType1`)}, + // func (_m *RType) Replace2(f rt2.RType2) + {true, regexp.MustCompile(`func \([^\)]+\) Replace2\(f rt2\.RType2`)}, + }) +}