[前][次][番号順一覧][スレッド一覧]

ruby-changes:53922

From: nobu <ko1@a...>
Date: Mon, 3 Dec 2018 10:06:51 +0900 (JST)
Subject: [ruby-changes:53922] nobu:r66142 (trunk): Refine RubyVM::AbstractSyntaxTree::Node#type

nobu	2018-12-03 10:06:34 +0900 (Mon, 03 Dec 2018)

  New Revision: 66142

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=66142

  Log:
    Refine RubyVM::AbstractSyntaxTree::Node#type
    
    * ast.c (rb_ast_node_type): simplified to return a Symbol without
      "NODE_" prefix.

  Modified files:
    trunk/ast.c
    trunk/lib/pp.rb
    trunk/test/ruby/test_ast.rb
Index: ast.c
===================================================================
--- ast.c	(revision 66141)
+++ ast.c	(revision 66142)
@@ -262,21 +262,21 @@ rb_ast_node_alloc(VALUE klass) https://github.com/ruby/ruby/blob/trunk/ast.c#L262
 }
 
 static const char*
-node_type_to_str(NODE *node)
+node_type_to_str(const NODE *node)
 {
-    return ruby_node_name(nd_type(node));
+    return (ruby_node_name(nd_type(node)) + rb_strlen_lit("NODE_"));
 }
 
 /*
  *  call-seq:
- *     node.type -> string
+ *     node.type -> symbol
  *
- *  Returns the type of this node as a string.
+ *  Returns the type of this node as a symbol.
  *
  *    root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2")
- *    root.type # => "NODE_SCOPE"
+ *    root.type # => :SCOPE
  *    call = root.children[2]
- *    call.type # => "NODE_OPCALL"
+ *    call.type # => :OPCALL
  */
 static VALUE
 rb_ast_node_type(VALUE self)
@@ -284,7 +284,7 @@ rb_ast_node_type(VALUE self) https://github.com/ruby/ruby/blob/trunk/ast.c#L284
     struct ASTNodeData *data;
     TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
 
-    return rb_fstring_cstr(node_type_to_str(data->node));
+    return rb_sym_intern_ascii_cstr(node_type_to_str(data->node));
 }
 
 #define NEW_CHILD(ast, node) node ? ast_new_internal(ast, node) : Qnil
Index: lib/pp.rb
===================================================================
--- lib/pp.rb	(revision 66141)
+++ lib/pp.rb	(revision 66142)
@@ -529,13 +529,13 @@ class RubyVM::AbstractSyntaxTree::Node https://github.com/ruby/ruby/blob/trunk/lib/pp.rb#L529
   end
 
   def pretty_print(q)
-    q.group(1, "(#{type.sub(/\ANODE_/,'')}@#{first_lineno}:#{first_column}-#{last_lineno}:#{last_column}", ")") {
+    q.group(1, "(#{type}@#{first_lineno}:#{first_column}-#{last_lineno}:#{last_column}", ")") {
       case type
-      when "NODE_SCOPE"
+      when :SCOPE
         pretty_print_children(q, %w"tbl args body")
-      when "NODE_ARGS"
+      when :ARGS
         pretty_print_children(q, %w[pre_num pre_init opt first_post post_num post_init rest kw kwrest block])
-      when "NODE_DEFN"
+      when :DEFN
         pretty_print_children(q, %w[mid body])
       else
         pretty_print_children(q)
Index: test/ruby/test_ast.rb
===================================================================
--- test/ruby/test_ast.rb	(revision 66141)
+++ test/ruby/test_ast.rb	(revision 66142)
@@ -76,7 +76,7 @@ class TestAst < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_ast.rb#L76
       return true if children.empty?
       # These NODE_D* has NODE_ARRAY as nd_next->nd_next whose last locations
       # we can not update when item is appended.
-      return true if ["NODE_DSTR", "NODE_DXSTR", "NODE_DREGX", "NODE_DSYM"].include? node.type
+      return true if [:DSTR, :DXSTR, :DREGX, :DSYM].include? node.type
 
       min = children.map(&:beg_pos).min
       max = children.map(&:end_pos).max
@@ -138,18 +138,18 @@ class TestAst < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_ast.rb#L138
     term = "A"*257
     ast = RubyVM::AbstractSyntaxTree.parse("<<-#{term}\n""ddddddd\n#{term}\n")
     node = ast.children[2]
-    assert_equal("NODE_STR", node.type)
+    assert_equal(:STR, node.type)
     assert_equal(0, node.first_column)
   end
 
   def test_column_of_heredoc
     node = RubyVM::AbstractSyntaxTree.parse("<<-SRC\nddddddd\nSRC\n").children[2]
-    assert_equal("NODE_STR", node.type)
+    assert_equal(:STR, node.type)
     assert_equal(0, node.first_column)
     assert_equal(6, node.last_column)
 
     node = RubyVM::AbstractSyntaxTree.parse("<<SRC\nddddddd\nSRC\n").children[2]
-    assert_equal("NODE_STR", node.type)
+    assert_equal(:STR, node.type)
     assert_equal(0, node.first_column)
     assert_equal(5, node.last_column)
   end
@@ -200,15 +200,15 @@ class TestAst < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_ast.rb#L200
     node = RubyVM::AbstractSyntaxTree.parse("x = 0")
     lv, _, body = *node.children
     assert_equal([:x], lv)
-    assert_equal("NODE_LASGN", body.type)
+    assert_equal(:LASGN, body.type)
   end
 
   def test_call
     node = RubyVM::AbstractSyntaxTree.parse("nil.foo")
     _, _, body = *node.children
-    assert_equal("NODE_CALL", body.type)
+    assert_equal(:CALL, body.type)
     recv, mid, args = body.children
-    assert_equal("NODE_NIL", recv.type)
+    assert_equal(:NIL, recv.type)
     assert_equal(:foo, mid)
     assert_nil(args)
   end
@@ -216,7 +216,7 @@ class TestAst < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_ast.rb#L216
   def test_fcall
     node = RubyVM::AbstractSyntaxTree.parse("foo()")
     _, _, body = *node.children
-    assert_equal("NODE_FCALL", body.type)
+    assert_equal(:FCALL, body.type)
     mid, args = body.children
     assert_equal(:foo, mid)
     assert_nil(args)
@@ -225,7 +225,7 @@ class TestAst < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_ast.rb#L225
   def test_vcall
     node = RubyVM::AbstractSyntaxTree.parse("foo")
     _, _, body = *node.children
-    assert_equal("NODE_VCALL", body.type)
+    assert_equal(:VCALL, body.type)
     mid, args = body.children
     assert_equal(:foo, mid)
     assert_nil(args)
@@ -234,19 +234,19 @@ class TestAst < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_ast.rb#L234
   def test_defn
     node = RubyVM::AbstractSyntaxTree.parse("def a; end")
     _, _, body = *node.children
-    assert_equal("NODE_DEFN", body.type)
+    assert_equal(:DEFN, body.type)
     mid, defn = body.children
     assert_equal(:a, mid)
-    assert_equal("NODE_SCOPE", defn.type)
+    assert_equal(:SCOPE, defn.type)
   end
 
   def test_defs
     node = RubyVM::AbstractSyntaxTree.parse("def a.b; end")
     _, _, body = *node.children
-    assert_equal("NODE_DEFS", body.type)
+    assert_equal(:DEFS, body.type)
     recv, mid, defn = body.children
-    assert_equal("NODE_VCALL", recv.type)
+    assert_equal(:VCALL, recv.type)
     assert_equal(:b, mid)
-    assert_equal("NODE_SCOPE", defn.type)
+    assert_equal(:SCOPE, defn.type)
   end
 end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]