Skip to content
This repository was archived by the owner on Jun 27, 2023. It is now read-only.

Commit 5b2ea10

Browse files
authored
support embedded error interface in source mode (#445)
Fixes: #446
1 parent 44e6f1e commit 5b2ea10

File tree

6 files changed

+61
-5
lines changed

6 files changed

+61
-5
lines changed

mockgen/internal/tests/aux_imports_embedded_interface/bugreport_mock.go

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mockgen/internal/tests/aux_imports_embedded_interface/faux/faux.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package faux
33
type Foreign interface {
44
Method() Return
55
Embedded
6+
error
67
}
78

89
type Embedded interface{}

mockgen/internal/tests/import_embedded_interface/bugreport.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
type Source interface {
2828
ersatz.Embedded
2929
faux.Foreign
30+
error
3031
}
3132

3233
func CallForeignMethod(s Source) {

mockgen/internal/tests/import_embedded_interface/bugreport_mock.go

Lines changed: 14 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mockgen/model/model.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,3 +468,19 @@ func impPath(imp string) string {
468468
}
469469
return imp
470470
}
471+
472+
// ErrorInterface represent built-in error interface.
473+
var ErrorInterface = Interface{
474+
Name: "error",
475+
Methods: []*Method{
476+
{
477+
Name: "Error",
478+
Out: []*Parameter{
479+
{
480+
Name: "",
481+
Type: PredeclaredType("string"),
482+
},
483+
},
484+
},
485+
},
486+
}

mockgen/parse.go

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -272,14 +272,24 @@ func (p *fileParser) parseInterface(name, pkg string, it *ast.InterfaceType) (*m
272272
// Embedded interface in this package.
273273
ei := p.auxInterfaces[pkg][v.String()]
274274
if ei == nil {
275-
if ei = p.importedInterfaces[pkg][v.String()]; ei == nil {
275+
ei = p.importedInterfaces[pkg][v.String()]
276+
}
277+
278+
var eintf *model.Interface
279+
if ei != nil {
280+
var err error
281+
eintf, err = p.parseInterface(v.String(), pkg, ei)
282+
if err != nil {
283+
return nil, err
284+
}
285+
} else {
286+
// This is built-in error interface.
287+
if v.String() == model.ErrorInterface.Name {
288+
eintf = &model.ErrorInterface
289+
} else {
276290
return nil, p.errorf(v.Pos(), "unknown embedded interface %s", v.String())
277291
}
278292
}
279-
eintf, err := p.parseInterface(v.String(), pkg, ei)
280-
if err != nil {
281-
return nil, err
282-
}
283293
// Copy the methods.
284294
// TODO: apply shadowing rules.
285295
intf.Methods = append(intf.Methods, eintf.Methods...)

0 commit comments

Comments
 (0)