ruby_parser 3.2.1 → 3.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,13 @@
1
+ === 3.2.2 / 2013-07-11
2
+
3
+ * 5 bug fixes:
4
+
5
+ * 1.9/2.0: fixed assocs in return args. (presidentbeef)
6
+ * Fixed handling of parse error when class is nested in multiple defs. (whitequark)
7
+ * Fixed lexing of %w[] w/ funny whitespace separators. (whitequark)
8
+ * Fixed more call nodes that have trailing comma syntax. (presidentbeef)
9
+ * Fixed more call_args slippage.
10
+
1
11
  === 3.2.1 / 2013-07-03
2
12
 
3
13
  * 1 bug fix:
@@ -4677,18 +4677,23 @@ def _reduce_317(val, _values, result)
4677
4677
  end
4678
4678
 
4679
4679
  def _reduce_318(val, _values, result)
4680
+ result = lexer.lineno, self.in_def
4681
+
4680
4682
  self.comments.push self.lexer.comments
4681
4683
  self.in_def = true
4682
4684
  self.env.extend
4683
- result = lexer.lineno, lexer.src.beginning_of_line?
4684
4685
 
4685
4686
  result
4686
4687
  end
4687
4688
 
4688
4689
  def _reduce_319(val, _values, result)
4690
+ line, in_def = val[2]
4691
+
4689
4692
  result = new_defn val
4693
+ result[2].line line
4694
+
4690
4695
  self.env.unextend
4691
- self.in_def = false
4696
+ self.in_def = in_def
4692
4697
  self.lexer.comments # we don't care about comments in the body
4693
4698
 
4694
4699
  result
@@ -1124,16 +1124,21 @@ rule
1124
1124
  }
1125
1125
  | kDEF fname
1126
1126
  {
1127
+ result = lexer.lineno, self.in_def
1128
+
1127
1129
  self.comments.push self.lexer.comments
1128
1130
  self.in_def = true
1129
1131
  self.env.extend
1130
- result = lexer.lineno, lexer.src.beginning_of_line?
1131
1132
  }
1132
1133
  f_arglist bodystmt kEND
1133
1134
  {
1135
+ line, in_def = val[2]
1136
+
1134
1137
  result = new_defn val
1138
+ result[2].line line
1139
+
1135
1140
  self.env.unextend
1136
- self.in_def = false
1141
+ self.in_def = in_def
1137
1142
  self.lexer.comments # we don't care about comments in the body
1138
1143
  }
1139
1144
  | kDEF singleton dot_or_colon
@@ -4744,20 +4744,23 @@ def _reduce_321(val, _values, result)
4744
4744
  end
4745
4745
 
4746
4746
  def _reduce_322(val, _values, result)
4747
+ result = [lexer.lineno, self.in_def]
4748
+
4747
4749
  self.comments.push self.lexer.comments
4748
4750
  self.in_def = true
4749
4751
  self.env.extend
4750
- result = lexer.lineno
4751
4752
 
4752
4753
  result
4753
4754
  end
4754
4755
 
4755
4756
  def _reduce_323(val, _values, result)
4757
+ line, in_def = val[2]
4758
+
4756
4759
  result = new_defn val
4757
- result[2].line val[2]
4760
+ result[2].line line
4758
4761
 
4759
4762
  self.env.unextend
4760
- self.in_def = false
4763
+ self.in_def = in_def
4761
4764
  self.lexer.comments # we don't care about comments in the body
4762
4765
 
4763
4766
  result
@@ -1103,18 +1103,21 @@ rule
1103
1103
  }
1104
1104
  | kDEF fname
1105
1105
  {
1106
+ result = [lexer.lineno, self.in_def]
1107
+
1106
1108
  self.comments.push self.lexer.comments
1107
1109
  self.in_def = true
1108
1110
  self.env.extend
1109
- result = lexer.lineno
1110
1111
  }
1111
1112
  f_arglist bodystmt kEND
1112
1113
  {
1114
+ line, in_def = val[2]
1115
+
1113
1116
  result = new_defn val
1114
- result[2].line val[2]
1117
+ result[2].line line
1115
1118
 
1116
1119
  self.env.unextend
1117
- self.in_def = false
1120
+ self.in_def = in_def
1118
1121
  self.lexer.comments # we don't care about comments in the body
1119
1122
  }
1120
1123
  | kDEF singleton dot_or_colon
@@ -2225,7 +2225,7 @@ racc_reduce_table = [
2225
2225
  1, 146, :_reduce_none,
2226
2226
  3, 146, :_reduce_6,
2227
2227
  2, 146, :_reduce_none,
2228
- 1, 149, :_reduce_none,
2228
+ 1, 149, :_reduce_8,
2229
2229
  0, 153, :_reduce_9,
2230
2230
  5, 149, :_reduce_10,
2231
2231
  4, 152, :_reduce_11,
@@ -3377,7 +3377,16 @@ end
3377
3377
 
3378
3378
  # reduce 7 omitted
3379
3379
 
3380
- # reduce 8 omitted
3380
+ def _reduce_8(val, _values, result)
3381
+ result = val[0]
3382
+
3383
+ # TODO: remove once I have more confidence this is fixed
3384
+ # result.each_of_type :call_args do |s|
3385
+ # debug20 666, s, result
3386
+ # end
3387
+
3388
+ result
3389
+ end
3381
3390
 
3382
3391
  def _reduce_9(val, _values, result)
3383
3392
  if (self.in_def || self.in_single > 0) then
@@ -4504,7 +4513,7 @@ end
4504
4513
  # reduce 243 omitted
4505
4514
 
4506
4515
  def _reduce_244(val, _values, result)
4507
- result = val[0]
4516
+ result = args [val[0]]
4508
4517
 
4509
4518
  result
4510
4519
  end
@@ -4517,7 +4526,6 @@ end
4517
4526
 
4518
4527
  def _reduce_246(val, _values, result)
4519
4528
  result = args [array_to_hash(val[0])]
4520
- result[0] = :array # TODO: switch to args?
4521
4529
 
4522
4530
  result
4523
4531
  end
@@ -4750,6 +4758,7 @@ end
4750
4758
 
4751
4759
  def _reduce_291(val, _values, result)
4752
4760
  result = val[1] || s(:array)
4761
+ result[0] = :array # aref_args is :args
4753
4762
 
4754
4763
  result
4755
4764
  end
@@ -4916,7 +4925,6 @@ end
4916
4925
  def _reduce_318(val, _values, result)
4917
4926
  self.comments.push self.lexer.comments
4918
4927
  if (self.in_def || self.in_single > 0) then
4919
- debug20 15
4920
4928
  yyerror "class definition in method body"
4921
4929
  end
4922
4930
  self.env.extend
@@ -4986,20 +4994,23 @@ def _reduce_326(val, _values, result)
4986
4994
  end
4987
4995
 
4988
4996
  def _reduce_327(val, _values, result)
4997
+ result = [lexer.lineno, self.in_def]
4998
+
4989
4999
  self.comments.push self.lexer.comments
4990
5000
  self.in_def = true
4991
5001
  self.env.extend
4992
- result = lexer.lineno
4993
5002
 
4994
5003
  result
4995
5004
  end
4996
5005
 
4997
5006
  def _reduce_328(val, _values, result)
5007
+ line, in_def = val[2]
5008
+
4998
5009
  result = new_defn val
4999
- result[2].line val[2]
5010
+ result[2].line line
5000
5011
 
5001
5012
  self.env.unextend
5002
- self.in_def = false
5013
+ self.in_def = in_def
5003
5014
  self.lexer.comments # we don't care about comments in the body
5004
5015
 
5005
5016
  result
@@ -69,6 +69,14 @@ rule
69
69
  | error top_stmt
70
70
 
71
71
  top_stmt: stmt
72
+ {
73
+ result = val[0]
74
+
75
+ # TODO: remove once I have more confidence this is fixed
76
+ # result.each_of_type :call_args do |s|
77
+ # debug20 666, s, result
78
+ # end
79
+ }
72
80
  | klBEGIN
73
81
  {
74
82
  if (self.in_def || self.in_single > 0) then
@@ -574,7 +582,7 @@ rule
574
582
  | tMATCH | tNMATCH | tGT | tGEQ | tLT | tLEQ
575
583
  | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
576
584
  | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
577
- | tUPLUS | tUMINUS | tUBANG | tAREF | tASET | tBACK_REF2
585
+ | tUPLUS | tUMINUS | tUBANG | tAREF | tASET | tBACK_REF2
578
586
 
579
587
  reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
580
588
  | kALIAS | kAND | kBEGIN | kBREAK | kCASE
@@ -682,7 +690,7 @@ rule
682
690
  {
683
691
  result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
684
692
  debug20 12, val, result
685
- }
693
+ }
686
694
  | tUPLUS arg
687
695
  {
688
696
  result = new_call val[1], :"+@"
@@ -790,7 +798,7 @@ rule
790
798
  aref_args: none
791
799
  | args trailer
792
800
  {
793
- result = val[0]
801
+ result = args [val[0]]
794
802
  }
795
803
  | args tCOMMA assocs trailer
796
804
  {
@@ -799,7 +807,6 @@ rule
799
807
  | assocs trailer
800
808
  {
801
809
  result = args [array_to_hash(val[0])]
802
- result[0] = :array # TODO: switch to args?
803
810
  }
804
811
 
805
812
  paren_args: tLPAREN2 opt_call_args rparen
@@ -964,6 +971,7 @@ rule
964
971
  | tLBRACK aref_args tRBRACK
965
972
  {
966
973
  result = val[1] || s(:array)
974
+ result[0] = :array # aref_args is :args
967
975
  }
968
976
  | tLBRACE assoc_list tRCURLY
969
977
  {
@@ -1077,7 +1085,6 @@ rule
1077
1085
  {
1078
1086
  self.comments.push self.lexer.comments
1079
1087
  if (self.in_def || self.in_single > 0) then
1080
- debug20 15
1081
1088
  yyerror "class definition in method body"
1082
1089
  end
1083
1090
  self.env.extend
@@ -1129,18 +1136,21 @@ rule
1129
1136
  }
1130
1137
  | kDEF fname
1131
1138
  {
1139
+ result = [lexer.lineno, self.in_def]
1140
+
1132
1141
  self.comments.push self.lexer.comments
1133
1142
  self.in_def = true
1134
1143
  self.env.extend
1135
- result = lexer.lineno
1136
1144
  }
1137
1145
  f_arglist bodystmt kEND
1138
1146
  {
1147
+ line, in_def = val[2]
1148
+
1139
1149
  result = new_defn val
1140
- result[2].line val[2]
1150
+ result[2].line line
1141
1151
 
1142
1152
  self.env.unextend
1143
- self.in_def = false
1153
+ self.in_def = in_def
1144
1154
  self.lexer.comments # we don't care about comments in the body
1145
1155
  }
1146
1156
  | kDEF singleton dot_or_colon
@@ -616,7 +616,11 @@ class RubyLexer
616
616
  t = Regexp.escape term
617
617
  x = Regexp.escape(paren) if paren && paren != "\000"
618
618
  re = if qwords then
619
- /[^#{t}#{x}\#\0\\\n\ ]+|./ # |. to pick up whatever
619
+ if RUBY19 then
620
+ /[^#{t}#{x}\#\0\\\s]+|./ # |. to pick up whatever
621
+ else
622
+ /[^#{t}#{x}\#\0\\\s\v]+|./ # argh. 1.8's \s doesn't pick up \v
623
+ end
620
624
  else
621
625
  /[^#{t}#{x}\#\0\\]+|./
622
626
  end
@@ -111,7 +111,7 @@ class RPStringScanner < StringScanner
111
111
  end
112
112
 
113
113
  module RubyParserStuff
114
- VERSION = "3.2.1" unless constants.include? "VERSION" # SIGH
114
+ VERSION = "3.2.2" unless constants.include? "VERSION" # SIGH
115
115
 
116
116
  attr_accessor :lexer, :in_def, :in_single, :file
117
117
  attr_reader :env, :comments
@@ -596,7 +596,7 @@ module RubyParserStuff
596
596
  # TODO: need a test with f(&b) { } to produce warning
597
597
 
598
598
  args ||= s(:arglist)
599
- args[0] = :arglist if [:array, :call_args].include? args.first
599
+ args[0] = :arglist if [:args, :array, :call_args].include? args.first
600
600
  args = s(:arglist, args) unless args.first == :arglist
601
601
 
602
602
  # HACK quick hack to make this work quickly... easy to clean up above
@@ -655,7 +655,7 @@ module RubyParserStuff
655
655
  end
656
656
 
657
657
  def new_defn val
658
- (_, line), name, args, body = val[0], val[1], val[3], val[4]
658
+ (_, line), name, _, args, body, * = val
659
659
  body ||= s(:nil)
660
660
 
661
661
  result = s(:defn, name.to_sym, args)
@@ -916,8 +916,7 @@ module RubyParserStuff
916
916
 
917
917
  args ||= s(:arglist)
918
918
 
919
- # TODO: I can prolly clean this up
920
- args[0] = :arglist if args.first == :array
919
+ args[0] = :arglist if [:call_args, :array].include?(args[0])
921
920
  args = s(:arglist, args) unless args.first == :arglist
922
921
 
923
922
  return s(:yield, *args[1..-1])
@@ -1075,7 +1074,9 @@ module RubyParserStuff
1075
1074
  raise SyntaxError, "block argument should not be given" if
1076
1075
  node[0] == :block_pass
1077
1076
 
1077
+ node[0] = :array if node[0] == :call_args
1078
1078
  node = node.last if node[0] == :array && node.size == 2
1079
+
1079
1080
  # HACK matz wraps ONE of the FOUR splats in a newline to
1080
1081
  # distinguish. I use paren for now. ugh
1081
1082
  node = s(:svalue, node) if node[0] == :splat and not node.paren
@@ -2231,14 +2231,6 @@ class TestRubyLexer < Minitest::Test
2231
2231
  :tSTRING_END, nil)
2232
2232
  end
2233
2233
 
2234
- def test_yylex_string_pct_w_tab
2235
- util_lex_token("%w[abc\tdef]",
2236
- :tQWORDS_BEG, "%w[",
2237
- :tSTRING_CONTENT, "abc\tdef",
2238
- :tSPACE, nil,
2239
- :tSTRING_END, nil)
2240
- end
2241
-
2242
2234
  def test_yylex_string_single
2243
2235
  util_lex_token("'string'",
2244
2236
  :tSTRING, "string")
@@ -2375,6 +2367,24 @@ class TestRubyLexer < Minitest::Test
2375
2367
  :tFLOAT, 0.0)
2376
2368
  end
2377
2369
 
2370
+ def test_pct_w_backslashes
2371
+ ["\t", "\n", "\r", "\v", "\f"].each do |char|
2372
+ next if !RubyLexer::RUBY19 and char == "\v"
2373
+
2374
+ assert_lex("%w[foo#{char}bar]",
2375
+ s(:array, s(:str, "foo"), s(:str, "bar")),
2376
+
2377
+ :tQWORDS_BEG, "%w[", :expr_beg, 0, 0,
2378
+ :tSTRING_CONTENT, "foo", :expr_beg, 0, 0,
2379
+ :tSPACE, nil, :expr_beg, 0, 0,
2380
+ :tSTRING_CONTENT, "bar", :expr_beg, 0, 0,
2381
+ :tSPACE, nil, :expr_beg, 0, 0,
2382
+ :tSTRING_END, nil, :expr_end, 0, 0)
2383
+ end
2384
+
2385
+ # flunk "Not yet"
2386
+ end
2387
+
2378
2388
  ############################################################
2379
2389
 
2380
2390
  def util_bad_token s, *args
@@ -1236,6 +1236,15 @@ module TestRubyParserShared
1236
1236
  assert_parse rb, pt
1237
1237
  end
1238
1238
 
1239
+ def test_aref_args_lit_assocs
1240
+ skip if ruby18
1241
+
1242
+ rb = "[1, 2 => 3]"
1243
+ pt = s(:array, s(:lit, 1), s(:hash, s(:lit, 2), s(:lit, 3)))
1244
+
1245
+ assert_parse rb, pt
1246
+ end
1247
+
1239
1248
  def test_BEGIN
1240
1249
  rb = "BEGIN { 42 }"
1241
1250
  pt = s(:iter, s(:preexe), s(:args), s(:lit, 42))
@@ -1429,6 +1438,13 @@ module TestRubyParserShared
1429
1438
 
1430
1439
  assert_parse rb, pt
1431
1440
  end
1441
+
1442
+ def test_fubar_nesting
1443
+ err = "class definition in method body"
1444
+
1445
+ assert_syntax_error "def a; class B; end; end", err
1446
+ assert_syntax_error "def a; def b; end; class B; end; end", err
1447
+ end
1432
1448
  end
1433
1449
 
1434
1450
  module TestRubyParserShared1920
@@ -1667,6 +1683,13 @@ module TestRubyParserShared1920
1667
1683
  assert_parse rb, pt
1668
1684
  end
1669
1685
 
1686
+ def test_method_call_trailing_comma
1687
+ rb = "a.f(1,)"
1688
+ pt = s(:call, s(:call, nil, :a), :f, s(:lit, 1))
1689
+
1690
+ assert_parse rb, pt
1691
+ end
1692
+
1670
1693
  def test_call_assoc_trailing_comma
1671
1694
  rb = "f(1=>2,)"
1672
1695
  pt = s(:call, nil, :f, s(:hash, s(:lit, 1), s(:lit, 2)))
@@ -1674,6 +1697,13 @@ module TestRubyParserShared1920
1674
1697
  assert_parse rb, pt
1675
1698
  end
1676
1699
 
1700
+ def test_method_call_assoc_trailing_comma
1701
+ rb = "a.f(1=>2,)"
1702
+ pt = s(:call, s(:call, nil, :a), :f, s(:hash, s(:lit, 1), s(:lit, 2)))
1703
+
1704
+ assert_parse rb, pt
1705
+ end
1706
+
1677
1707
  def test_call_args_assoc_trailing_comma
1678
1708
  rb = "f(1, 2=>3,)"
1679
1709
  pt = s(:call, nil, :f, s(:lit, 1), s(:hash, s(:lit, 2), s(:lit, 3)))
@@ -1695,6 +1725,80 @@ module TestRubyParserShared1920
1695
1725
  assert_parse rb, pt
1696
1726
  end
1697
1727
 
1728
+ def test_return_call_assocs
1729
+ rb = "return y(z:1)"
1730
+ pt = s(:return, s(:call, nil, :y, s(:hash, s(:lit, :z), s(:lit, 1))))
1731
+
1732
+ assert_parse rb, pt
1733
+
1734
+ rb = "return y z:1"
1735
+ pt = s(:return, s(:call, nil, :y, s(:hash, s(:lit, :z), s(:lit, 1))))
1736
+
1737
+ assert_parse rb, pt
1738
+
1739
+ rb = "return y(z=>1)"
1740
+ pt = s(:return, s(:call, nil, :y, s(:hash, s(:call, nil, :z), s(:lit, 1))))
1741
+
1742
+ assert_parse rb, pt
1743
+
1744
+ rb = "return y :z=>1"
1745
+ pt = s(:return, s(:call, nil, :y, s(:hash, s(:lit, :z), s(:lit, 1))))
1746
+
1747
+ assert_parse rb, pt
1748
+
1749
+ rb = "return 1, :z => 1"
1750
+ pt = s(:return,
1751
+ s(:array,
1752
+ s(:lit, 1),
1753
+ s(:hash, s(:lit, :z), s(:lit, 1))))
1754
+
1755
+ assert_parse rb, pt
1756
+
1757
+ rb = "return 1, :z => 1, :w => 2"
1758
+ pt = s(:return,
1759
+ s(:array,
1760
+ s(:lit, 1),
1761
+ s(:hash, s(:lit, :z), s(:lit, 1), s(:lit, :w), s(:lit, 2))))
1762
+
1763
+ assert_parse rb, pt
1764
+ end
1765
+
1766
+ def test_yield_call_assocs
1767
+ rb = "yield y(z:1)"
1768
+ pt = s(:yield, s(:call, nil, :y, s(:hash, s(:lit, :z), s(:lit, 1))))
1769
+
1770
+ assert_parse rb, pt
1771
+
1772
+ rb = "yield y z:1"
1773
+ pt = s(:yield, s(:call, nil, :y, s(:hash, s(:lit, :z), s(:lit, 1))))
1774
+
1775
+ assert_parse rb, pt
1776
+
1777
+ rb = "yield y(z=>1)"
1778
+ pt = s(:yield, s(:call, nil, :y, s(:hash, s(:call, nil, :z), s(:lit, 1))))
1779
+
1780
+ assert_parse rb, pt
1781
+
1782
+ rb = "yield y :z=>1"
1783
+ pt = s(:yield, s(:call, nil, :y, s(:hash, s(:lit, :z), s(:lit, 1))))
1784
+
1785
+ assert_parse rb, pt
1786
+
1787
+ rb = "yield 1, :z => 1"
1788
+ pt = s(:yield,
1789
+ s(:lit, 1),
1790
+ s(:hash, s(:lit, :z), s(:lit, 1)))
1791
+
1792
+ assert_parse rb, pt
1793
+
1794
+ rb = "yield 1, :z => 1, :w => 2"
1795
+ pt = s(:yield,
1796
+ s(:lit, 1),
1797
+ s(:hash, s(:lit, :z), s(:lit, 1), s(:lit, :w), s(:lit, 2)))
1798
+
1799
+ assert_parse rb, pt
1800
+ end
1801
+
1698
1802
  def test_call_assoc_new
1699
1803
  rb = "f(a:3)"
1700
1804
  pt = s(:call, nil, :f, s(:hash, s(:lit, :a), s(:lit, 3)))
@@ -1821,6 +1925,13 @@ module TestRubyParserShared1920
1821
1925
 
1822
1926
  assert_parse rb, pt
1823
1927
  end
1928
+
1929
+ def test_call_array_lit_inline_hash
1930
+ rb = "a([:b, :c => 1])"
1931
+ pt = s(:call, nil, :a, s(:array, s(:lit, :b), s(:hash, s(:lit, :c), s(:lit, 1))))
1932
+
1933
+ assert_parse rb, pt
1934
+ end
1824
1935
  end
1825
1936
 
1826
1937
  class TestRubyParser < Minitest::Test
@@ -2244,6 +2355,13 @@ class TestRuby19Parser < RubyParserTestCase
2244
2355
  assert_parse rb, pt
2245
2356
  end
2246
2357
 
2358
+ def test_parse_opt_call_args_lit_comma
2359
+ rb = "1[2,]"
2360
+ pt = s(:call, s(:lit, 1), :[], s(:lit, 2))
2361
+
2362
+ assert_parse rb, pt
2363
+ end
2364
+
2247
2365
  def test_bug_hash_args
2248
2366
  rb = "foo(:bar, baz: nil)"
2249
2367
  pt = s(:call, nil, :foo,
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_parser
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 11
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
8
  - 2
9
- - 1
10
- version: 3.2.1
9
+ - 2
10
+ version: 3.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ryan Davis
@@ -36,7 +36,7 @@ cert_chain:
36
36
  FBHgymkyj/AOSqKRIpXPhjC6
37
37
  -----END CERTIFICATE-----
38
38
 
39
- date: 2013-07-03 00:00:00 Z
39
+ date: 2013-07-12 00:00:00 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: sexp_processor
metadata.gz.sig CHANGED
Binary file