Project

General

Profile

Feature #14833

Add RubyVM::AST::Node#pretty_print

Added by pocke (Masataka Kuwabara) 2 months ago. Updated 2 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:87445]

Description

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!

ast_node_pp.patch (2.08 KB) ast_node_pp.patch pocke (Masataka Kuwabara), 06/07/2018 02:44 PM

History

#1 [ruby-core:87446] Updated by shevegen (Robert A. Heiler) 2 months ago

Yay! \o/

Pretty print all the things.

Also available in: Atom PDF