@@ -4,50 +4,73 @@ import (
44 "bytes"
55 "flag"
66 "fmt"
7+ "io"
78 "io/ioutil"
89 "log"
910 "os"
1011 "path/filepath"
1112 "runtime"
13+ "strconv"
1214 "sync"
15+ "time"
1316
1417 "github.com/pkg/profile"
1518 "github.com/yookoala/realpath"
16- "github.com/z7zmey/php-parser/parser"
17- "github.com/z7zmey/php-parser/printer"
18- "github.com/z7zmey/php-parser/visitor"
19+
20+ "github.com/z7zmey/php-parser/pkg/ast"
21+ "github.com/z7zmey/php-parser/pkg/cfg"
22+ "github.com/z7zmey/php-parser/pkg/errors"
23+ "github.com/z7zmey/php-parser/pkg/parser"
24+ "github.com/z7zmey/php-parser/pkg/version"
25+ "github.com/z7zmey/php-parser/pkg/visitor/dumper"
26+ "github.com/z7zmey/php-parser/pkg/visitor/nsresolver"
27+ "github.com/z7zmey/php-parser/pkg/visitor/printer"
28+ "github.com/z7zmey/php-parser/pkg/visitor/traverser"
1929)
2030
2131var wg sync.WaitGroup
22- var phpVersion string
23- var dumpType string
32+ var phpVersion * version.Version
2433var profiler string
25- var withFreeFloating * bool
34+ var dump * bool
2635var showResolvedNs * bool
2736var printBack * bool
2837var printPath * bool
38+ var printErrors * bool
39+ var printExecTime * bool
2940
3041type file struct {
3142 path string
3243 content []byte
3344}
3445
3546type result struct {
36- path string
37- parser parser.Parser
47+ path string
48+ rootNode ast.Vertex
49+ errors []* errors.Error
3850}
3951
4052func main () {
41- withFreeFloating = flag .Bool ("ff" , false , "parse and show free floating strings" )
53+ start := time .Now ()
54+ var phpVer string
55+
56+ printExecTime = flag .Bool ("time" , false , "print execution time" )
4257 showResolvedNs = flag .Bool ("r" , false , "resolve names" )
4358 printBack = flag .Bool ("pb" , false , "print AST back into the parsed file" )
4459 printPath = flag .Bool ("p" , false , "print filepath" )
45- flag .StringVar (& dumpType , "d" , "" , "dump format: [custom, go, json, pretty_json]" )
60+ printErrors = flag .Bool ("e" , false , "print errors" )
61+ dump = flag .Bool ("d" , false , "dump" )
4662 flag .StringVar (& profiler , "prof" , "" , "start profiler: [cpu, mem, trace]" )
47- flag .StringVar (& phpVersion , "phpver" , "7.4" , "php version" )
63+ flag .StringVar (& phpVer , "phpver" , "7.4" , "php version" )
4864
4965 flag .Parse ()
5066
67+ var err error
68+ phpVersion , err = version .New (phpVer )
69+ if err != nil {
70+ fmt .Println ("Error: " + err .Error ())
71+ os .Exit (1 )
72+ }
73+
5174 if len (flag .Args ()) == 0 {
5275 flag .Usage ()
5376 return
@@ -82,6 +105,11 @@ func main() {
82105 wg .Wait ()
83106 close (fileCh )
84107 close (resultCh )
108+
109+ elapsed := time .Since (start )
110+ if * printExecTime {
111+ log .Printf ("took: %s" , elapsed )
112+ }
85113}
86114
87115func processPath (pathList []string , fileCh chan <- * file ) {
@@ -109,18 +137,19 @@ func parserWorker(fileCh <-chan *file, r chan<- result) {
109137 return
110138 }
111139
112- parserWorker , err := parser .NewParser (f .content , phpVersion )
140+ var parserErrors []* errors.Error
141+ rootNode , err := parser .Parse (f .content , cfg.Config {
142+ Version : phpVersion ,
143+ ErrorHandlerFunc : func (e * errors.Error ) {
144+ parserErrors = append (parserErrors , e )
145+ },
146+ })
113147 if err != nil {
114- panic (err .Error ())
148+ fmt .Println ("Error:" + err .Error ())
149+ os .Exit (1 )
115150 }
116151
117- if * withFreeFloating {
118- parserWorker .WithFreeFloating ()
119- }
120-
121- parserWorker .Parse ()
122-
123- r <- result {path : f .path , parser : parserWorker }
152+ r <- result {path : f .path , rootNode : rootNode , errors : parserErrors }
124153 }
125154}
126155
@@ -136,51 +165,34 @@ func printerWorker(r <-chan result) {
136165 counter ++
137166
138167 if * printPath {
139- fmt . Fprintf (os .Stdout , "==> [%d] %s \n " , counter , res .path )
168+ _ , _ = io . WriteString (os .Stderr , "==> [" + strconv . Itoa ( counter ) + "] " + res .path + " \n " )
140169 }
141170
142- for _ , e := range res .parser .GetErrors () {
143- fmt .Fprintf (os .Stdout , "==> %s\n " , e )
171+ if * printErrors {
172+ for _ , e := range res .errors {
173+ _ , _ = io .WriteString (os .Stderr , "==> " + e .String ()+ "\n " )
174+ }
144175 }
145176
146177 if * printBack {
147178 o := bytes .NewBuffer ([]byte {})
148179 p := printer .NewPrinter (o )
149- p . Print ( res .parser . GetRootNode () )
180+ res .rootNode . Accept ( p )
150181
151182 err := ioutil .WriteFile (res .path , o .Bytes (), 0644 )
152183 checkErr (err )
153184 }
154185
155- var nsResolver * visitor.NamespaceResolver
156186 if * showResolvedNs {
157- nsResolver = visitor .NewNamespaceResolver ()
158- res .parser .GetRootNode ().Walk (nsResolver )
187+ v := nsresolver .NewNamespaceResolver ()
188+ traverser .NewTraverser (v ).Traverse (res .rootNode )
189+ for _ , n := range v .ResolvedNames {
190+ _ , _ = io .WriteString (os .Stderr , "===> " + n + "\n " )
191+ }
159192 }
160193
161- switch dumpType {
162- case "custom" :
163- dumper := & visitor.Dumper {
164- Writer : os .Stdout ,
165- Indent : "| " ,
166- NsResolver : nsResolver ,
167- }
168- res .parser .GetRootNode ().Walk (dumper )
169- case "json" :
170- dumper := & visitor.JsonDumper {
171- Writer : os .Stdout ,
172- NsResolver : nsResolver ,
173- }
174- res .parser .GetRootNode ().Walk (dumper )
175- case "pretty_json" :
176- dumper := & visitor.PrettyJsonDumper {
177- Writer : os .Stdout ,
178- NsResolver : nsResolver ,
179- }
180- res .parser .GetRootNode ().Walk (dumper )
181- case "go" :
182- dumper := & visitor.GoDumper {Writer : os .Stdout }
183- res .parser .GetRootNode ().Walk (dumper )
194+ if * dump == true {
195+ dumper .NewDumper (os .Stdout ).WithPositions ().WithTokens ().Dump (res .rootNode )
184196 }
185197
186198 wg .Done ()
0 commit comments