From 204e3d5bb0278b1f4d59e0250ae71e4935eb88eb Mon Sep 17 00:00:00 2001 From: huangzhe Date: Mon, 2 Jan 2023 16:52:11 +0800 Subject: [PATCH] fix: missing import path when receiver and methods are defined in different file --- gotests_test.go | 6 ++++ internal/goparser/goparser.go | 8 +++-- .../receiver_and_methods_in_different_file.go | 34 +++++++++++++++++++ testdata/separate_definition/field/field.go | 4 +++ testdata/separate_definition/method.go | 5 +++ testdata/separate_definition/receiver.go | 8 +++++ 6 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 testdata/goldens/receiver_and_methods_in_different_file.go create mode 100644 testdata/separate_definition/field/field.go create mode 100644 testdata/separate_definition/method.go create mode 100644 testdata/separate_definition/receiver.go diff --git a/gotests_test.go b/gotests_test.go index 7b2f3d8..3049bea 100644 --- a/gotests_test.go +++ b/gotests_test.go @@ -869,6 +869,12 @@ func TestGenerateTests(t *testing.T) { template: "testify", }, want: mustReadAndFormatGoFile(t, "testdata/named/named_on_subtests_on_parallel_on_template_testify.go"), + }, { + name: "receiver and methods are defined in different file", + args: args{ + srcPath: "testdata/separate_definition/method.go", + }, + want: mustReadAndFormatGoFile(t, "testdata/goldens/receiver_and_methods_in_different_file.go"), }, } tmp, err := ioutil.TempDir("", "gotests_test") diff --git a/internal/goparser/goparser.go b/internal/goparser/goparser.go index 6327f77..bcdd2cb 100644 --- a/internal/goparser/goparser.go +++ b/internal/goparser/goparser.go @@ -48,7 +48,7 @@ func (p *Parser) Parse(srcPath string, files []models.Path) (*Result, error) { if err != nil { return nil, err } - return &Result{ + result := &Result{ Header: &models.Header{ Comments: parsePkgComment(f, f.Package), Package: f.Name.String(), @@ -56,7 +56,11 @@ func (p *Parser) Parse(srcPath string, files []models.Path) (*Result, error) { Code: goCode(b, f), }, Funcs: p.parseFunctions(fset, f, fs), - }, nil + } + for _, v := range fs { + result.Header.Imports = append(result.Header.Imports, parseImports(v.Imports)...) + } + return result, nil } func (p *Parser) readFile(srcPath string) ([]byte, error) { diff --git a/testdata/goldens/receiver_and_methods_in_different_file.go b/testdata/goldens/receiver_and_methods_in_different_file.go new file mode 100644 index 0000000..305cf45 --- /dev/null +++ b/testdata/goldens/receiver_and_methods_in_different_file.go @@ -0,0 +1,34 @@ +package separate_definition + +import ( + "testing" + + "github.com/cweill/gotests/testdata/separate_definition/field" +) + +func TestFoo_Foo(t *testing.T) { + type fields struct { + Bar string + TestFiled field.Test + } + type args struct { + s string + } + tests := []struct { + name string + fields fields + args args + wantErr bool + }{ + // TODO: Add test cases. + } + for _, tt := range tests { + f := &Foo{ + Bar: tt.fields.Bar, + TestFiled: tt.fields.TestFiled, + } + if err := f.Foo(tt.args.s); (err != nil) != tt.wantErr { + t.Errorf("%q. Foo.Foo() error = %v, wantErr %v", tt.name, err, tt.wantErr) + } + } +} diff --git a/testdata/separate_definition/field/field.go b/testdata/separate_definition/field/field.go new file mode 100644 index 0000000..5ee8ad4 --- /dev/null +++ b/testdata/separate_definition/field/field.go @@ -0,0 +1,4 @@ +package field + +type Test struct { +} diff --git a/testdata/separate_definition/method.go b/testdata/separate_definition/method.go new file mode 100644 index 0000000..f12847f --- /dev/null +++ b/testdata/separate_definition/method.go @@ -0,0 +1,5 @@ +package separate_definition + +func (*Foo) Foo(s string) error { + return nil +} diff --git a/testdata/separate_definition/receiver.go b/testdata/separate_definition/receiver.go new file mode 100644 index 0000000..f14ddfa --- /dev/null +++ b/testdata/separate_definition/receiver.go @@ -0,0 +1,8 @@ +package separate_definition + +import "github.com/cweill/gotests/testdata/separate_definition/field" + +type Foo struct { + Bar string + TestFiled field.Test +}