diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-04-24 07:04:41 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-04-24 07:04:41 +0000 |
commit | 5f34227718b20c1f7b10798ff2180629a391e1a8 (patch) | |
tree | 7798584ee9cff43c0d4ceaa1054e0db2e33c5ea5 | |
parent | 4f2b00429e9f98a91ae94f10d2d0435a120ed5e7 (diff) | |
download | ruby-5f34227718b20c1f7b10798ff2180629a391e1a8.tar.gz |
* parse.y (parser_yylex): EXPR_BEG by keywords is a start point of
commands. [ruby-dev:45563][Bug #6347]
* parse.y (superclass): ditto for superclass.
* parse.y (parser_parse_string, parser_here_document): ditto for
string interpolation.
* parse.y (parser_yylex): ditto for singleton class.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35457 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | parse.y | 9 | ||||
-rw-r--r-- | test/ruby/test_syntax.rb | 32 |
3 files changed, 52 insertions, 1 deletions
@@ -1,3 +1,15 @@ +Tue Apr 24 16:04:39 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * parse.y (parser_yylex): EXPR_BEG by keywords is a start point of + commands. [ruby-dev:45563][Bug #6347] + + * parse.y (superclass): ditto for superclass. + + * parse.y (parser_parse_string, parser_here_document): ditto for + string interpolation. + + * parse.y (parser_yylex): ditto for singleton class. + Tue Apr 24 15:51:41 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> * lib/optparse.rb (OptionParser#to_a): should split by end-of-line @@ -4407,6 +4407,7 @@ superclass : term | '<' { lex_state = EXPR_BEG; + command_start = TRUE; } expr_value term { @@ -6144,6 +6145,7 @@ parser_parse_string(struct parser_params *parser, NODE *quote) pushback(c); return tSTRING_DVAR; case '{': + command_start = TRUE; return tSTRING_DBEG; } tokadd('#'); @@ -6369,6 +6371,7 @@ parser_here_document(struct parser_params *parser, NODE *here) pushback(c); return tSTRING_DVAR; case '{': + command_start = TRUE; return tSTRING_DBEG; } tokadd('#'); @@ -7009,6 +7012,8 @@ parser_yylex(struct parser_params *parser) switch (lex_state) { case EXPR_FNAME: case EXPR_DOT: lex_state = EXPR_ARG; break; + case EXPR_CLASS: + command_start = TRUE; default: lex_state = EXPR_BEG; break; } @@ -7997,8 +8002,10 @@ parser_yylex(struct parser_params *parser) set_yylval_name(rb_intern(kw->name)); return kw->id[0]; } - if (kw->id[0] == keyword_do) { + if (lex_state == EXPR_BEG) { command_start = TRUE; + } + if (kw->id[0] == keyword_do) { if (lpar_beg && lpar_beg == paren_nest) { lpar_beg = 0; --paren_nest; diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 51a0f355f8..af795440c5 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -103,8 +103,40 @@ class TestSyntax < Test::Unit::TestCase end end + def test_cmd_symbol_after_keyword + bug6347 = '[ruby-dev:45563]' + assert_not_label(:foo, 'if true then not_label:foo end', bug6347) + assert_not_label(:foo, 'if false; else not_label:foo end', bug6347) + assert_not_label(:foo, 'begin not_label:foo end', bug6347) + assert_not_label(:foo, 'begin ensure not_label:foo end', bug6347) + end + + def test_cmd_symbol_in_string + bug6347 = '[ruby-dev:45563]' + assert_not_label(:foo, '"#{not_label:foo}"', bug6347) + end + + def test_cmd_symbol_singleton_class + bug6347 = '[ruby-dev:45563]' + @not_label = self + assert_not_label(:foo, 'class << not_label:foo; end', bug6347) + end + + def test_cmd_symbol_superclass + bug6347 = '[ruby-dev:45563]' + @not_label = Object + assert_not_label(:foo, 'class Foo < not_label:foo; end', bug6347) + end + private + def not_label(x) @result = x; @not_label ||= nil end + def assert_not_label(expected, src, message = nil) + @result = nil + assert_nothing_raised(SyntaxError, message) {eval(src)} + assert_equal(expected, @result, message) + end + def make_tmpsrc(f, src) f.open f.truncate(0) |