@@ -2,15 +2,12 @@ package generator
2
2
3
3
import (
4
4
"fmt"
5
- "go/ast"
6
- "go/build"
7
- "go/parser"
8
- "go/token"
9
5
"go/types"
10
6
"path/filepath"
11
7
"reflect"
12
8
"strings"
13
9
10
+ "golang.org/x/tools/go/packages"
14
11
parseutil "gopkg.in/src-d/go-parse-utils.v1"
15
12
)
16
13
@@ -59,70 +56,18 @@ func (p *Processor) write(msg string, args ...interface{}) {
59
56
60
57
// Do performs all the processing and returns the scanned package.
61
58
func (p * Processor ) Do () (* Package , error ) {
62
- files , err := p .getSourceFiles ()
63
- if err != nil {
64
- return nil , err
65
- }
66
-
67
- p .Package , err = p .parseSourceFiles (files )
59
+ pkgs , err := packages .Load (& packages.Config {
60
+ Dir : "." ,
61
+ Mode : packages .NeedImports | packages .NeedTypes | packages .NeedDeps ,
62
+ }, p .Path )
68
63
if err != nil {
69
64
return nil , err
70
65
}
66
+ p .Package = pkgs [0 ].Types
71
67
72
68
return p .processPackage ()
73
69
}
74
70
75
- func (p * Processor ) getSourceFiles () ([]string , error ) {
76
- pkg , err := build .Default .ImportDir (p .Path , 0 )
77
- if err != nil {
78
- return nil , fmt .Errorf ("kallax: cannot process directory %s: %s" , p .Path , err )
79
- }
80
-
81
- var files []string
82
- files = append (files , pkg .GoFiles ... )
83
- files = append (files , pkg .CgoFiles ... )
84
-
85
- if len (files ) == 0 {
86
- return nil , fmt .Errorf ("kallax: %s: no buildable Go files" , p .Path )
87
- }
88
-
89
- return joinDirectory (p .Path , p .removeIgnoredFiles (files )), nil
90
- }
91
-
92
- func (p * Processor ) removeIgnoredFiles (filenames []string ) []string {
93
- var output []string
94
- for _ , filename := range filenames {
95
- if _ , ok := p .Ignore [filename ]; ok {
96
- continue
97
- }
98
-
99
- output = append (output , filename )
100
- }
101
-
102
- return output
103
- }
104
-
105
- func (p * Processor ) parseSourceFiles (filenames []string ) (* types.Package , error ) {
106
- var files []* ast.File
107
- fs := token .NewFileSet ()
108
- for _ , filename := range filenames {
109
- file , err := parser .ParseFile (fs , filename , nil , 0 )
110
- if err != nil {
111
- return nil , fmt .Errorf ("kallax: parsing package: %s: %s" , filename , err )
112
- }
113
-
114
- files = append (files , file )
115
- }
116
-
117
- config := types.Config {
118
- FakeImportC : true ,
119
- Error : func (error ) {},
120
- Importer : parseutil .NewImporter (),
121
- }
122
-
123
- return config .Check (p .Path , fs , files , new (types.Info ))
124
- }
125
-
126
71
func (p * Processor ) processPackage () (* Package , error ) {
127
72
pkg := NewPackage (p .Package )
128
73
var ctors []* types.Func
@@ -465,15 +410,6 @@ func (p *Processor) processBaseField(m *Model, f *Field) {
465
410
}
466
411
}
467
412
468
- func joinDirectory (directory string , files []string ) []string {
469
- result := make ([]string , len (files ))
470
- for i , file := range files {
471
- result [i ] = filepath .Join (directory , file )
472
- }
473
-
474
- return result
475
- }
476
-
477
413
func typeName (typ types.Type ) string {
478
414
return removeGoPath (typ .String ())
479
415
}
0 commit comments