@@ -394,31 +394,40 @@ func MatchStructDecl(decl dst.Decl, structType string) bool {
394
394
// To solve this issue, we disable DST's automatic Import management
395
395
// and use plain AST manipulation to add imports.
396
396
397
- // ParseAstFromSnippet parses the AST from incomplete source code snippet.
398
- func ParseAstFromSnippet (codeSnippnet string ) ([]dst.Stmt , error ) {
399
- fset := token .NewFileSet ()
397
+ type AstParser struct {
398
+ fset * token.FileSet
399
+ }
400
+
401
+ func NewAstParser () * AstParser {
402
+ return & AstParser {
403
+ fset : token .NewFileSet (),
404
+ }
405
+ }
406
+
407
+ // ParseSnippet parses the AST from incomplete source code snippet.
408
+ func (ap * AstParser ) ParseSnippet (codeSnippnet string ) ([]dst.Stmt , error ) {
409
+ Assert (codeSnippnet != "" , "empty code snippet" )
400
410
snippet := "package main; func _() {" + codeSnippnet + "}"
401
- file , err := decorator .ParseFile (fset , "" , snippet , 0 )
411
+ file , err := decorator .ParseFile (ap . fset , "" , snippet , 0 )
402
412
if err != nil {
403
413
return nil , errc .New (errc .ErrParseCode , err .Error ())
404
414
}
405
415
return file .Decls [0 ].(* dst.FuncDecl ).Body .List , nil
406
416
}
407
417
408
- // ParseAstFromSource parses the AST from complete source code.
409
- func ParseAstFromSource (source string ) (* dst.File , error ) {
418
+ // ParseSource parses the AST from complete source code.
419
+ func ( ap * AstParser ) ParseSource (source string ) (* dst.File , error ) {
410
420
Assert (source != "" , "empty source" )
411
- dec := decorator .NewDecorator (token . NewFileSet () )
421
+ dec := decorator .NewDecorator (ap . fset )
412
422
dstRoot , err := dec .Parse (source )
413
423
if err != nil {
414
424
return nil , errc .New (errc .ErrParseCode , err .Error ())
415
425
}
416
426
return dstRoot , nil
417
427
}
418
428
419
- func parseAstMode (filePath string , mode parser.Mode ) (* dst.File , error ) {
429
+ func ( ap * AstParser ) ParseFile (filePath string , mode parser.Mode ) (* dst.File , error ) {
420
430
name := filepath .Base (filePath )
421
- fset := token .NewFileSet ()
422
431
file , err := os .Open (filePath )
423
432
if err != nil {
424
433
return nil , errc .New (errc .ErrOpenFile , err .Error ())
@@ -429,11 +438,11 @@ func parseAstMode(filePath string, mode parser.Mode) (*dst.File, error) {
429
438
LogFatal ("failed to close file %s: %v" , file .Name (), err )
430
439
}
431
440
}(file )
432
- astFile , err := parser .ParseFile (fset , name , file , mode )
441
+ astFile , err := parser .ParseFile (ap . fset , name , file , mode )
433
442
if err != nil {
434
443
return nil , errc .New (errc .ErrParseCode , err .Error ())
435
444
}
436
- dec := decorator .NewDecorator (fset )
445
+ dec := decorator .NewDecorator (ap . fset )
437
446
dstFile , err := dec .DecorateFile (astFile )
438
447
if err != nil {
439
448
return nil , errc .New (errc .ErrParseCode , err .Error ())
@@ -442,16 +451,16 @@ func parseAstMode(filePath string, mode parser.Mode) (*dst.File, error) {
442
451
}
443
452
444
453
func ParseAstFromFileOnlyPackage (filePath string ) (* dst.File , error ) {
445
- return parseAstMode (filePath , parser .PackageClauseOnly )
454
+ return NewAstParser (). ParseFile (filePath , parser .PackageClauseOnly )
446
455
}
447
456
448
457
func ParseAstFromFileFast (filePath string ) (* dst.File , error ) {
449
- return parseAstMode (filePath , parser .SkipObjectResolution )
458
+ return NewAstParser (). ParseFile (filePath , parser .SkipObjectResolution )
450
459
}
451
460
452
461
// ParseAstFromFile parses the AST from complete source file.
453
462
func ParseAstFromFile (filePath string ) (* dst.File , error ) {
454
- return parseAstMode (filePath , parser .ParseComments )
463
+ return NewAstParser (). ParseFile (filePath , parser .ParseComments )
455
464
}
456
465
457
466
// WriteAstToFile writes the AST to source file.
0 commit comments