Issue #14833 has been updated by shevegen (Robert A. Heiler).


Yay! \o/

Pretty print all the things.

----------------------------------------
Feature #14833: Add RubyVM::AST::Node#pretty_print
https://bugs.ruby-lang.org/issues/14833#change-72438

* Author: pocke (Masataka Kuwabara)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------
# Abstract

This patch adds `RubyVM::AST::Node#pretty_print` for `pp`.

# Background

`RubyVM::AST::Node#inspect` does not print children, so I cannot understand structure of a ast by `p` method.
For example:

```
$ ruby -e 'p RubyVM::AST.parse("if cond then foo; bar else hoge; fuga end")'
#<RubyVM::AST::Node(NODE_SCOPE(0) 1:0, 1:41): >
```

It is not understandable.

BTW parser gem prints children.

```
$ ruby -rparser/current -e 'p Parser::CurrentRuby.parse("if cond then foo; bar else hoge; fuga end")'
s(:if,
  s(:send, nil, :cond),
  s(:begin,
    s(:send, nil, :foo),
    s(:send, nil, :bar)),
  s(:begin,
    s(:send, nil, :hoge),
    s(:send, nil, :fuga)))
```

# Proposal

Add `RubyVM::AST::Node#pretty_print` for `pp` method and it displays children nodes.

```
$ ruby -e 'p RubyVM::AST.parse("if cond then foo; bar else hoge; fuga end")'
#<RubyVM::AST::Node(NODE_SCOPE(0) 1:0, 1:41): >


$ ruby -e 'pp RubyVM::AST.parse("if cond then foo; bar else hoge; fuga end")'
#<RubyVM::AST::Node(NODE_SCOPE(0) 1:0, 1:41
  nil,
  #<RubyVM::AST::Node(NODE_IF(2) 1:0, 1:41
    #<RubyVM::AST::Node(NODE_VCALL(38) 1:3, 1:7 ): >,
    #<RubyVM::AST::Node(NODE_BLOCK(1) 1:13, 1:21
      #<RubyVM::AST::Node(NODE_VCALL(38) 1:13, 1:16 ): >,
      #<RubyVM::AST::Node(NODE_VCALL(38) 1:18, 1:21 ): >): >,
    #<RubyVM::AST::Node(NODE_BLOCK(1) 1:27, 1:37
      #<RubyVM::AST::Node(NODE_VCALL(38) 1:27, 1:31 ): >,
      #<RubyVM::AST::Node(NODE_VCALL(38) 1:33, 1:37 ): >): >): >): >
```



# Implementation

See `ast_node_pp.patch` from the attachment.


# Note

Probably this format of `pp` is not the best. We can improve the format. For example, maybe we can add braces for children node.
If you have any ideas, please tell me the ideas!


---Files--------------------------------
ast_node_pp.patch (2.08 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>