aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/go-toolsmith/strparse/strparse.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/go-toolsmith/strparse/strparse.go')
-rw-r--r--vendor/github.com/go-toolsmith/strparse/strparse.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/vendor/github.com/go-toolsmith/strparse/strparse.go b/vendor/github.com/go-toolsmith/strparse/strparse.go
new file mode 100644
index 000000000..894c7ebac
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/strparse/strparse.go
@@ -0,0 +1,59 @@
+// Package strparse provides convenience wrappers around `go/parser` for simple
+// expression, statement and declaration parsing from string.
+//
+// Can be used to construct AST nodes using source syntax.
+package strparse
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+)
+
+var (
+ // BadExpr is returned as a parse result for malformed expressions.
+ // Should be treated as constant or readonly variable.
+ BadExpr = &ast.BadExpr{}
+
+ // BadStmt is returned as a parse result for malformed statmenents.
+ // Should be treated as constant or readonly variable.
+ BadStmt = &ast.BadStmt{}
+
+ // BadDecl is returned as a parse result for malformed declarations.
+ // Should be treated as constant or readonly variable.
+ BadDecl = &ast.BadDecl{}
+)
+
+// Expr parses single expression node from s.
+// In case of parse error, BadExpr is returned.
+func Expr(s string) ast.Expr {
+ node, err := parser.ParseExpr(s)
+ if err != nil {
+ return BadExpr
+ }
+ return node
+}
+
+// Stmt parses single statement node from s.
+// In case of parse error, BadStmt is returned.
+func Stmt(s string) ast.Stmt {
+ node, err := parser.ParseFile(token.NewFileSet(), "", "package main;func main() {"+s+"}", 0)
+ if err != nil {
+ return BadStmt
+ }
+ fn := node.Decls[0].(*ast.FuncDecl)
+ if len(fn.Body.List) != 1 {
+ return BadStmt
+ }
+ return fn.Body.List[0]
+}
+
+// Decl parses single declaration node from s.
+// In case of parse error, BadDecl is returned.
+func Decl(s string) ast.Decl {
+ node, err := parser.ParseFile(token.NewFileSet(), "", "package main;"+s, 0)
+ if err != nil || len(node.Decls) != 1 {
+ return BadDecl
+ }
+ return node.Decls[0]
+}