parser 2.4.0.2 → 2.5.0.0

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.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +5 -6
  3. data/CHANGELOG.md +35 -1
  4. data/Gemfile +2 -0
  5. data/README.md +1 -2
  6. data/Rakefile +2 -1
  7. data/bin/ruby-parse +2 -1
  8. data/bin/ruby-rewrite +2 -1
  9. data/lib/gauntlet_parser.rb +2 -0
  10. data/lib/parser.rb +16 -17
  11. data/lib/parser/all.rb +2 -0
  12. data/lib/parser/ast/node.rb +2 -0
  13. data/lib/parser/ast/processor.rb +2 -0
  14. data/lib/parser/base.rb +6 -12
  15. data/lib/parser/builders/default.rb +28 -47
  16. data/lib/parser/clobbering_error.rb +2 -0
  17. data/lib/parser/context.rb +42 -0
  18. data/lib/parser/current.rb +4 -20
  19. data/lib/parser/deprecation.rb +13 -0
  20. data/lib/parser/diagnostic.rb +3 -3
  21. data/lib/parser/diagnostic/engine.rb +2 -0
  22. data/lib/parser/lexer.rl +122 -60
  23. data/lib/parser/lexer/dedenter.rb +2 -0
  24. data/lib/parser/lexer/explanation.rb +2 -0
  25. data/lib/parser/lexer/literal.rb +4 -9
  26. data/lib/parser/lexer/stack_state.rb +4 -1
  27. data/lib/parser/macruby.y +32 -17
  28. data/lib/parser/messages.rb +14 -0
  29. data/lib/parser/meta.rb +2 -0
  30. data/lib/parser/rewriter.rb +30 -44
  31. data/lib/parser/ruby18.y +20 -13
  32. data/lib/parser/ruby19.y +32 -17
  33. data/lib/parser/ruby20.y +33 -18
  34. data/lib/parser/ruby21.y +32 -17
  35. data/lib/parser/ruby22.y +32 -17
  36. data/lib/parser/ruby23.y +32 -17
  37. data/lib/parser/ruby24.y +63 -46
  38. data/lib/parser/ruby25.y +72 -48
  39. data/lib/parser/rubymotion.y +33 -18
  40. data/lib/parser/runner.rb +4 -7
  41. data/lib/parser/runner/ruby_parse.rb +10 -0
  42. data/lib/parser/runner/ruby_rewrite.rb +2 -0
  43. data/lib/parser/source/buffer.rb +19 -24
  44. data/lib/parser/source/comment.rb +2 -0
  45. data/lib/parser/source/comment/associator.rb +2 -0
  46. data/lib/parser/source/map.rb +2 -0
  47. data/lib/parser/source/map/collection.rb +2 -0
  48. data/lib/parser/source/map/condition.rb +2 -0
  49. data/lib/parser/source/map/constant.rb +2 -0
  50. data/lib/parser/source/map/definition.rb +2 -0
  51. data/lib/parser/source/map/for.rb +2 -0
  52. data/lib/parser/source/map/heredoc.rb +2 -0
  53. data/lib/parser/source/map/keyword.rb +2 -0
  54. data/lib/parser/source/map/objc_kwarg.rb +2 -0
  55. data/lib/parser/source/map/operator.rb +2 -0
  56. data/lib/parser/source/map/rescue_body.rb +2 -0
  57. data/lib/parser/source/map/send.rb +2 -0
  58. data/lib/parser/source/map/ternary.rb +2 -0
  59. data/lib/parser/source/map/variable.rb +2 -0
  60. data/lib/parser/source/range.rb +81 -13
  61. data/lib/parser/source/rewriter.rb +48 -10
  62. data/lib/parser/source/rewriter/action.rb +2 -0
  63. data/lib/parser/source/tree_rewriter.rb +301 -0
  64. data/lib/parser/source/tree_rewriter/action.rb +133 -0
  65. data/lib/parser/static_environment.rb +2 -0
  66. data/lib/parser/syntax_error.rb +2 -0
  67. data/lib/parser/tree_rewriter.rb +133 -0
  68. data/lib/parser/version.rb +3 -1
  69. data/parser.gemspec +4 -1
  70. data/test/bug_163/fixtures/input.rb +2 -0
  71. data/test/bug_163/fixtures/output.rb +2 -0
  72. data/test/bug_163/rewriter.rb +2 -0
  73. data/test/helper.rb +7 -7
  74. data/test/parse_helper.rb +57 -10
  75. data/test/racc_coverage_helper.rb +2 -0
  76. data/test/test_base.rb +2 -0
  77. data/test/test_current.rb +2 -4
  78. data/test/test_diagnostic.rb +3 -1
  79. data/test/test_diagnostic_engine.rb +2 -0
  80. data/test/test_encoding.rb +61 -49
  81. data/test/test_lexer.rb +164 -77
  82. data/test/test_lexer_stack_state.rb +2 -0
  83. data/test/test_parse_helper.rb +8 -8
  84. data/test/test_parser.rb +613 -51
  85. data/test/test_runner_rewrite.rb +47 -0
  86. data/test/test_source_buffer.rb +22 -10
  87. data/test/test_source_comment.rb +2 -0
  88. data/test/test_source_comment_associator.rb +2 -0
  89. data/test/test_source_map.rb +2 -0
  90. data/test/test_source_range.rb +92 -45
  91. data/test/test_source_rewriter.rb +3 -1
  92. data/test/test_source_rewriter_action.rb +2 -0
  93. data/test/test_source_tree_rewriter.rb +177 -0
  94. data/test/test_static_environment.rb +2 -0
  95. data/test/using_tree_rewriter/fixtures/input.rb +3 -0
  96. data/test/using_tree_rewriter/fixtures/output.rb +3 -0
  97. data/test/using_tree_rewriter/using_tree_rewriter.rb +9 -0
  98. metadata +21 -10
  99. data/lib/parser/compatibility/ruby1_8.rb +0 -20
  100. data/lib/parser/compatibility/ruby1_9.rb +0 -32
  101. data/test/bug_163/test_runner_rewrite.rb +0 -35
@@ -283,9 +283,14 @@ rule
283
283
  nil, val[3], nil)
284
284
  }
285
285
 
286
- cmd_brace_block: tLBRACE_ARG brace_body tRCURLY
286
+ cmd_brace_block: tLBRACE_ARG
287
287
  {
288
- result = [ val[0], *val[1], val[2] ]
288
+ @context.push(:block)
289
+ }
290
+ brace_body tRCURLY
291
+ {
292
+ result = [ val[0], *val[2], val[3] ]
293
+ @context.pop
289
294
  }
290
295
 
291
296
  fcall: operation
@@ -342,7 +347,7 @@ rule
342
347
  result = @builder.keyword_cmd(:yield, val[0],
343
348
  nil, val[1], nil)
344
349
  }
345
- | kRETURN call_args
350
+ | k_return call_args
346
351
  {
347
352
  result = @builder.keyword_cmd(:return, val[0],
348
353
  nil, val[1], nil)
@@ -841,12 +846,11 @@ rule
841
846
  }
842
847
 
843
848
  command_args: {
844
- result = @lexer.cmdarg.dup
845
849
  @lexer.cmdarg.push(true)
846
850
  }
847
851
  call_args
848
852
  {
849
- @lexer.cmdarg = val[0]
853
+ @lexer.cmdarg.pop
850
854
 
851
855
  result = val[1]
852
856
  }
@@ -969,7 +973,7 @@ rule
969
973
  {
970
974
  result = @builder.associate(val[0], val[1], val[2])
971
975
  }
972
- | kRETURN
976
+ | k_return
973
977
  {
974
978
  result = @builder.keyword_cmd(:return, val[0])
975
979
  }
@@ -1095,10 +1099,11 @@ rule
1095
1099
  {
1096
1100
  @static_env.extend_static
1097
1101
  @lexer.push_cmdarg
1102
+ @context.push(:class)
1098
1103
  }
1099
1104
  bodystmt kEND
1100
1105
  {
1101
- if in_def?
1106
+ if @context.indirectly_in_def?
1102
1107
  diagnostic :error, :class_in_def, nil, val[0]
1103
1108
  end
1104
1109
 
@@ -1109,14 +1114,13 @@ rule
1109
1114
 
1110
1115
  @lexer.pop_cmdarg
1111
1116
  @static_env.unextend
1117
+ @context.pop
1112
1118
  }
1113
1119
  | kCLASS tLSHFT expr term
1114
1120
  {
1115
- result = @def_level
1116
- @def_level = 0
1117
-
1118
1121
  @static_env.extend_static
1119
1122
  @lexer.push_cmdarg
1123
+ @context.push(:sclass)
1120
1124
  }
1121
1125
  bodystmt kEND
1122
1126
  {
@@ -1125,8 +1129,7 @@ rule
1125
1129
 
1126
1130
  @lexer.pop_cmdarg
1127
1131
  @static_env.unextend
1128
-
1129
- @def_level = val[4]
1132
+ @context.pop
1130
1133
  }
1131
1134
  | kMODULE cpath
1132
1135
  {
@@ -1135,7 +1138,7 @@ rule
1135
1138
  }
1136
1139
  bodystmt kEND
1137
1140
  {
1138
- if in_def?
1141
+ if @context.indirectly_in_def?
1139
1142
  diagnostic :error, :module_in_def, nil, val[0]
1140
1143
  end
1141
1144
 
@@ -1147,9 +1150,9 @@ rule
1147
1150
  }
1148
1151
  | kDEF fname
1149
1152
  {
1150
- @def_level += 1
1151
1153
  @static_env.extend_static
1152
1154
  @lexer.push_cmdarg
1155
+ @context.push(:def)
1153
1156
  }
1154
1157
  f_arglist bodystmt kEND
1155
1158
  {
@@ -1158,7 +1161,7 @@ rule
1158
1161
 
1159
1162
  @lexer.pop_cmdarg
1160
1163
  @static_env.unextend
1161
- @def_level -= 1
1164
+ @context.pop
1162
1165
  }
1163
1166
  | kDEF singleton dot_or_colon
1164
1167
  {
@@ -1166,9 +1169,9 @@ rule
1166
1169
  }
1167
1170
  fname
1168
1171
  {
1169
- @def_level += 1
1170
1172
  @static_env.extend_static
1171
1173
  @lexer.push_cmdarg
1174
+ @context.push(:defs)
1172
1175
  }
1173
1176
  f_arglist bodystmt kEND
1174
1177
  {
@@ -1177,7 +1180,7 @@ rule
1177
1180
 
1178
1181
  @lexer.pop_cmdarg
1179
1182
  @static_env.unextend
1180
- @def_level -= 1
1183
+ @context.pop
1181
1184
  }
1182
1185
  | kBREAK
1183
1186
  {
@@ -1198,6 +1201,13 @@ rule
1198
1201
 
1199
1202
  primary_value: primary
1200
1203
 
1204
+ k_return: kRETURN
1205
+ {
1206
+ if @context.in_class?
1207
+ diagnostic :error, :invalid_return, nil, val[0]
1208
+ end
1209
+ }
1210
+
1201
1211
  then: term
1202
1212
  | kTHEN
1203
1213
  | term kTHEN
@@ -1454,13 +1464,11 @@ opt_block_args_tail:
1454
1464
  }
1455
1465
  f_larglist
1456
1466
  {
1457
- result = @lexer.cmdarg.dup
1458
- @lexer.cmdarg.clear
1467
+ @lexer.cmdarg.push(false)
1459
1468
  }
1460
1469
  lambda_body
1461
1470
  {
1462
- @lexer.cmdarg = val[2]
1463
- @lexer.cmdarg.lexpop
1471
+ @lexer.cmdarg.pop
1464
1472
 
1465
1473
  result = [ val[1], val[3] ]
1466
1474
 
@@ -1476,18 +1484,33 @@ opt_block_args_tail:
1476
1484
  result = @builder.args(nil, val[0], nil)
1477
1485
  }
1478
1486
 
1479
- lambda_body: tLAMBEG compstmt tRCURLY
1487
+ lambda_body: tLAMBEG
1488
+ {
1489
+ @context.push(:lambda)
1490
+ }
1491
+ compstmt tRCURLY
1492
+ {
1493
+ result = [ val[0], val[2], val[3] ]
1494
+ @context.pop
1495
+ }
1496
+ | kDO_LAMBDA
1480
1497
  {
1481
- result = [ val[0], val[1], val[2] ]
1498
+ @context.push(:lambda)
1482
1499
  }
1483
- | kDO_LAMBDA compstmt kEND
1500
+ compstmt kEND
1484
1501
  {
1485
- result = [ val[0], val[1], val[2] ]
1502
+ result = [ val[0], val[2], val[3] ]
1503
+ @context.pop
1486
1504
  }
1487
1505
 
1488
- do_block: kDO_BLOCK do_body kEND
1506
+ do_block: kDO_BLOCK
1507
+ {
1508
+ @context.push(:block)
1509
+ }
1510
+ do_body kEND
1489
1511
  {
1490
- result = [ val[0], *val[1], val[2] ]
1512
+ result = [ val[0], *val[2], val[3] ]
1513
+ @context.pop
1491
1514
  }
1492
1515
 
1493
1516
  block_call: command do_block
@@ -1571,29 +1594,33 @@ opt_block_args_tail:
1571
1594
  result = @builder.index(val[0], val[1], val[2], val[3])
1572
1595
  }
1573
1596
 
1574
- brace_block: tLCURLY brace_body tRCURLY
1597
+ brace_block: tLCURLY
1575
1598
  {
1576
- result = [ val[0], *val[1], val[2] ]
1599
+ @context.push(:block)
1577
1600
  }
1578
- | kDO do_body kEND
1601
+ brace_body tRCURLY
1579
1602
  {
1580
- result = [ val[0], *val[1], val[2] ]
1603
+ result = [ val[0], *val[2], val[3] ]
1604
+ @context.pop
1605
+ }
1606
+ | kDO
1607
+ {
1608
+ @context.push(:block)
1609
+ }
1610
+ do_body kEND
1611
+ {
1612
+ result = [ val[0], *val[2], val[3] ]
1613
+ @context.pop
1581
1614
  }
1582
1615
 
1583
1616
  brace_body: {
1584
1617
  @static_env.extend_dynamic
1585
1618
  }
1586
- {
1587
- result = @lexer.cmdarg.dup
1588
- @lexer.cmdarg.clear
1589
- }
1590
1619
  opt_block_param compstmt
1591
1620
  {
1592
- result = [ val[2], val[3] ]
1621
+ result = [ val[1], val[2] ]
1593
1622
 
1594
1623
  @static_env.unextend
1595
- @lexer.cmdarg = val[1]
1596
- @lexer.cmdarg.pop
1597
1624
  }
1598
1625
 
1599
1626
  do_body: {
@@ -1609,7 +1636,6 @@ opt_block_args_tail:
1609
1636
 
1610
1637
  @static_env.unextend
1611
1638
  @lexer.cmdarg = val[1]
1612
- @lexer.cmdarg.pop
1613
1639
  }
1614
1640
 
1615
1641
  case_body: kWHEN args then compstmt cases
@@ -1814,7 +1840,7 @@ regexp_contents: # nothing
1814
1840
  compstmt tSTRING_DEND
1815
1841
  {
1816
1842
  @lexer.cond.lexpop
1817
- @lexer.cmdarg.lexpop
1843
+ @lexer.cmdarg.pop
1818
1844
 
1819
1845
  result = @builder.begin(val[0], val[2], val[3])
1820
1846
  }
@@ -1836,13 +1862,13 @@ regexp_contents: # nothing
1836
1862
 
1837
1863
  symbol: tSYMBOL
1838
1864
  {
1839
- @lexer.state = :expr_endarg
1865
+ @lexer.state = :expr_end
1840
1866
  result = @builder.symbol(val[0])
1841
1867
  }
1842
1868
 
1843
1869
  dsym: tSYMBEG xstring_contents tSTRING_END
1844
1870
  {
1845
- @lexer.state = :expr_endarg
1871
+ @lexer.state = :expr_end
1846
1872
  result = @builder.symbol_compose(val[0], val[1], val[2])
1847
1873
  }
1848
1874
 
@@ -1862,22 +1888,22 @@ regexp_contents: # nothing
1862
1888
 
1863
1889
  simple_numeric: tINTEGER
1864
1890
  {
1865
- @lexer.state = :expr_endarg
1891
+ @lexer.state = :expr_end
1866
1892
  result = @builder.integer(val[0])
1867
1893
  }
1868
1894
  | tFLOAT
1869
1895
  {
1870
- @lexer.state = :expr_endarg
1896
+ @lexer.state = :expr_end
1871
1897
  result = @builder.float(val[0])
1872
1898
  }
1873
1899
  | tRATIONAL
1874
1900
  {
1875
- @lexer.state = :expr_endarg
1901
+ @lexer.state = :expr_end
1876
1902
  result = @builder.rational(val[0])
1877
1903
  }
1878
1904
  | tIMAGINARY
1879
1905
  {
1880
- @lexer.state = :expr_endarg
1906
+ @lexer.state = :expr_end
1881
1907
  result = @builder.complex(val[0])
1882
1908
  }
1883
1909
 
@@ -2349,8 +2375,6 @@ end
2349
2375
 
2350
2376
  require 'parser'
2351
2377
 
2352
- Parser.check_for_encoding_support
2353
-
2354
2378
  ---- inner
2355
2379
 
2356
2380
  def version
@@ -141,7 +141,7 @@ rule
141
141
  }
142
142
  | klBEGIN tLCURLY compstmt tRCURLY
143
143
  {
144
- if in_def?
144
+ if @context.indirectly_in_def?
145
145
  diagnostic :error, :begin_in_method, nil, val[0]
146
146
  end
147
147
 
@@ -265,12 +265,14 @@ rule
265
265
  cmd_brace_block: tLBRACE_ARG
266
266
  {
267
267
  @static_env.extend_dynamic
268
+ @context.push(:block)
268
269
  }
269
270
  opt_block_param compstmt tRCURLY
270
271
  {
271
272
  result = [ val[0], val[2], val[3], val[4] ]
272
273
 
273
274
  @static_env.unextend
275
+ @context.pop
274
276
  }
275
277
 
276
278
  command: operation command_args =tLOWEST
@@ -1098,10 +1100,11 @@ rule
1098
1100
  {
1099
1101
  @static_env.extend_static
1100
1102
  @lexer.push_cmdarg
1103
+ @context.push(:class)
1101
1104
  }
1102
1105
  bodystmt kEND
1103
1106
  {
1104
- if in_def?
1107
+ if @context.indirectly_in_def?
1105
1108
  diagnostic :error, :class_in_def, nil, val[0]
1106
1109
  end
1107
1110
 
@@ -1112,14 +1115,13 @@ rule
1112
1115
 
1113
1116
  @lexer.pop_cmdarg
1114
1117
  @static_env.unextend
1118
+ @context.pop
1115
1119
  }
1116
1120
  | kCLASS tLSHFT expr term
1117
1121
  {
1118
- result = @def_level
1119
- @def_level = 0
1120
-
1121
1122
  @static_env.extend_static
1122
1123
  @lexer.push_cmdarg
1124
+ @context.push(:sclass)
1123
1125
  }
1124
1126
  bodystmt kEND
1125
1127
  {
@@ -1128,8 +1130,7 @@ rule
1128
1130
 
1129
1131
  @lexer.pop_cmdarg
1130
1132
  @static_env.unextend
1131
-
1132
- @def_level = val[4]
1133
+ @context.pop
1133
1134
  }
1134
1135
  | kMODULE cpath
1135
1136
  {
@@ -1138,7 +1139,7 @@ rule
1138
1139
  }
1139
1140
  bodystmt kEND
1140
1141
  {
1141
- if in_def?
1142
+ if @context.indirectly_in_def?
1142
1143
  diagnostic :error, :module_in_def, nil, val[0]
1143
1144
  end
1144
1145
 
@@ -1150,9 +1151,9 @@ rule
1150
1151
  }
1151
1152
  | kDEF fname
1152
1153
  {
1153
- @def_level += 1
1154
1154
  @static_env.extend_static
1155
1155
  @lexer.push_cmdarg
1156
+ @context.push(:def)
1156
1157
  }
1157
1158
  f_arglist bodystmt kEND
1158
1159
  {
@@ -1161,7 +1162,7 @@ rule
1161
1162
 
1162
1163
  @lexer.pop_cmdarg
1163
1164
  @static_env.unextend
1164
- @def_level -= 1
1165
+ @context.pop
1165
1166
  }
1166
1167
  | kDEF singleton dot_or_colon
1167
1168
  {
@@ -1169,9 +1170,9 @@ rule
1169
1170
  }
1170
1171
  fname
1171
1172
  {
1172
- @def_level += 1
1173
1173
  @static_env.extend_static
1174
1174
  @lexer.push_cmdarg
1175
+ @context.push(:defs)
1175
1176
  }
1176
1177
  f_arglist bodystmt kEND
1177
1178
  {
@@ -1180,7 +1181,7 @@ rule
1180
1181
 
1181
1182
  @lexer.pop_cmdarg
1182
1183
  @static_env.unextend
1183
- @def_level -= 1
1184
+ @context.pop
1184
1185
  }
1185
1186
  | kBREAK
1186
1187
  {
@@ -1444,24 +1445,36 @@ rule
1444
1445
  result = @builder.args(nil, val[0].concat(val[1]), nil)
1445
1446
  }
1446
1447
 
1447
- lambda_body: tLAMBEG compstmt tRCURLY
1448
+ lambda_body: tLAMBEG
1449
+ {
1450
+ @context.push(:lambda)
1451
+ }
1452
+ compstmt tRCURLY
1448
1453
  {
1449
- result = [ val[0], val[1], val[2] ]
1454
+ result = [ val[0], val[2], val[3] ]
1455
+ @context.pop
1450
1456
  }
1451
- | kDO_LAMBDA compstmt kEND
1457
+ | kDO_LAMBDA
1452
1458
  {
1453
- result = [ val[0], val[1], val[2] ]
1459
+ @context.push(:lambda)
1460
+ }
1461
+ compstmt kEND
1462
+ {
1463
+ result = [ val[0], val[2], val[3] ]
1464
+ @context.pop
1454
1465
  }
1455
1466
 
1456
1467
  do_block: kDO_BLOCK
1457
1468
  {
1458
1469
  @static_env.extend_dynamic
1470
+ @context.push(:block)
1459
1471
  }
1460
1472
  opt_block_param compstmt kEND
1461
1473
  {
1462
1474
  result = [ val[0], val[2], val[3], val[4] ]
1463
1475
 
1464
1476
  @static_env.unextend
1477
+ @context.pop
1465
1478
  }
1466
1479
 
1467
1480
  block_call: command do_block
@@ -1535,22 +1548,26 @@ rule
1535
1548
  brace_block: tLCURLY
1536
1549
  {
1537
1550
  @static_env.extend_dynamic
1551
+ @context.push(:block)
1538
1552
  }
1539
1553
  opt_block_param compstmt tRCURLY
1540
1554
  {
1541
1555
  result = [ val[0], val[2], val[3], val[4] ]
1542
1556
 
1543
1557
  @static_env.unextend
1558
+ @context.pop
1544
1559
  }
1545
1560
  | kDO
1546
1561
  {
1547
1562
  @static_env.extend_dynamic
1563
+ @context.push(:block)
1548
1564
  }
1549
1565
  opt_block_param compstmt kEND
1550
1566
  {
1551
1567
  result = [ val[0], val[2], val[3], val[4] ]
1552
1568
 
1553
1569
  @static_env.unextend
1570
+ @context.pop
1554
1571
  }
1555
1572
 
1556
1573
  case_body: kWHEN args then compstmt cases
@@ -2154,8 +2171,6 @@ end
2154
2171
 
2155
2172
  require 'parser'
2156
2173
 
2157
- Parser.check_for_encoding_support
2158
-
2159
2174
  ---- inner
2160
2175
 
2161
2176
  def version