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

ruby-changes:55418

From: yui-knk <ko1@a...>
Date: Sat, 20 Apr 2019 12:25:42 +0900 (JST)
Subject: [ruby-changes:55418] yui-knk:r67627 (trunk): Add symbol to the result of `RubyVM::AbstractSyntaxTree#children`.

yui-knk	2019-04-20 12:25:36 +0900 (Sat, 20 Apr 2019)

  New Revision: 67627

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

  Log:
    Add symbol to the result of `RubyVM::AbstractSyntaxTree#children`.
    
    Add symbol to the result to make pattern match easily.
    
    For example:
    
    (1) NODE_MASGN * NODE_SPECIAL_NO_NAME_REST
    
    ```
    $ ./miniruby -e 'p RubyVM::AbstractSyntaxTree.parse("a, * = b").children[-1].children'
    [#<RubyVM::AbstractSyntaxTree::Node:VCALL@1:7-1:8>, #<RubyVM::AbstractSyntaxTree::Node:ARRAY@1:0-1:1>, :NODE_SPECIAL_NO_NAME_REST]
    ```
    
    (2) NODE_POSTARG * NODE_SPECIAL_NO_NAME_REST
    
    ```
    $ ./miniruby -e 'p RubyVM::AbstractSyntaxTree.parse("a, *, _ = b").children[-1].children[-1].children'
    [:NODE_SPECIAL_NO_NAME_REST, #<RubyVM::AbstractSyntaxTree::Node:ARRAY@1:6-1:7>]
    ```
    
    (3) NODE_LASGN * NODE_SPECIAL_REQUIRED_KEYWORD
    
    ```
    $ ./miniruby -e 'p RubyVM::AbstractSyntaxTree.parse("def a(k:) end").children[-1].children[-1].children[1].children[7].children[0].children'
    [:k, :NODE_SPECIAL_REQUIRED_KEYWORD]
    ```

  Modified files:
    trunk/ast.c
Index: ast.c
===================================================================
--- ast.c	(revision 67626)
+++ ast.c	(revision 67627)
@@ -419,7 +419,11 @@ node_children(rb_ast_t *ast, NODE *node) https://github.com/ruby/ruby/blob/trunk/ast.c#L419
         if (NODE_NAMED_REST_P(node->nd_args)) {
             return rb_ary_new_from_node_args(ast, 3, node->nd_value, node->nd_head, node->nd_args);
         }
-        return rb_ary_new_from_node_args(ast, 2, node->nd_value, node->nd_head);
+        else {
+            return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_value),
+                                        NEW_CHILD(ast, node->nd_head),
+                                        ID2SYM(rb_intern("NODE_SPECIAL_NO_NAME_REST")));
+        }
       case NODE_LASGN:
         goto asgn;
       case NODE_DASGN:
@@ -431,7 +435,7 @@ node_children(rb_ast_t *ast, NODE *node) https://github.com/ruby/ruby/blob/trunk/ast.c#L435
       case NODE_CVASGN:
       asgn:
         if (NODE_REQUIRED_KEYWORD_P(node)) {
-            return rb_ary_new_from_args(1, var_name(node->nd_vid));
+            return rb_ary_new_from_args(2, var_name(node->nd_vid), ID2SYM(rb_intern("NODE_SPECIAL_REQUIRED_KEYWORD")));
         }
         return rb_ary_new_from_args(2, var_name(node->nd_vid), NEW_CHILD(ast, node->nd_value));
       case NODE_GASGN:
@@ -600,7 +604,8 @@ node_children(rb_ast_t *ast, NODE *node) https://github.com/ruby/ruby/blob/trunk/ast.c#L604
         if (NODE_NAMED_REST_P(node->nd_1st)) {
             return rb_ary_new_from_node_args(ast, 2, node->nd_1st, node->nd_2nd);
         }
-        return rb_ary_new_from_node_args(ast, 1, node->nd_2nd);
+        return rb_ary_new_from_args(2, ID2SYM(rb_intern("NODE_SPECIAL_NO_NAME_REST")),
+                                    NEW_CHILD(ast, node->nd_2nd));
       case NODE_ARGS:
         {
             struct rb_args_info *ainfo = node->nd_ainfo;

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

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