func (p *parser) parseLiteralValue(n *parse.Node) (exprs []ast.Expr) { if n.ChildCount() == 3 { eachListItem(element, n.Child(1), func(item *parse.Node) { exprs = append(exprs, p.parseElement(item)) }) } return }
func eachInlineListItem(n *parse.Node, visit func(*parse.Node)) { visit(n.Child(0)) if n.ChildCount() > 1 { n.Child(1).EachItem(func(item *parse.Node) { visit(item.Child(1)) }) } return }
func (p *parser) parseSignature(n *parse.Node, scope *ast.Scope) *ast.FuncType { funcType := ast.FuncType{ Params: p.parseParams(n.Child(0), scope), } if n.ChildCount() > 1 { funcType.Results = p.parseResults(n.Child(1), scope) } return &funcType }
func (p *parser) parseReturnStmt(n *parse.Node) ast.Stmt { ret := ast.ReturnStmt{ Return: token.Pos(n.Child(0).Pos()), } if n.ChildCount() > 1 { ret.Results = p.parseExprList(n.Child(1)) } return &ret }
func (p *parser) parseInterfaceType(n *parse.Node) ast.Expr { keywordPos := token.Pos(n.Child(0).Pos()) n = n.Child(1) specs := ast.FieldList{ Opening: token.Pos(n.Child(0).Pos()), Closing: token.Pos(n.LastChild().Pos()), } if n.ChildCount() > 2 { eachListItem(methodSpec, n.Child(1), func(item *parse.Node) { specs.List = append(specs.List, p.parseMethodSpec(item)) }) } return &ast.InterfaceType{ Interface: keywordPos, Methods: &specs, } }
func (p *parser) parseExpr(n *parse.Node) ast.Expr { if n == nil { return nil // ?? } switch n.ChildCount() { case 1: return p.parseUnaryExpr(n.Child(0)) case 3: op := n.Child(1).Child(0).Child(0) return &ast.BinaryExpr{ X: p.parseExpr(n.Child(0)), OpPos: token.Pos(op.Pos()), Op: token.Token(op.ID()), Y: p.parseUnaryExpr(n.Child(2)), } } return nil }
func (p *parser) parseImportDecl(n *parse.Node) (decl *ast.GenDecl, specs []*ast.ImportSpec) { decl = &ast.GenDecl{ TokPos: token.Pos(n.Child(0).Pos()), Tok: token.IMPORT, } n = n.Child(1) if n.Is(importSpec) { spec := p.parseImportSpec(n) specs = append(specs, spec) decl.Specs = append(decl.Specs, spec) return } decl.Lparen = token.Pos(n.Child(0).Pos()) decl.Rparen = token.Pos(n.LastChild().Pos()) if n.ChildCount() == 3 { eachListItem(importSpec, n.Child(1), func(item *parse.Node) { spec := p.parseImportSpec(item) specs = append(specs, spec) decl.Specs = append(decl.Specs, spec) }) } return }