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

ruby-changes:40201

From: nobu <ko1@a...>
Date: Mon, 26 Oct 2015 12:55:35 +0900 (JST)
Subject: [ruby-changes:40201] nobu:r52282 (trunk): parse.y: call_op2

nobu	2015-10-26 12:55:08 +0900 (Mon, 26 Oct 2015)

  New Revision: 52282

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

  Log:
    parse.y: call_op2
    
    * parse.y (call_op2): separate from call_op and also allow "::",
      while dot_or_colon should not allow ".?".  [Feature #11537]

  Modified files:
    trunk/ChangeLog
    trunk/parse.y
    trunk/test/ripper/test_parser_events.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 52281)
+++ ChangeLog	(revision 52282)
@@ -1,3 +1,13 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Mon Oct 26 12:55:06 2015  Nobuyoshi Nakada  <nobu@r...>
+
+	* parse.y (call_op2): separate from call_op and also allow "::",
+	  while dot_or_colon should not allow ".?".  [Feature #11537]
+
+Mon Oct 26 12:54:26 2015  Nobuyoshi Nakada  <nobu@r...>
+
+	* parse.y (call_op2): separate from call_op and also allow "::",
+	  while dot_or_colon should not allow ".?".  [Feature #11537]
+
 Mon Oct 26 01:03:23 2015  Rei Odaira  <Rei.Odaira@g...>
 
 	* thread_pthread.c: fix compile erros when
Index: parse.y
===================================================================
--- parse.y	(revision 52281)
+++ parse.y	(revision 52282)
@@ -847,7 +847,7 @@ static void token_info_pop(struct parser https://github.com/ruby/ruby/blob/trunk/parse.y#L847
 %type <node> mlhs mlhs_head mlhs_basic mlhs_item mlhs_node mlhs_post mlhs_inner
 %type <id>   fsym keyword_variable user_variable sym symbol operation operation2 operation3
 %type <id>   cname fname op f_rest_arg f_block_arg opt_f_block_arg f_norm_arg f_bad_arg
-%type <id>   f_kwrest f_label f_arg_asgn call_op
+%type <id>   f_kwrest f_label f_arg_asgn call_op call_op2
 /*%%%*/
 /*%
 %type <val> program reswords then do dot_or_colon
@@ -1395,7 +1395,7 @@ command_call	: command https://github.com/ruby/ruby/blob/trunk/parse.y#L1395
 		;
 
 block_command	: block_call
-		| block_call dot_or_colon operation2 command_args
+		| block_call call_op2 operation2 command_args
 		    {
 		    /*%%%*/
 			$$ = NEW_CALL($1, $3, $4);
@@ -3608,7 +3608,7 @@ block_call	: command do_block https://github.com/ruby/ruby/blob/trunk/parse.y#L3608
 			$$ = method_add_block($1, $2);
 		    %*/
 		    }
-		| block_call dot_or_colon operation2 opt_paren_args
+		| block_call call_op2 operation2 opt_paren_args
 		    {
 		    /*%%%*/
 			$$ = NEW_CALL($1, $3, $4);
@@ -3617,7 +3617,7 @@ block_call	: command do_block https://github.com/ruby/ruby/blob/trunk/parse.y#L3617
 			$$ = method_optarg($$, $4);
 		    %*/
 		    }
-		| block_call dot_or_colon operation2 opt_paren_args brace_block
+		| block_call call_op2 operation2 opt_paren_args brace_block
 		    {
 		    /*%%%*/
 			block_dup_check($4, $5);
@@ -3629,7 +3629,7 @@ block_call	: command do_block https://github.com/ruby/ruby/blob/trunk/parse.y#L3629
 			$$ = method_add_block($$, $5);
 		    %*/
 		    }
-		| block_call dot_or_colon operation2 command_args do_block
+		| block_call call_op2 operation2 command_args do_block
 		    {
 		    /*%%%*/
 			block_dup_check($4, $5);
@@ -5107,7 +5107,7 @@ operation3	: tIDENTIFIER https://github.com/ruby/ruby/blob/trunk/parse.y#L5107
 		| op
 		;
 
-dot_or_colon	: call_op
+dot_or_colon	: '.'
 		    /*%c%*/
 		    /*%c
 		    { $$ = $<val>1; }
@@ -5123,6 +5123,10 @@ call_op 	: '.' {$$ = '.';} https://github.com/ruby/ruby/blob/trunk/parse.y#L5123
 		| tDOTQ {$$ = tDOTQ;}
 		;
 
+call_op2	: call_op
+		| tCOLON2 {$$ = tCOLON2;}
+		;
+
 opt_terms	: /* none */
 		| terms
 		;
Index: test/ripper/test_parser_events.rb
===================================================================
--- test/ripper/test_parser_events.rb	(revision 52281)
+++ test/ripper/test_parser_events.rb	(revision 52282)
@@ -389,6 +389,16 @@ class TestRipper::ParserEvents < Test::U https://github.com/ruby/ruby/blob/trunk/test/ripper/test_parser_events.rb#L389
     }
     assert_equal true, thru_call
     assert_equal "[call(vcall(foo),::,call,[])]", tree
+
+    thru_call = false
+    tree = parse("self.?foo", :on_call) {thru_call = true}
+    assert_equal true, thru_call
+    assert_equal "[call(ref(self),.?,foo)]", tree
+
+    thru_call = false
+    tree = parse("self.?foo()", :on_call) {thru_call = true}
+    assert_equal true, thru_call
+    assert_equal "[call(ref(self),.?,foo,[])]", tree
   end
 
   def test_excessed_comma
@@ -554,8 +564,13 @@ class TestRipper::ParserEvents < Test::U https://github.com/ruby/ruby/blob/trunk/test/ripper/test_parser_events.rb#L564
 
   def test_defs
     thru_defs = false
-    parse('def foo.bar; end', :on_defs) {thru_defs = true}
+    tree = parse('def foo.bar; end', :on_defs) {thru_defs = true}
     assert_equal true, thru_defs
+    assert_equal("[defs(vcall(foo),.,bar,[],bodystmt([void()]))]", tree)
+
+    thru_parse_error = false
+    tree = parse('def foo.?bar; end', :on_parse_error) {thru_parse_error = true}
+    assert_equal(true, thru_parse_error)
   end
 
   def test_do_block

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

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