parser 2.4.0.2 → 2.5.0.0

Sign up to get free protection for your applications and to get access to all the features.
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