From 1f109acb780b5a64032f545e9da671c9b5fe84fd Mon Sep 17 00:00:00 2001 From: Sakari Tanskanen Date: Thu, 5 May 2022 18:27:21 +0300 Subject: [PATCH 1/2] Allow overlapping methods Since golang allows overlapping methods in embedded interfaces, do not fail if overlapping methods are found when merging embedded interfaces. --- generator/generator.go | 9 +-------- generator/generator_test.go | 15 --------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/generator/generator.go b/generator/generator.go index 9d8b83d3..a72b0e1b 100644 --- a/generator/generator.go +++ b/generator/generator.go @@ -404,10 +404,7 @@ func processSelector(fs *token.FileSet, currentPackage *packages.Package, se *as return methods, err } -var errDuplicateMethod = errors.New("embedded interface has same method") - -//mergeMethods merges two methods list, if there is a duplicate method name -//errDuplicateMethod is returned +//mergeMethods merges two methods list func mergeMethods(ml1, ml2 methodsList) (methodsList, error) { if ml1 == nil || ml2 == nil { return ml1, nil @@ -419,10 +416,6 @@ func mergeMethods(ml1, ml2 methodsList) (methodsList, error) { } for name, signature := range ml2 { - if _, ok := ml1[name]; ok { - return nil, errors.Wrap(errDuplicateMethod, name) - } - result[name] = signature } diff --git a/generator/generator_test.go b/generator/generator_test.go index d43bf386..ed544f62 100644 --- a/generator/generator_test.go +++ b/generator/generator_test.go @@ -196,21 +196,6 @@ func Test_mergeMethods(t *testing.T) { name: "nil method", wantErr: false, }, - { - name: "duplicate method", - args: args{ - ml1: methodsList{ - "method": Method{}, - }, - ml2: methodsList{ - "method": Method{}, - }, - }, - wantErr: true, - inspectErr: func(err error, t *testing.T) { - assert.Equal(t, errDuplicateMethod, errors.Cause(err)) - }, - }, { name: "success", args: args{ From b5b167cf545e3880161cd2498b9dfd2c44e0273f Mon Sep 17 00:00:00 2001 From: Sakari Tanskanen Date: Thu, 5 May 2022 22:09:20 +0300 Subject: [PATCH 2/2] Always return the outermost overlapping method --- generator/generator.go | 17 +++++++++-------- generator/generator_test.go | 21 +++++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/generator/generator.go b/generator/generator.go index a72b0e1b..b60958fa 100644 --- a/generator/generator.go +++ b/generator/generator.go @@ -404,18 +404,19 @@ func processSelector(fs *token.FileSet, currentPackage *packages.Package, se *as return methods, err } -//mergeMethods merges two methods list -func mergeMethods(ml1, ml2 methodsList) (methodsList, error) { - if ml1 == nil || ml2 == nil { - return ml1, nil +//mergeMethods merges two methods list. Retains overlapping methods from the +//parent list +func mergeMethods(methods, embeddedMethods methodsList) (methodsList, error) { + if methods == nil || embeddedMethods == nil { + return methods, nil } - result := make(methodsList, len(ml1)+len(ml2)) - for k, v := range ml1 { - result[k] = v + result := make(methodsList, len(methods)+len(embeddedMethods)) + for name, signature := range embeddedMethods { + result[name] = signature } - for name, signature := range ml2 { + for name, signature := range methods { result[name] = signature } diff --git a/generator/generator_test.go b/generator/generator_test.go index ed544f62..d3d02686 100644 --- a/generator/generator_test.go +++ b/generator/generator_test.go @@ -196,6 +196,27 @@ func Test_mergeMethods(t *testing.T) { name: "nil method", wantErr: false, }, + { + name: "duplicate methods should return outer method", + args: args{ + ml1: methodsList{ + "method": Method{ + Doc: []string{"outer"}, + }, + }, + ml2: methodsList{ + "method": Method{ + Doc: []string{"inner"}, + }, + }, + }, + wantErr: false, + want1: methodsList{ + "method": { + Doc: []string{"outer"}, + }, + }, + }, { name: "success", args: args{