From 7e56d99390887fb4f874f238d0dd69df1528e630 Mon Sep 17 00:00:00 2001 From: Ryan Moran Date: Sun, 2 Feb 2025 15:24:38 -0800 Subject: [PATCH] Fixes named imports with package name conflicts --- acceptance/contain_lines.go | 120 ++++++++++++++++++ acceptance/errors_test.go | 9 +- .../fakes/package_conflict_interface.go | 58 +++++++++ acceptance/fixtures/go.mod | 31 +++++ acceptance/fixtures/go.sum | 111 ++++++++++++++++ acceptance/fixtures/interfaces.go | 8 ++ acceptance/generate_test.go | 38 ++++-- acceptance/init_test.go | 2 +- acceptance/truncate_test.go | 3 +- go.mod | 21 +-- go.sum | 69 +++++----- rendering/context.go | 80 ++++++------ rendering/type.go | 31 +++-- rendering/util.go | 8 +- 14 files changed, 474 insertions(+), 115 deletions(-) create mode 100644 acceptance/contain_lines.go create mode 100644 acceptance/fixtures/fakes/package_conflict_interface.go create mode 100644 acceptance/fixtures/go.mod create mode 100644 acceptance/fixtures/go.sum diff --git a/acceptance/contain_lines.go b/acceptance/contain_lines.go new file mode 100644 index 0000000..8f10df0 --- /dev/null +++ b/acceptance/contain_lines.go @@ -0,0 +1,120 @@ +package acceptance_test + +import ( + "fmt" + "reflect" + "regexp" + "strings" + + "github.com/onsi/gomega/format" + "github.com/onsi/gomega/types" +) + +func ContainLines(expected ...interface{}) types.GomegaMatcher { + return &containLinesMatcher{ + expected: expected, + } +} + +type containLinesMatcher struct { + expected []interface{} +} + +func (matcher *containLinesMatcher) Match(actual interface{}) (success bool, err error) { + _, ok := actual.(string) + if !ok { + _, ok := actual.(fmt.Stringer) + if !ok { + return false, fmt.Errorf("ContainLinesMatcher requires a string or fmt.Stringer. Got actual: %s", format.Object(actual, 1)) + } + } + + actualLines := matcher.lines(actual) + + for currentActualLineIndex := 0; currentActualLineIndex < len(actualLines); currentActualLineIndex++ { + currentActualLine := actualLines[currentActualLineIndex] + currentExpectedLine := matcher.expected[currentActualLineIndex] + + match, err := matcher.compare(currentActualLine, currentExpectedLine) + if err != nil { + return false, err + } + + if match { + if currentActualLineIndex+1 == len(matcher.expected) { + return true, nil + } + } else { + if len(actualLines) > 1 { + actualLines = actualLines[1:] + currentActualLineIndex = -1 + } + } + } + + return false, nil +} + +func (matcher *containLinesMatcher) compare(actual string, expected interface{}) (bool, error) { + if m, ok := expected.(types.GomegaMatcher); ok { + match, err := m.Match(actual) + if err != nil { + return false, err + } + + return match, nil + } + + return reflect.DeepEqual(actual, expected), nil +} + +func (matcher *containLinesMatcher) lines(actual interface{}) []string { + raw, ok := actual.(string) + if !ok { + raw = actual.(fmt.Stringer).String() + } + + re := regexp.MustCompile(`^\[[a-z]+\]\s`) + + var lines []string + for _, line := range strings.Split(raw, "\n") { + lines = append(lines, re.ReplaceAllString(line, "")) + } + + return lines +} + +func (matcher *containLinesMatcher) FailureMessage(actual interface{}) (message string) { + actualLines := "\n" + strings.Join(matcher.lines(actual), "\n") + missing := matcher.linesMatching(actual, false) + if len(missing) > 0 { + return fmt.Sprintf("Expected\n%s\nto contain lines\n%s\nbut missing\n%s", format.Object(actualLines, 1), format.Object(matcher.expected, 1), format.Object(missing, 1)) + } + + return fmt.Sprintf("Expected\n%s\nto contain lines\n%s\nall lines appear, but may be misordered", format.Object(actualLines, 1), format.Object(matcher.expected, 1)) +} + +func (matcher *containLinesMatcher) NegatedFailureMessage(actual interface{}) (message string) { + actualLines := "\n" + strings.Join(matcher.lines(actual), "\n") + missing := matcher.linesMatching(actual, true) + + return fmt.Sprintf("Expected\n%s\nnot to contain lines\n%s\nbut includes\n%s", format.Object(actualLines, 1), format.Object(matcher.expected, 1), format.Object(missing, 1)) +} + +func (matcher *containLinesMatcher) linesMatching(actual interface{}, matching bool) []interface{} { + var set []interface{} + for _, expected := range matcher.expected { + var match bool + for _, line := range matcher.lines(actual) { + if ok, _ := matcher.compare(line, expected); ok { + match = true + } + } + + if match == matching { + set = append(set, expected) + } + } + + return set +} diff --git a/acceptance/errors_test.go b/acceptance/errors_test.go index f4433a0..a16eeee 100644 --- a/acceptance/errors_test.go +++ b/acceptance/errors_test.go @@ -51,9 +51,10 @@ var _ = Describe("faux", func() { Context("when the source file cannot be parsed", func() { It("exits non-zero with an error", func() { command := exec.Command(executable, - "--file", "./fixtures/garbage/interface.go", + "--file", "./garbage/interface.go", "--output", outputFile, "--interface", "SimpleInterface") + command.Dir = "./fixtures" session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) @@ -73,9 +74,10 @@ var _ = Describe("faux", func() { Expect(err).NotTo(HaveOccurred()) command := exec.Command(executable, - "--file", "./fixtures/interfaces.go", + "--file", "./interfaces.go", "--output", outputFile, "--interface", "SimpleInterface") + command.Dir = "./fixtures" session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) @@ -90,9 +92,10 @@ var _ = Describe("faux", func() { Expect(err).NotTo(HaveOccurred()) command := exec.Command(executable, - "--file", "./fixtures/interfaces.go", + "--file", "./interfaces.go", "--output", outputFile, "--interface", "SimpleInterface") + command.Dir = "./fixtures" session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) diff --git a/acceptance/fixtures/fakes/package_conflict_interface.go b/acceptance/fixtures/fakes/package_conflict_interface.go new file mode 100644 index 0000000..7962369 --- /dev/null +++ b/acceptance/fixtures/fakes/package_conflict_interface.go @@ -0,0 +1,58 @@ +package fakes + +import ( + "context" + "sync" + + appsv1 "k8s.io/api/apps/v1" + + v1 "k8s.io/api/core/v1" +) + +type PackageConflictInterface struct { + ListDaemonsetsCall struct { + mutex sync.Mutex + CallCount int + Receives struct { + Ctx context.Context + } + Returns struct { + DaemonSetList *appsv1.DaemonSetList + Error error + } + Stub func(context.Context) (*appsv1.DaemonSetList, error) + } + ListNodesCall struct { + mutex sync.Mutex + CallCount int + Receives struct { + Ctx context.Context + } + Returns struct { + NodeList *v1.NodeList + Error error + } + Stub func(context.Context) (*v1.NodeList, error) + } +} + +func (f *PackageConflictInterface) ListDaemonsets(param1 context.Context) (*appsv1.DaemonSetList, error) { + f.ListDaemonsetsCall.mutex.Lock() + defer f.ListDaemonsetsCall.mutex.Unlock() + f.ListDaemonsetsCall.CallCount++ + f.ListDaemonsetsCall.Receives.Ctx = param1 + if f.ListDaemonsetsCall.Stub != nil { + return f.ListDaemonsetsCall.Stub(param1) + } + return f.ListDaemonsetsCall.Returns.DaemonSetList, f.ListDaemonsetsCall.Returns.Error +} +func (f *PackageConflictInterface) ListNodes(param1 context.Context) (*v1.NodeList, error) { + f.ListNodesCall.mutex.Lock() + defer f.ListNodesCall.mutex.Unlock() + f.ListNodesCall.CallCount++ + f.ListNodesCall.Receives.Ctx = param1 + if f.ListNodesCall.Stub != nil { + return f.ListNodesCall.Stub(param1) + } + return f.ListNodesCall.Returns.NodeList, f.ListNodesCall.Returns.Error +} diff --git a/acceptance/fixtures/go.mod b/acceptance/fixtures/go.mod new file mode 100644 index 0000000..fc0fcf3 --- /dev/null +++ b/acceptance/fixtures/go.mod @@ -0,0 +1,31 @@ +module github.com/ryanmoran/faux/acceptance/fixtures + +go 1.23.0 + +require ( + github.com/BurntSushi/toml v1.4.0 + github.com/pelletier/go-toml/v2 v2.2.3 + github.com/pivotal-cf/jhanda v0.0.0-20200619200912-8de8eb943a43 + k8s.io/api v0.32.1 +) + +require ( + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/x448/float16 v0.8.4 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/text v0.19.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + k8s.io/apimachinery v0.32.1 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect +) diff --git a/acceptance/fixtures/go.sum b/acceptance/fixtures/go.sum new file mode 100644 index 0000000..8ba6165 --- /dev/null +++ b/acceptance/fixtures/go.sum @@ -0,0 +1,111 @@ +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/onsi/ginkgo v1.5.0 h1:uZr+v/TFDdYkdA+j02sPO1kA5owrfjBGCJAogfIyThE= +github.com/onsi/ginkgo v1.5.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pivotal-cf/jhanda v0.0.0-20200619200912-8de8eb943a43 h1:SYEUxVbqz3U7pJP/tlaXaD08w0rZVuPvCFRodnw/TLY= +github.com/pivotal-cf/jhanda v0.0.0-20200619200912-8de8eb943a43/go.mod h1:UXciri1Yqno0IdXxEzwMF91nnwYMPoN95goHWxVtWq8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180712202826-d0887baf81f4/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180709060233-1b2967e3c290/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.32.1 h1:f562zw9cy+GvXzXf0CKlVQ7yHJVYzLfL6JAS4kOAaOc= +k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k= +k8s.io/apimachinery v0.32.1 h1:683ENpaCBjma4CYqsmZyhEzrGz6cjn1MY/X2jB2hkZs= +k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= diff --git a/acceptance/fixtures/interfaces.go b/acceptance/fixtures/interfaces.go index e183a78..b9757b0 100644 --- a/acceptance/fixtures/interfaces.go +++ b/acceptance/fixtures/interfaces.go @@ -2,10 +2,13 @@ package fixtures import ( "bytes" + "context" "io" "github.com/BurntSushi/toml" "github.com/pivotal-cf/jhanda" + appsv1 "k8s.io/api/apps/v1" + v1 "k8s.io/api/core/v1" ) type VariadicInterface interface { @@ -44,3 +47,8 @@ type GenericInterface[T, S comparable] interface { type BurntSushiParser struct { Key toml.Key } + +type PackageConflictInterface interface { + ListNodes(ctx context.Context) (*v1.NodeList, error) + ListDaemonsets(ctx context.Context) (*appsv1.DaemonSetList, error) +} diff --git a/acceptance/generate_test.go b/acceptance/generate_test.go index 49f1b0c..6381a7b 100644 --- a/acceptance/generate_test.go +++ b/acceptance/generate_test.go @@ -5,6 +5,7 @@ import ( "os" "os/exec" "path/filepath" + "strings" "github.com/onsi/gomega/gexec" @@ -38,7 +39,10 @@ var _ = Describe("faux", func() { DescribeTable("fake generation", func(fixture string, flags ...string) { flags = append(flags, "--output", outputFile) + command := exec.Command(executable, flags...) + command.Dir = "./fixtures" + session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) Eventually(session, "10s").Should(gexec.Exit(0)) @@ -49,19 +53,25 @@ var _ = Describe("faux", func() { expectedContent, err := ioutil.ReadFile(filepath.Join("fixtures", "fakes", fixture)) Expect(err).NotTo(HaveOccurred()) - Expect(string(outputContent)).To(ContainSubstring(string(expectedContent))) + var lines []interface{} + for _, line := range strings.Split(string(expectedContent), "\n") { + lines = append(lines, line) + } + + Expect(string(outputContent)).To(ContainLines(lines...)) }, - Entry("simple", "simple_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "SimpleInterface"), - Entry("channels", "chan_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "ChanInterface"), - Entry("duplicate arguments", "duplicate_argument_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "DuplicateArgumentInterface"), - Entry("gomod", "module_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "ModuleInterface"), + Entry("simple", "simple_interface.go", "--file", "./interfaces.go", "--interface", "SimpleInterface"), + Entry("channels", "chan_interface.go", "--file", "./interfaces.go", "--interface", "ChanInterface"), + Entry("duplicate arguments", "duplicate_argument_interface.go", "--file", "./interfaces.go", "--interface", "DuplicateArgumentInterface"), + Entry("gomod", "module_interface.go", "--file", "./interfaces.go", "--interface", "ModuleInterface"), Entry("gopath", "jhanda_command.go", "--package", "github.com/pivotal-cf/jhanda", "--interface", "Command"), Entry("stdlib", "io_reader.go", "--package", "io", "--interface", "Reader"), - Entry("variadic", "variadic_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "VariadicInterface"), - Entry("functions", "function_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "FunctionInterface"), - Entry("name", "named_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "NamedInterface", "--name", "SomeNamedInterface"), - Entry("generic", "generic_interface.go", "--file", "./fixtures/interfaces.go", "--interface", "GenericInterface"), + Entry("variadic", "variadic_interface.go", "--file", "./interfaces.go", "--interface", "VariadicInterface"), + Entry("functions", "function_interface.go", "--file", "./interfaces.go", "--interface", "FunctionInterface"), + Entry("name", "named_interface.go", "--file", "./interfaces.go", "--interface", "NamedInterface", "--name", "SomeNamedInterface"), + Entry("generic", "generic_interface.go", "--file", "./interfaces.go", "--interface", "GenericInterface"), + Entry("package conflict", "package_conflict_interface.go", "--file", "./interfaces.go", "--interface", "PackageConflictInterface"), ) Context("when the source file is provided via an environment variable", func() { @@ -69,7 +79,8 @@ var _ = Describe("faux", func() { command := exec.Command(executable, "--output", outputFile, "--interface", "SimpleInterface") - command.Env = append(os.Environ(), "GOFILE=./fixtures/interfaces.go") + command.Env = append(os.Environ(), "GOFILE=./interfaces.go") + command.Dir = "./fixtures" session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) @@ -81,7 +92,12 @@ var _ = Describe("faux", func() { expectedContent, err := ioutil.ReadFile("fixtures/fakes/simple_interface.go") Expect(err).NotTo(HaveOccurred()) - Expect(string(outputContent)).To(ContainSubstring(string(expectedContent))) + var lines []interface{} + for _, line := range strings.Split(string(expectedContent), "\n") { + lines = append(lines, line) + } + + Expect(string(outputContent)).To(ContainLines(lines...)) }) }) }) diff --git a/acceptance/init_test.go b/acceptance/init_test.go index 14331fb..5402327 100644 --- a/acceptance/init_test.go +++ b/acceptance/init_test.go @@ -13,7 +13,7 @@ import ( ) func TestFaux(t *testing.T) { - SetDefaultEventuallyTimeout(10 * time.Second) + SetDefaultEventuallyTimeout(30 * time.Second) RegisterFailHandler(Fail) RunSpecs(t, "acceptance") } diff --git a/acceptance/truncate_test.go b/acceptance/truncate_test.go index c113097..5bd5972 100644 --- a/acceptance/truncate_test.go +++ b/acceptance/truncate_test.go @@ -44,9 +44,10 @@ var _ = Describe("faux", func() { Expect(err).NotTo(HaveOccurred()) command := exec.Command(executable, - "--file", "./fixtures/interfaces.go", + "--file", "./interfaces.go", "--output", outputFile, "--interface", "SimpleInterface") + command.Dir = "./fixtures" session, err := gexec.Start(command, GinkgoWriter, GinkgoWriter) Expect(err).NotTo(HaveOccurred()) diff --git a/go.mod b/go.mod index 589e9f7..86fcba5 100644 --- a/go.mod +++ b/go.mod @@ -1,26 +1,27 @@ module github.com/ryanmoran/faux -go 1.18 +go 1.23.0 require ( - github.com/BurntSushi/toml v1.4.0 github.com/onsi/ginkgo v1.16.5 - github.com/onsi/gomega v1.34.1 - github.com/pelletier/go-toml/v2 v2.2.2 + github.com/onsi/gomega v1.35.1 github.com/pivotal-cf/jhanda v0.0.0-20181025233525-e6aa09a032df - golang.org/x/tools v0.24.0 + golang.org/x/tools v0.26.0 ) require ( github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/google/go-cmp v0.6.0 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/nxadm/tail v1.4.8 // indirect - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect - golang.org/x/mod v0.20.0 // indirect - golang.org/x/net v0.28.0 // indirect + github.com/onsi/ginkgo/v2 v2.21.0 // indirect + github.com/rogpeppe/go-internal v1.12.0 // indirect + golang.org/x/mod v0.21.0 // indirect + golang.org/x/net v0.30.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sys v0.26.0 // indirect + golang.org/x/text v0.19.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 0fc589c..dfa91e7 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,15 @@ -github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= -github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -22,8 +22,16 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -31,43 +39,35 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/pivotal-cf/jhanda v0.0.0-20181025233525-e6aa09a032df h1:0qMnOwc8HWxJYvsA6jE616dmQcuoJOCOAndIGjsMj3o= github.com/pivotal-cf/jhanda v0.0.0-20181025233525-e6aa09a032df/go.mod h1:GNr2RBRX0Gs2FaJRi4KUrfQV32EhnjQ3Fj+nw87cx08= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= -golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -82,17 +82,17 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= -golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -103,15 +103,16 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/rendering/context.go b/rendering/context.go index e023756..89d578e 100644 --- a/rendering/context.go +++ b/rendering/context.go @@ -13,7 +13,7 @@ func NewContext() *Context { } func (c *Context) Build(pfake parsing.Fake) File { - fake := c.BuildFakeType(pfake.Interface) + fake := c.BuildFakeType(pfake) var imports []Import for _, imp := range pfake.Imports { @@ -22,42 +22,42 @@ func (c *Context) Build(pfake parsing.Fake) File { var funcs []Func for _, signature := range pfake.Interface.Signatures { - funcs = append(funcs, c.BuildFunc(fake, signature)) + funcs = append(funcs, c.BuildFunc(fake, signature, pfake.Imports)) } return NewFile("fakes", imports, []NamedType{fake}, funcs) } -func (c *Context) BuildFakeType(iface parsing.Interface) NamedType { +func (c *Context) BuildFakeType(fake parsing.Fake) NamedType { var calls []Field - for _, signature := range iface.Signatures { - calls = append(calls, c.BuildCallStruct(signature)) + for _, signature := range fake.Interface.Signatures { + calls = append(calls, c.BuildCallStruct(signature, fake.Imports)) } var targs []Type - for _, targ := range iface.TypeArgs { - targs = append(targs, NewType(targ, nil)) + for _, targ := range fake.Interface.TypeArgs { + targs = append(targs, NewType(targ, nil, fake.Imports)) } - return NewNamedType(TitleString(iface.Name), NewStruct(calls), targs) + return NewNamedType(TitleString(fake.Interface.Name), NewStruct(calls), targs) } -func (c *Context) BuildCallStruct(signature parsing.Signature) Field { +func (c *Context) BuildCallStruct(signature parsing.Signature, imports []parsing.Import) Field { methodCallName := fmt.Sprintf("%sCall", signature.Name) var fields []Field fields = append(fields, c.BuildMutex()) fields = append(fields, c.BuildCallCount()) if len(signature.Params) > 0 { - fields = append(fields, c.BuildReceives(signature.Params)) + fields = append(fields, c.BuildReceives(signature.Params, imports)) } if len(signature.Results) > 0 { - fields = append(fields, c.BuildReturns(signature.Results)) + fields = append(fields, c.BuildReturns(signature.Results, imports)) } - fields = append(fields, c.BuildStub(signature)) + fields = append(fields, c.BuildStub(signature, imports)) return NewField(methodCallName, NewStruct(fields)) } @@ -70,55 +70,55 @@ func (c *Context) BuildCallCount() Field { return NewField("CallCount", NewBasicType(BasicInt)) } -func (c *Context) BuildReceives(args []parsing.Argument) Field { +func (c *Context) BuildReceives(args []parsing.Argument, imports []parsing.Import) Field { var fields []Field for i, arg := range args { name := arg.Name if name == "" { - name = FieldTypeName(args, i) + name = FieldTypeName(args, i, imports) } name = TitleString(name) - field := NewField(name, NewType(arg.Type, arg.TypeArgs)) + field := NewField(name, NewType(arg.Type, arg.TypeArgs, imports)) fields = append(fields, field) } return NewField("Receives", NewStruct(fields)) } -func (c *Context) BuildReturns(args []parsing.Argument) Field { +func (c *Context) BuildReturns(args []parsing.Argument, imports []parsing.Import) Field { var fields []Field for i, arg := range args { name := arg.Name if name == "" { - name = FieldTypeName(args, i) + name = FieldTypeName(args, i, imports) } name = TitleString(name) - field := NewField(name, NewType(arg.Type, arg.TypeArgs)) + field := NewField(name, NewType(arg.Type, arg.TypeArgs, imports)) fields = append(fields, field) } return NewField("Returns", NewStruct(fields)) } -func (c *Context) BuildStub(signature parsing.Signature) Field { - params := c.BuildParams(signature.Params, false) - results := c.BuildResults(signature.Results) +func (c *Context) BuildStub(signature parsing.Signature, imports []parsing.Import) Field { + params := c.BuildParams(signature.Params, false, imports) + results := c.BuildResults(signature.Results, imports) stub := NewFunc("", Receiver{}, params, results, nil) return NewField("Stub", stub) } -func (c *Context) BuildFunc(fake NamedType, signature parsing.Signature) Func { +func (c *Context) BuildFunc(fake NamedType, signature parsing.Signature, imports []parsing.Import) Func { receiver := NewReceiver("f", NewPointer(fake)) - params := c.BuildParams(signature.Params, true) - results := c.BuildResults(signature.Results) - body := c.BuildBody(receiver, signature) + params := c.BuildParams(signature.Params, true, imports) + results := c.BuildResults(signature.Results, imports) + body := c.BuildBody(receiver, signature, imports) return NewFunc(signature.Name, receiver, params, results, body) } -func (c *Context) BuildParams(args []parsing.Argument, named bool) []Param { +func (c *Context) BuildParams(args []parsing.Argument, named bool, imports []parsing.Import) []Param { var params []Param for i, arg := range args { var name string @@ -126,22 +126,22 @@ func (c *Context) BuildParams(args []parsing.Argument, named bool) []Param { name = ParamName(i) } - params = append(params, NewParam(name, NewType(arg.Type, arg.TypeArgs), arg.Variadic)) + params = append(params, NewParam(name, NewType(arg.Type, arg.TypeArgs, imports), arg.Variadic)) } return params } -func (c *Context) BuildResults(args []parsing.Argument) []Result { +func (c *Context) BuildResults(args []parsing.Argument, imports []parsing.Import) []Result { var results []Result for _, arg := range args { - results = append(results, NewResult(NewType(arg.Type, arg.TypeArgs))) + results = append(results, NewResult(NewType(arg.Type, arg.TypeArgs, imports))) } return results } -func (c *Context) BuildBody(receiver Receiver, signature parsing.Signature) []Statement { +func (c *Context) BuildBody(receiver Receiver, signature parsing.Signature, imports []parsing.Import) []Statement { statements := []Statement{ c.BuildMutexLockStatement(receiver, signature.Name), c.BuildMutexUnlockStatement(receiver, signature.Name), @@ -149,13 +149,13 @@ func (c *Context) BuildBody(receiver Receiver, signature parsing.Signature) []St } for i := range signature.Params { - statements = append(statements, c.BuildAssignStatement(receiver, signature.Name, i, signature.Params)) + statements = append(statements, c.BuildAssignStatement(receiver, signature.Name, i, signature.Params, imports)) } - statements = append(statements, c.BuildStubIfStatement(receiver, signature)) + statements = append(statements, c.BuildStubIfStatement(receiver, signature, imports)) if len(signature.Results) > 0 { - statements = append(statements, c.BuildReturnStatement(receiver, signature)) + statements = append(statements, c.BuildReturnStatement(receiver, signature, imports)) } return statements @@ -186,7 +186,7 @@ func (c *Context) BuildIncrementStatement(receiver Receiver, name string) Increm return NewIncrementStatement(selector) } -func (c *Context) BuildAssignStatement(receiver Receiver, name string, index int, args []parsing.Argument) AssignStatement { +func (c *Context) BuildAssignStatement(receiver Receiver, name string, index int, args []parsing.Argument, imports []parsing.Import) AssignStatement { receiverStruct := receiver.Type.(Pointer).Elem.(NamedType).Type.(Struct) callField := receiverStruct.FieldWithName(fmt.Sprintf("%sCall", name)) receivesField := callField.Type.(Struct).FieldWithName("Receives") @@ -194,24 +194,24 @@ func (c *Context) BuildAssignStatement(receiver Receiver, name string, index int arg := args[index] argName := arg.Name if argName == "" { - argName = FieldTypeName(args, index) + argName = FieldTypeName(args, index, imports) } paramField := receivesField.Type.(Struct).FieldWithName(argName) selector := NewSelector(receiver, callField, receivesField, paramField) paramName := ParamName(index) - param := NewParam(paramName, NewType(arg.Type, arg.TypeArgs), arg.Variadic) + param := NewParam(paramName, NewType(arg.Type, arg.TypeArgs, imports), arg.Variadic) return NewAssignStatement(selector, param) } -func (c *Context) BuildStubIfStatement(receiver Receiver, signature parsing.Signature) IfStatement { +func (c *Context) BuildStubIfStatement(receiver Receiver, signature parsing.Signature, imports []parsing.Import) IfStatement { receiverStruct := receiver.Type.(Pointer).Elem.(NamedType).Type.(Struct) callField := receiverStruct.FieldWithName(fmt.Sprintf("%sCall", signature.Name)) stubField := callField.Type.(Struct).FieldWithName("Stub") selector := NewSelector(receiver, callField, stubField) - params := c.BuildParams(signature.Params, true) + params := c.BuildParams(signature.Params, true, imports) condition := NewEquality(false, selector, NewNil()) var body []Statement @@ -225,7 +225,7 @@ func (c *Context) BuildStubIfStatement(receiver Receiver, signature parsing.Sign return NewIfStatement(condition, body) } -func (c *Context) BuildReturnStatement(receiver Receiver, signature parsing.Signature) ReturnStatement { +func (c *Context) BuildReturnStatement(receiver Receiver, signature parsing.Signature, imports []parsing.Import) ReturnStatement { receiverStruct := receiver.Type.(Pointer).Elem.(NamedType).Type.(Struct) callField := receiverStruct.FieldWithName(fmt.Sprintf("%sCall", signature.Name)) returnsField := callField.Type.(Struct).FieldWithName("Returns") @@ -234,7 +234,7 @@ func (c *Context) BuildReturnStatement(receiver Receiver, signature parsing.Sign for i, arg := range signature.Results { argName := arg.Name if argName == "" { - argName = FieldTypeName(signature.Results, i) + argName = FieldTypeName(signature.Results, i, imports) } resultField := returnsField.Type.(Struct).FieldWithName(argName) diff --git a/rendering/type.go b/rendering/type.go index 5873cd5..26a8338 100644 --- a/rendering/type.go +++ b/rendering/type.go @@ -3,6 +3,8 @@ package rendering import ( "fmt" "go/types" + + "github.com/ryanmoran/faux/parsing" ) type Type interface { @@ -10,10 +12,10 @@ type Type interface { isType() } -func NewType(t types.Type, targs []types.Type) Type { +func NewType(t types.Type, targs []types.Type, imports []parsing.Import) Type { switch s := t.(type) { case *types.Slice: - return NewSlice(NewType(s.Elem(), nil)) + return NewSlice(NewType(s.Elem(), nil, imports)) case *types.Basic: return NewBasicType(s) @@ -24,26 +26,33 @@ func NewType(t types.Type, targs []types.Type) Type { obj := s.Obj() pkg := obj.Pkg() if pkg != nil { - name = fmt.Sprintf("%s.%s", pkg.Name(), obj.Name()) + pname := pkg.Name() + for _, p := range imports { + if p.Path == pkg.Path() && p.Name != "" { + pname = p.Name + } + } + + name = fmt.Sprintf("%s.%s", pname, obj.Name()) } var targTypes []Type for _, targ := range targs { - targTypes = append(targTypes, NewType(targ, nil)) + targTypes = append(targTypes, NewType(targ, nil, imports)) } return NewDefinedType(name, targTypes) case *types.TypeParam: - return NewNamedType(s.String(), NewType(s.Constraint(), nil), nil) + return NewNamedType(s.String(), NewType(s.Constraint(), nil, imports), nil) case *types.Interface: return Interface{} case *types.Pointer: - return NewPointer(NewType(s.Elem(), nil)) + return NewPointer(NewType(s.Elem(), nil, imports)) case *types.Map: - return NewMap(NewType(s.Key(), nil), NewType(s.Elem(), nil)) + return NewMap(NewType(s.Key(), nil, imports), NewType(s.Elem(), nil, imports)) case *types.Chan: var send, recv bool @@ -57,13 +66,13 @@ func NewType(t types.Type, targs []types.Type) Type { recv = true } - return NewChan(NewType(s.Elem(), nil), send, recv) + return NewChan(NewType(s.Elem(), nil, imports), send, recv) case *types.Struct: var fields []Field for i := 0; i < s.NumFields(); i++ { field := s.Field(i) - fields = append(fields, NewField(field.Name(), NewType(field.Type(), nil))) + fields = append(fields, NewField(field.Name(), NewType(field.Type(), nil, imports))) } return NewStruct(fields) @@ -72,13 +81,13 @@ func NewType(t types.Type, targs []types.Type) Type { var params []Param for i := 0; i < s.Params().Len(); i++ { param := s.Params().At(i) - params = append(params, NewParam("", NewType(param.Type(), nil), false)) + params = append(params, NewParam("", NewType(param.Type(), nil, imports), false)) } var results []Result for i := 0; i < s.Results().Len(); i++ { result := s.Results().At(i) - results = append(results, NewResult(NewType(result.Type(), nil))) + results = append(results, NewResult(NewType(result.Type(), nil, imports))) } return NewFunc(s.String(), Receiver{}, params, results, nil) diff --git a/rendering/util.go b/rendering/util.go index 48a9b93..515e2d1 100644 --- a/rendering/util.go +++ b/rendering/util.go @@ -59,17 +59,17 @@ func TypeName(t Type) string { } } -func FieldTypeName(args []parsing.Argument, index int) string { +func FieldTypeName(args []parsing.Argument, index int, imports []parsing.Import) string { nameCounts := map[string]int{} counter := map[string]int{} for _, arg := range args { - name := TypeName(NewType(arg.Type, arg.TypeArgs)) + name := TypeName(NewType(arg.Type, arg.TypeArgs, imports)) nameCounts[name]++ } var indexedCounts []int for _, arg := range args { - name := TypeName(NewType(arg.Type, arg.TypeArgs)) + name := TypeName(NewType(arg.Type, arg.TypeArgs, imports)) if nameCounts[name] > 1 { counter[name]++ indexedCounts = append(indexedCounts, counter[name]) @@ -78,7 +78,7 @@ func FieldTypeName(args []parsing.Argument, index int) string { } } - typeName := TypeName(NewType(args[index].Type, args[index].TypeArgs)) + typeName := TypeName(NewType(args[index].Type, args[index].TypeArgs, imports)) if indexedCounts[index] > 0 { typeName = fmt.Sprintf("%s_%d", typeName, indexedCounts[index]) }