]> Cypherpunks repositories - gostls13.git/commitdiff
go/parser: add ParseExprFrom function
authorRobert Griesemer <gri@golang.org>
Fri, 12 Jun 2015 23:33:49 +0000 (16:33 -0700)
committerRobert Griesemer <gri@golang.org>
Fri, 12 Jun 2015 23:46:32 +0000 (23:46 +0000)
This is needed for code that relies on having the correct file set
when parsing an expression only. There's currently no other way to
get to the file set otherwise or to invoke the parser correctly to
work on an expression only with a given file set.

Change-Id: I325f174cb34b69284e627f59fe8334efa4eaa45c
Reviewed-on: https://go-review.googlesource.com/10998
Reviewed-by: Alan Donovan <adonovan@google.com>
src/go/parser/interface.go

index f3bc4b9cc811fd31aba7d6ca9ee0463c14e76341..c6fd93240afe66dd877bf561cf5819d51372a7db 100644 (file)
@@ -167,14 +167,31 @@ func ParseDir(fset *token.FileSet, path string, filter func(os.FileInfo) bool, m
        return
 }
 
-// ParseExpr is a convenience function for obtaining the AST of an expression x.
-// The position information recorded in the AST is undefined. The filename used
-// in error messages is the empty string.
+// ParseExprFrom is a convenience function for parsing an expression.
+// The arguments have the same meaning as for Parse, but the source must
+// be a valid Go (type or value) expression.
 //
-func ParseExpr(x string) (ast.Expr, error) {
+func ParseExprFrom(fset *token.FileSet, filename string, src interface{}, mode Mode) (ast.Expr, error) {
+       // get source
+       text, err := readSource(filename, src)
+       if err != nil {
+               return nil, err
+       }
+
        var p parser
-       p.init(token.NewFileSet(), "", []byte(x), 0)
+       defer func() {
+               if e := recover(); e != nil {
+                       // resume same panic if it's not a bailout
+                       if _, ok := e.(bailout); !ok {
+                               panic(e)
+                       }
+               }
+               p.errors.Sort()
+               err = p.errors.Err()
+       }()
 
+       // parse expr
+       p.init(fset, filename, text, mode)
        // Set up pkg-level scopes to avoid nil-pointer errors.
        // This is not needed for a correct expression x as the
        // parser will be ok with a nil topScope, but be cautious
@@ -199,3 +216,11 @@ func ParseExpr(x string) (ast.Expr, error) {
 
        return e, nil
 }
+
+// ParseExpr is a convenience function for obtaining the AST of an expression x.
+// The position information recorded in the AST is undefined. The filename used
+// in error messages is the empty string.
+//
+func ParseExpr(x string) (ast.Expr, error) {
+       return ParseExprFrom(token.NewFileSet(), "", []byte(x), 0)
+}