extract: process interface wrapper method with variadic parameter
Fixes #1055
This commit is contained in:
@@ -202,8 +202,16 @@ func (e *Extractor) genContent(importPath string, p *types.Package) ([]byte, err
|
|||||||
if args[j] = v.Name(); args[j] == "" {
|
if args[j] = v.Name(); args[j] == "" {
|
||||||
args[j] = fmt.Sprintf("a%d", j)
|
args[j] = fmt.Sprintf("a%d", j)
|
||||||
}
|
}
|
||||||
|
// process interface method variadic parameter
|
||||||
|
if sign.Variadic() && j == len(args)-1 { // check is last arg
|
||||||
|
// only replace the first "[]" to "..."
|
||||||
|
at := types.TypeString(v.Type(), qualify)[2:]
|
||||||
|
params[j] = args[j] + " ..." + at
|
||||||
|
args[j] += "..."
|
||||||
|
} else {
|
||||||
params[j] = args[j] + " " + types.TypeString(v.Type(), qualify)
|
params[j] = args[j] + " " + types.TypeString(v.Type(), qualify)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
arg := "(" + strings.Join(args, ", ") + ")"
|
arg := "(" + strings.Join(args, ", ") + ")"
|
||||||
param := "(" + strings.Join(params, ", ") + ")"
|
param := "(" + strings.Join(params, ", ") + ")"
|
||||||
|
|
||||||
|
|||||||
@@ -85,6 +85,41 @@ func TestPackages(t *testing.T) {
|
|||||||
importPath: "guthib.com/baz",
|
importPath: "guthib.com/baz",
|
||||||
expected: expectedOutput,
|
expected: expectedOutput,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
desc: "using relative path, interface method parameter is variadic",
|
||||||
|
wd: "./testdata/7/src/guthib.com/variadic",
|
||||||
|
arg: "../variadic",
|
||||||
|
importPath: "guthib.com/variadic",
|
||||||
|
expected: `
|
||||||
|
// Code generated by 'yaegi extract guthib.com/variadic'. DO NOT EDIT.
|
||||||
|
|
||||||
|
package variadic
|
||||||
|
|
||||||
|
import (
|
||||||
|
"guthib.com/variadic"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
Symbols["guthib.com/variadic"] = map[string]reflect.Value{
|
||||||
|
// type definitions
|
||||||
|
"Variadic": reflect.ValueOf((*variadic.Variadic)(nil)),
|
||||||
|
|
||||||
|
// interface wrapper definitions
|
||||||
|
"_Variadic": reflect.ValueOf((*_guthib_com_variadic_Variadic)(nil)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// _guthib_com_variadic_Variadic is an interface wrapper for Variadic type
|
||||||
|
type _guthib_com_variadic_Variadic struct {
|
||||||
|
WCall func(method string, args ...[]interface{}) (interface{}, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (W _guthib_com_variadic_Variadic) Call(method string, args ...[]interface{}) (interface{}, error) {
|
||||||
|
return W.WCall(method, args...)
|
||||||
|
}
|
||||||
|
`[1:],
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
|
|||||||
1
extract/testdata/7/src/guthib.com/variadic/go.mod
vendored
Normal file
1
extract/testdata/7/src/guthib.com/variadic/go.mod
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module guthib.com/baz-baz/variadic
|
||||||
5
extract/testdata/7/src/guthib.com/variadic/variadic.go
vendored
Normal file
5
extract/testdata/7/src/guthib.com/variadic/variadic.go
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
package variadic
|
||||||
|
|
||||||
|
type Variadic interface {
|
||||||
|
Call(method string, args ...[]interface{}) (interface{}, error)
|
||||||
|
}
|
||||||
@@ -47,38 +47,38 @@ func init() {
|
|||||||
// _testing_TB is an interface wrapper for TB type
|
// _testing_TB is an interface wrapper for TB type
|
||||||
type _testing_TB struct {
|
type _testing_TB struct {
|
||||||
WCleanup func(a0 func())
|
WCleanup func(a0 func())
|
||||||
WError func(args []interface{})
|
WError func(args ...interface{})
|
||||||
WErrorf func(format string, args []interface{})
|
WErrorf func(format string, args ...interface{})
|
||||||
WFail func()
|
WFail func()
|
||||||
WFailNow func()
|
WFailNow func()
|
||||||
WFailed func() bool
|
WFailed func() bool
|
||||||
WFatal func(args []interface{})
|
WFatal func(args ...interface{})
|
||||||
WFatalf func(format string, args []interface{})
|
WFatalf func(format string, args ...interface{})
|
||||||
WHelper func()
|
WHelper func()
|
||||||
WLog func(args []interface{})
|
WLog func(args ...interface{})
|
||||||
WLogf func(format string, args []interface{})
|
WLogf func(format string, args ...interface{})
|
||||||
WName func() string
|
WName func() string
|
||||||
WSkip func(args []interface{})
|
WSkip func(args ...interface{})
|
||||||
WSkipNow func()
|
WSkipNow func()
|
||||||
WSkipf func(format string, args []interface{})
|
WSkipf func(format string, args ...interface{})
|
||||||
WSkipped func() bool
|
WSkipped func() bool
|
||||||
WTempDir func() string
|
WTempDir func() string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (W _testing_TB) Cleanup(a0 func()) { W.WCleanup(a0) }
|
func (W _testing_TB) Cleanup(a0 func()) { W.WCleanup(a0) }
|
||||||
func (W _testing_TB) Error(args []interface{}) { W.WError(args) }
|
func (W _testing_TB) Error(args ...interface{}) { W.WError(args...) }
|
||||||
func (W _testing_TB) Errorf(format string, args []interface{}) { W.WErrorf(format, args) }
|
func (W _testing_TB) Errorf(format string, args ...interface{}) { W.WErrorf(format, args...) }
|
||||||
func (W _testing_TB) Fail() { W.WFail() }
|
func (W _testing_TB) Fail() { W.WFail() }
|
||||||
func (W _testing_TB) FailNow() { W.WFailNow() }
|
func (W _testing_TB) FailNow() { W.WFailNow() }
|
||||||
func (W _testing_TB) Failed() bool { return W.WFailed() }
|
func (W _testing_TB) Failed() bool { return W.WFailed() }
|
||||||
func (W _testing_TB) Fatal(args []interface{}) { W.WFatal(args) }
|
func (W _testing_TB) Fatal(args ...interface{}) { W.WFatal(args...) }
|
||||||
func (W _testing_TB) Fatalf(format string, args []interface{}) { W.WFatalf(format, args) }
|
func (W _testing_TB) Fatalf(format string, args ...interface{}) { W.WFatalf(format, args...) }
|
||||||
func (W _testing_TB) Helper() { W.WHelper() }
|
func (W _testing_TB) Helper() { W.WHelper() }
|
||||||
func (W _testing_TB) Log(args []interface{}) { W.WLog(args) }
|
func (W _testing_TB) Log(args ...interface{}) { W.WLog(args...) }
|
||||||
func (W _testing_TB) Logf(format string, args []interface{}) { W.WLogf(format, args) }
|
func (W _testing_TB) Logf(format string, args ...interface{}) { W.WLogf(format, args...) }
|
||||||
func (W _testing_TB) Name() string { return W.WName() }
|
func (W _testing_TB) Name() string { return W.WName() }
|
||||||
func (W _testing_TB) Skip(args []interface{}) { W.WSkip(args) }
|
func (W _testing_TB) Skip(args ...interface{}) { W.WSkip(args...) }
|
||||||
func (W _testing_TB) SkipNow() { W.WSkipNow() }
|
func (W _testing_TB) SkipNow() { W.WSkipNow() }
|
||||||
func (W _testing_TB) Skipf(format string, args []interface{}) { W.WSkipf(format, args) }
|
func (W _testing_TB) Skipf(format string, args ...interface{}) { W.WSkipf(format, args...) }
|
||||||
func (W _testing_TB) Skipped() bool { return W.WSkipped() }
|
func (W _testing_TB) Skipped() bool { return W.WSkipped() }
|
||||||
func (W _testing_TB) TempDir() string { return W.WTempDir() }
|
func (W _testing_TB) TempDir() string { return W.WTempDir() }
|
||||||
|
|||||||
@@ -47,38 +47,38 @@ func init() {
|
|||||||
// _testing_TB is an interface wrapper for TB type
|
// _testing_TB is an interface wrapper for TB type
|
||||||
type _testing_TB struct {
|
type _testing_TB struct {
|
||||||
WCleanup func(a0 func())
|
WCleanup func(a0 func())
|
||||||
WError func(args []interface{})
|
WError func(args ...interface{})
|
||||||
WErrorf func(format string, args []interface{})
|
WErrorf func(format string, args ...interface{})
|
||||||
WFail func()
|
WFail func()
|
||||||
WFailNow func()
|
WFailNow func()
|
||||||
WFailed func() bool
|
WFailed func() bool
|
||||||
WFatal func(args []interface{})
|
WFatal func(args ...interface{})
|
||||||
WFatalf func(format string, args []interface{})
|
WFatalf func(format string, args ...interface{})
|
||||||
WHelper func()
|
WHelper func()
|
||||||
WLog func(args []interface{})
|
WLog func(args ...interface{})
|
||||||
WLogf func(format string, args []interface{})
|
WLogf func(format string, args ...interface{})
|
||||||
WName func() string
|
WName func() string
|
||||||
WSkip func(args []interface{})
|
WSkip func(args ...interface{})
|
||||||
WSkipNow func()
|
WSkipNow func()
|
||||||
WSkipf func(format string, args []interface{})
|
WSkipf func(format string, args ...interface{})
|
||||||
WSkipped func() bool
|
WSkipped func() bool
|
||||||
WTempDir func() string
|
WTempDir func() string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (W _testing_TB) Cleanup(a0 func()) { W.WCleanup(a0) }
|
func (W _testing_TB) Cleanup(a0 func()) { W.WCleanup(a0) }
|
||||||
func (W _testing_TB) Error(args []interface{}) { W.WError(args) }
|
func (W _testing_TB) Error(args ...interface{}) { W.WError(args...) }
|
||||||
func (W _testing_TB) Errorf(format string, args []interface{}) { W.WErrorf(format, args) }
|
func (W _testing_TB) Errorf(format string, args ...interface{}) { W.WErrorf(format, args...) }
|
||||||
func (W _testing_TB) Fail() { W.WFail() }
|
func (W _testing_TB) Fail() { W.WFail() }
|
||||||
func (W _testing_TB) FailNow() { W.WFailNow() }
|
func (W _testing_TB) FailNow() { W.WFailNow() }
|
||||||
func (W _testing_TB) Failed() bool { return W.WFailed() }
|
func (W _testing_TB) Failed() bool { return W.WFailed() }
|
||||||
func (W _testing_TB) Fatal(args []interface{}) { W.WFatal(args) }
|
func (W _testing_TB) Fatal(args ...interface{}) { W.WFatal(args...) }
|
||||||
func (W _testing_TB) Fatalf(format string, args []interface{}) { W.WFatalf(format, args) }
|
func (W _testing_TB) Fatalf(format string, args ...interface{}) { W.WFatalf(format, args...) }
|
||||||
func (W _testing_TB) Helper() { W.WHelper() }
|
func (W _testing_TB) Helper() { W.WHelper() }
|
||||||
func (W _testing_TB) Log(args []interface{}) { W.WLog(args) }
|
func (W _testing_TB) Log(args ...interface{}) { W.WLog(args...) }
|
||||||
func (W _testing_TB) Logf(format string, args []interface{}) { W.WLogf(format, args) }
|
func (W _testing_TB) Logf(format string, args ...interface{}) { W.WLogf(format, args...) }
|
||||||
func (W _testing_TB) Name() string { return W.WName() }
|
func (W _testing_TB) Name() string { return W.WName() }
|
||||||
func (W _testing_TB) Skip(args []interface{}) { W.WSkip(args) }
|
func (W _testing_TB) Skip(args ...interface{}) { W.WSkip(args...) }
|
||||||
func (W _testing_TB) SkipNow() { W.WSkipNow() }
|
func (W _testing_TB) SkipNow() { W.WSkipNow() }
|
||||||
func (W _testing_TB) Skipf(format string, args []interface{}) { W.WSkipf(format, args) }
|
func (W _testing_TB) Skipf(format string, args ...interface{}) { W.WSkipf(format, args...) }
|
||||||
func (W _testing_TB) Skipped() bool { return W.WSkipped() }
|
func (W _testing_TB) Skipped() bool { return W.WSkipped() }
|
||||||
func (W _testing_TB) TempDir() string { return W.WTempDir() }
|
func (W _testing_TB) TempDir() string { return W.WTempDir() }
|
||||||
|
|||||||
Reference in New Issue
Block a user