diff --git a/mockgen/parse.go b/mockgen/parse.go index f43321c..e0fbbf3 100644 --- a/mockgen/parse.go +++ b/mockgen/parse.go @@ -21,7 +21,6 @@ import ( "fmt" "go/ast" "go/build" - "go/importer" "go/parser" "go/token" "go/types" @@ -32,6 +31,8 @@ import ( "strconv" "strings" + "golang.org/x/tools/go/packages" + "go.uber.org/mock/mockgen/model" ) @@ -640,11 +641,12 @@ func (p *fileParser) parseArrayLength(expr ast.Expr) (string, error) { return val.Obj.Decl.(*ast.ValueSpec).Values[0].(*ast.BasicLit).Value, nil case (*ast.SelectorExpr): // when the length is a const defined in an external package - usedPkg, err := importer.Default().Import(fmt.Sprintf("%s", val.X)) - if err != nil { - return "", p.errorf(expr.Pos(), "unknown package in array length: %v", err) + loadConfig := &packages.Config{ + Mode: packages.NeedName | packages.NeedTypes, } - ev, err := types.Eval(token.NewFileSet(), usedPkg, token.NoPos, val.Sel.Name) + loadConfig.Fset = token.NewFileSet() + pkgs, err := packages.Load(loadConfig, fmt.Sprintf("%s", val.X)) + ev, err := types.Eval(token.NewFileSet(), pkgs[0].Types, token.NoPos, val.Sel.Name) if err != nil { return "", p.errorf(expr.Pos(), "unknown constant in array length: %v", err) }