From 837babd56459aafc1232a12fbfa783025d619b98 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 6 Nov 2015 03:39:23 +0000 Subject: change DOTQ * defs/id.def (token_ops), parse.y (parser_yylex): change DOTQ from ".?" to "&.". [ruby-core:71363] [Feature #11537] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52462 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ NEWS | 8 ++++---- defs/id.def | 2 +- lib/net/ftp.rb | 18 +++++++++--------- parse.y | 10 +++++----- test/ripper/test_parser_events.rb | 14 +++++++------- test/ripper/test_scanner_events.rb | 4 ++-- test/ruby/test_call.rb | 22 +++++++++++----------- test/ruby/test_iseq.rb | 2 +- 9 files changed, 45 insertions(+), 40 deletions(-) diff --git a/ChangeLog b/ChangeLog index e55bc5951c..c45c081dd5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Nov 6 12:39:21 2015 Nobuyoshi Nakada + + * defs/id.def (token_ops), parse.y (parser_yylex): change DOTQ + from ".?" to "&.". [ruby-core:71363] [Feature #11537] + Fri Nov 6 09:01:26 2015 Nobuyoshi Nakada * parse.y (kwd_append): fix segv after invalid keyword argument, diff --git a/NEWS b/NEWS index 067766361e..cd3b548625 100644 --- a/NEWS +++ b/NEWS @@ -20,17 +20,17 @@ with all sufficient information, see the ChangeLog file. * safe navigation operator: - * new method call syntax, `object.?foo', method #foo is called on + * new method call syntax, `object&.foo', method #foo is called on `object' if it is not nil. this is similar to `try!' in Active Support, except: * method name is syntactically required obj.try! {} # valid - obj.? {} # syntax error + obj&. {} # syntax error * arguments are evaluated only if a call is made: obj.try!(:foo, bar()) # bar() is always evaluated - obj.?foo(bar()) # bar() is conditionally evaluated + obj&.foo(bar()) # bar() is conditionally evaluated * attribute assignment is valid - obj.?attr += 1 + obj&.attr += 1 === Core classes updates (outstanding ones only) diff --git a/defs/id.def b/defs/id.def index d871200cf9..c576fbc663 100644 --- a/defs/id.def +++ b/defs/id.def @@ -98,7 +98,7 @@ token_ops = %[\ COLON3 :: ANDOP && OROP || - DOTQ .? + DOTQ &. ] class KeywordError < RuntimeError diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb index 88d070f9a3..879206c7dd 100644 --- a/lib/net/ftp.rb +++ b/lib/net/ftp.rb @@ -615,15 +615,15 @@ module Net result = String.new end begin - f.?binmode + f&.binmode retrbinary("RETR #{remotefile}", blocksize, rest_offset) do |data| - f.?write(data) - block.?(data) - result.?concat(data) + f&.write(data) + block&.(data) + result&.concat(data) end return result ensure - f.?close + f&.close end end @@ -646,13 +646,13 @@ module Net begin retrlines("RETR #{remotefile}") do |line, newline| l = newline ? line + "\n" : line - f.?print(l) - block.?(line, newline) - result.?concat(l) + f&.print(l) + block&.(line, newline) + result&.concat(l) end return result ensure - f.?close + f&.close end end diff --git a/parse.y b/parse.y index e42526a3b8..4397540ab7 100644 --- a/parse.y +++ b/parse.y @@ -875,7 +875,7 @@ static void token_info_pop(struct parser_params*, const char *token, size_t len) %token tASET RUBY_TOKEN(ASET) "[]=" %token tLSHFT RUBY_TOKEN(LSHFT) "<<" %token tRSHFT RUBY_TOKEN(RSHFT) ">>" -%token tDOTQ RUBY_TOKEN(DOTQ) ".?" +%token tDOTQ RUBY_TOKEN(DOTQ) "&." %token tCOLON2 "::" %token tCOLON3 ":: at EXPR_BEG" %token tOP_ASGN /* +=, -= etc. */ @@ -8276,6 +8276,10 @@ parser_yylex(struct parser_params *parser) lex_state = EXPR_BEG; return tOP_ASGN; } + else if (c == '.') { + lex_state = EXPR_DOT; + return tDOTQ; + } pushback(c); if (IS_SPCARG(c)) { rb_warning0("`&' interpreted as argument prefix"); @@ -8380,10 +8384,6 @@ parser_yylex(struct parser_params *parser) pushback(c); return tDOT2; } - if (c == '?') { - lex_state = EXPR_DOT; - return tDOTQ; - } pushback(c); if (c != -1 && ISDIGIT(c)) { yyerror("no . floating literal anymore; put 0 before dot"); diff --git a/test/ripper/test_parser_events.rb b/test/ripper/test_parser_events.rb index 9fa65fa89b..fec01f10d2 100644 --- a/test/ripper/test_parser_events.rb +++ b/test/ripper/test_parser_events.rb @@ -391,14 +391,14 @@ class TestRipper::ParserEvents < Test::Unit::TestCase assert_equal "[call(vcall(foo),::,call,[])]", tree thru_call = false - tree = parse("self.?foo", :on_call) {thru_call = true} + tree = parse("self&.foo", :on_call) {thru_call = true} assert_equal true, thru_call - assert_equal "[call(ref(self),.?,foo)]", tree + assert_equal "[call(ref(self),&.,foo)]", tree thru_call = false - tree = parse("self.?foo()", :on_call) {thru_call = true} + tree = parse("self&.foo()", :on_call) {thru_call = true} assert_equal true, thru_call - assert_equal "[call(ref(self),.?,foo,[])]", tree + assert_equal "[call(ref(self),&.,foo,[])]", tree end def test_excessed_comma @@ -569,7 +569,7 @@ class TestRipper::ParserEvents < Test::Unit::TestCase 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} + tree = parse('def foo&.bar; end', :on_parse_error) {thru_parse_error = true} assert_equal(true, thru_parse_error) end @@ -796,9 +796,9 @@ class TestRipper::ParserEvents < Test::Unit::TestCase assert_equal "[opassign(field(ref(self),.,foo),+=,1)]", tree thru_opassign = false - tree = parse("self.?foo += 1", :on_opassign) {thru_opassign = true} + tree = parse("self&.foo += 1", :on_opassign) {thru_opassign = true} assert_equal true, thru_opassign - assert_equal "[opassign(field(ref(self),.?,foo),+=,1)]", tree + assert_equal "[opassign(field(ref(self),&.,foo),+=,1)]", tree end def test_opassign_error diff --git a/test/ripper/test_scanner_events.rb b/test/ripper/test_scanner_events.rb index 56ba646485..45c16738d0 100644 --- a/test/ripper/test_scanner_events.rb +++ b/test/ripper/test_scanner_events.rb @@ -535,8 +535,8 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase scan('op', ':[]') assert_equal ['[]='], scan('op', ':[]=') - assert_equal ['.?'], - scan('op', 'a.?f') + assert_equal ['&.'], + scan('op', 'a&.f') assert_equal [], scan('op', %q[`make all`]) end diff --git a/test/ruby/test_call.rb b/test/ruby/test_call.rb index 12793a7572..2cef0e5c66 100644 --- a/test/ruby/test_call.rb +++ b/test/ruby/test_call.rb @@ -35,22 +35,22 @@ class TestCall < Test::Unit::TestCase def test_safe_call s = Struct.new(:x, :y, :z) o = s.new("x") - assert_equal("X", o.x.?upcase) - assert_nil(o.y.?upcase) + assert_equal("X", o.x&.upcase) + assert_nil(o.y&.upcase) assert_equal("x", o.x) - o.?x = 6 + o&.x = 6 assert_equal(6, o.x) - o.?x *= 7 + o&.x *= 7 assert_equal(42, o.x) - o.?y = 5 + o&.y = 5 assert_equal(5, o.y) - o.?z ||= 6 + o&.z ||= 6 assert_equal(6, o.z) o = nil - assert_nil(o.?x) - assert_nothing_raised(NoMethodError) {o.?x = 6} - assert_nothing_raised(NoMethodError) {o.?x *= 7} + assert_nil(o&.x) + assert_nothing_raised(NoMethodError) {o&.x = 6} + assert_nothing_raised(NoMethodError) {o&.x *= 7} end def test_safe_call_evaluate_arguments_only_method_call_is_made @@ -59,10 +59,10 @@ class TestCall < Test::Unit::TestCase s = Struct.new(:x, :y) o = s.new(["a", "b", "c"]) - o.y.?at(proc.call) + o.y&.at(proc.call) assert_equal(0, count) - o.x.?at(proc.call) + o.x&.at(proc.call) assert_equal(1, count) end end diff --git a/test/ruby/test_iseq.rb b/test/ruby/test_iseq.rb index f87a8a0361..b8d3c66715 100644 --- a/test/ruby/test_iseq.rb +++ b/test/ruby/test_iseq.rb @@ -181,7 +181,7 @@ class TestISeq < Test::Unit::TestCase end def test_safe_call_chain - src = "a.?a.?a.?a.?a.?a" + src = "a&.a&.a&.a&.a&.a" body = compile(src, __LINE__, {peephole_optimization: true}).to_a[13] labels = body.select {|op, arg| op == :branchnil}.map {|op, arg| arg} assert_equal(1, labels.uniq.size) -- cgit v1.2.3