/
pkg.go
46 lines (40 loc) · 1.09 KB
/
pkg.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package genutil
import (
"context"
"go/ast"
"go/parser"
"go/token"
"os"
"golang.org/x/tools/go/packages"
"golang.org/x/xerrors"
)
func loadPackages(ctx context.Context, dir, pattern string, environ []string) ([]*packages.Package, error) {
return packages.Load(&packages.Config{
Context: ctx,
Dir: dir,
Mode: packages.NeedTypes |
packages.NeedTypesInfo |
packages.NeedTypesSizes |
packages.NeedSyntax |
packages.NeedDeps,
Env: environ,
Fset: token.NewFileSet(),
ParseFile: func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) {
const mode = parser.AllErrors | parser.ParseComments
return parser.ParseFile(fset, filename, src, mode)
},
}, pattern)
}
// Load loads package using given pattern.
func Load(ctx context.Context, pattern string) (*packages.Package, error) {
pkgs, err := loadPackages(ctx, "", pattern, os.Environ())
if err != nil {
return nil, xerrors.Errorf("load packages: %w", err)
}
for _, pkg := range pkgs {
if pkg.ID == pattern {
return pkg, nil
}
}
return nil, xerrors.Errorf("package %s not found", pattern)
}