diff --git a/fixtures/genericparam/genericparam.go b/fixtures/genericparam/genericparam.go new file mode 100644 index 0000000..c75c413 --- /dev/null +++ b/fixtures/genericparam/genericparam.go @@ -0,0 +1,16 @@ +package genericparam + +import ( + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam/genericparamtype" + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam/genericreturntype" +) + +//counterfeiter:generate . GenericParamFunc +type GenericParamFunc func(Generic[genericparamtype.T]) Generic[genericreturntype.R] + +//counterfeiter:generate . GenericParamInterface +type GenericParamInterface interface { + DoSomething(Generic[genericparamtype.T]) Generic[genericreturntype.R] +} + +type Generic[T any] struct{ _ T } diff --git a/fixtures/genericparam/genericparamfakes/fake_generic_param_func.go b/fixtures/genericparam/genericparamfakes/fake_generic_param_func.go new file mode 100644 index 0000000..962b43a --- /dev/null +++ b/fixtures/genericparam/genericparamfakes/fake_generic_param_func.go @@ -0,0 +1,112 @@ +// Code generated by counterfeiter. DO NOT EDIT. +package genericparamfakes + +import ( + "sync" + + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam" + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam/genericparamtype" + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam/genericreturntype" +) + +type FakeGenericParamFunc struct { + Stub func(genericparam.Generic[genericparamtype.T]) genericparam.Generic[genericreturntype.R] + mutex sync.RWMutex + argsForCall []struct { + arg1 genericparam.Generic[genericparamtype.T] + } + returns struct { + result1 genericparam.Generic[genericreturntype.R] + } + returnsOnCall map[int]struct { + result1 genericparam.Generic[genericreturntype.R] + } + invocations map[string][][]interface{} + invocationsMutex sync.RWMutex +} + +func (fake *FakeGenericParamFunc) Spy(arg1 genericparam.Generic[genericparamtype.T]) genericparam.Generic[genericreturntype.R] { + fake.mutex.Lock() + ret, specificReturn := fake.returnsOnCall[len(fake.argsForCall)] + fake.argsForCall = append(fake.argsForCall, struct { + arg1 genericparam.Generic[genericparamtype.T] + }{arg1}) + stub := fake.Stub + returns := fake.returns + fake.recordInvocation("GenericParamFunc", []interface{}{arg1}) + fake.mutex.Unlock() + if stub != nil { + return stub(arg1) + } + if specificReturn { + return ret.result1 + } + return returns.result1 +} + +func (fake *FakeGenericParamFunc) CallCount() int { + fake.mutex.RLock() + defer fake.mutex.RUnlock() + return len(fake.argsForCall) +} + +func (fake *FakeGenericParamFunc) Calls(stub func(genericparam.Generic[genericparamtype.T]) genericparam.Generic[genericreturntype.R]) { + fake.mutex.Lock() + defer fake.mutex.Unlock() + fake.Stub = stub +} + +func (fake *FakeGenericParamFunc) ArgsForCall(i int) genericparam.Generic[genericparamtype.T] { + fake.mutex.RLock() + defer fake.mutex.RUnlock() + return fake.argsForCall[i].arg1 +} + +func (fake *FakeGenericParamFunc) Returns(result1 genericparam.Generic[genericreturntype.R]) { + fake.mutex.Lock() + defer fake.mutex.Unlock() + fake.Stub = nil + fake.returns = struct { + result1 genericparam.Generic[genericreturntype.R] + }{result1} +} + +func (fake *FakeGenericParamFunc) ReturnsOnCall(i int, result1 genericparam.Generic[genericreturntype.R]) { + fake.mutex.Lock() + defer fake.mutex.Unlock() + fake.Stub = nil + if fake.returnsOnCall == nil { + fake.returnsOnCall = make(map[int]struct { + result1 genericparam.Generic[genericreturntype.R] + }) + } + fake.returnsOnCall[i] = struct { + result1 genericparam.Generic[genericreturntype.R] + }{result1} +} + +func (fake *FakeGenericParamFunc) Invocations() map[string][][]interface{} { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + fake.mutex.RLock() + defer fake.mutex.RUnlock() + copiedInvocations := map[string][][]interface{}{} + for key, value := range fake.invocations { + copiedInvocations[key] = value + } + return copiedInvocations +} + +func (fake *FakeGenericParamFunc) recordInvocation(key string, args []interface{}) { + fake.invocationsMutex.Lock() + defer fake.invocationsMutex.Unlock() + if fake.invocations == nil { + fake.invocations = map[string][][]interface{}{} + } + if fake.invocations[key] == nil { + fake.invocations[key] = [][]interface{}{} + } + fake.invocations[key] = append(fake.invocations[key], args) +} + +var _ genericparam.GenericParamFunc = new(FakeGenericParamFunc).Spy diff --git a/fixtures/genericparam/genericparamfakes/fake_generic_param_interface.go b/fixtures/genericparam/genericparamfakes/fake_generic_param_interface.go new file mode 100644 index 0000000..ba9d8d2 --- /dev/null +++ b/fixtures/genericparam/genericparamfakes/fake_generic_param_interface.go @@ -0,0 +1,113 @@ +// Code generated by counterfeiter. DO NOT EDIT. +package genericparamfakes + +import ( + "sync" + + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam" + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam/genericparamtype" + "github.com/maxbrunsfeld/counterfeiter/v6/fixtures/genericparam/genericreturntype" +) + +type FakeGenericParamInterface struct { + DoSomethingStub func(genericparam.Generic[genericparamtype.T]) genericparam.Generic[genericreturntype.R] + doSomethingMutex sync.RWMutex + doSomethingArgsForCall []struct { + arg1 genericparam.Generic[genericparamtype.T] + } + doSomethingReturns struct { + result1 genericparam.Generic[genericreturntype.R] + } + doSomethingReturnsOnCall map[int]struct { + result1 genericparam.Generic[genericreturntype.R] + } + invocations map[string][][]interface{} + invocationsMutex sync.RWMutex +} + +func (fake *FakeGenericParamInterface) DoSomething(arg1 genericparam.Generic[genericparamtype.T]) genericparam.Generic[genericreturntype.R] { + fake.doSomethingMutex.Lock() + ret, specificReturn := fake.doSomethingReturnsOnCall[len(fake.doSomethingArgsForCall)] + fake.doSomethingArgsForCall = append(fake.doSomethingArgsForCall, struct { + arg1 genericparam.Generic[genericparamtype.T] + }{arg1}) + stub := fake.DoSomethingStub + fakeReturns := fake.doSomethingReturns + fake.recordInvocation("DoSomething", []interface{}{arg1}) + fake.doSomethingMutex.Unlock() + if stub != nil { + return stub(arg1) + } + if specificReturn { + return ret.result1 + } + return fakeReturns.result1 +} + +func (fake *FakeGenericParamInterface) DoSomethingCallCount() int { + fake.doSomethingMutex.RLock() + defer fake.doSomethingMutex.RUnlock() + return len(fake.doSomethingArgsForCall) +} + +func (fake *FakeGenericParamInterface) DoSomethingCalls(stub func(genericparam.Generic[genericparamtype.T]) genericparam.Generic[genericreturntype.R]) { + fake.doSomethingMutex.Lock() + defer fake.doSomethingMutex.Unlock() + fake.DoSomethingStub = stub +} + +func (fake *FakeGenericParamInterface) DoSomethingArgsForCall(i int) genericparam.Generic[genericparamtype.T] { + fake.doSomethingMutex.RLock() + defer fake.doSomethingMutex.RUnlock() + argsForCall := fake.doSomethingArgsForCall[i] + return argsForCall.arg1 +} + +func (fake *FakeGenericParamInterface) DoSomethingReturns(result1 genericparam.Generic[genericreturntype.R]) { + fake.doSomethingMutex.Lock() + defer fake.doSomethingMutex.Unlock() + fake.DoSomethingStub = nil + fake.doSomethingReturns = struct { + result1 genericparam.Generic[genericreturntype.R] + }{result1} +} + +func (fake *FakeGenericParamInterface) DoSomethingReturnsOnCall(i int, result1 genericparam.Generic[genericreturntype.R]) { + fake.doSomethingMutex.Lock() + defer fake.doSomethingMutex.Unlock() + fake.DoSomethingStub = nil + if fake.doSomethingReturnsOnCall == nil { + fake.doSomethingReturnsOnCall = make(map[int]struct { + result1 genericparam.Generic[genericreturntype.R] + }) + } + fake.doSomethingReturnsOnCall[i] = struct { + result1 genericparam.Generic[genericreturntype.R] + }{result1} +} + +func (fake *FakeGenericParamInterface) Invocations() map[string][][]interface{} { + fake.invocationsMutex.RLock() + defer fake.invocationsMutex.RUnlock() + fake.doSomethingMutex.RLock() + defer fake.doSomethingMutex.RUnlock() + copiedInvocations := map[string][][]interface{}{} + for key, value := range fake.invocations { + copiedInvocations[key] = value + } + return copiedInvocations +} + +func (fake *FakeGenericParamInterface) recordInvocation(key string, args []interface{}) { + fake.invocationsMutex.Lock() + defer fake.invocationsMutex.Unlock() + if fake.invocations == nil { + fake.invocations = map[string][][]interface{}{} + } + if fake.invocations[key] == nil { + fake.invocations[key] = [][]interface{}{} + } + fake.invocations[key] = append(fake.invocations[key], args) +} + +var _ genericparam.GenericParamInterface = new(FakeGenericParamInterface) diff --git a/fixtures/genericparam/genericparamtype/genericparamtype.go b/fixtures/genericparam/genericparamtype/genericparamtype.go new file mode 100644 index 0000000..2f3c310 --- /dev/null +++ b/fixtures/genericparam/genericparamtype/genericparamtype.go @@ -0,0 +1,3 @@ +package genericparamtype + +type T string diff --git a/fixtures/genericparam/genericreturntype/genericreturntype.go b/fixtures/genericparam/genericreturntype/genericreturntype.go new file mode 100644 index 0000000..17c2ee0 --- /dev/null +++ b/fixtures/genericparam/genericreturntype/genericreturntype.go @@ -0,0 +1,3 @@ +package genericreturntype + +type R struct{} diff --git a/generator/loader.go b/generator/loader.go index 188cda9..4a8695b 100644 --- a/generator/loader.go +++ b/generator/loader.go @@ -132,6 +132,10 @@ func (f *Fake) addImportsFor(typ types.Type) { f.addImportsFor(t.Elem()) case *types.Named: if t.Obj() != nil && t.Obj().Pkg() != nil { + typeArgs := t.TypeArgs() + for i := 0; i < typeArgs.Len(); i++ { + f.addImportsFor(typeArgs.At(i)) + } f.Imports.Add(t.Obj().Pkg().Name(), t.Obj().Pkg().Path()) } case *types.Slice: