parser 2.7.0.5 → 2.7.1.4

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 (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +21 -32
  4. data/CHANGELOG.md +59 -1
  5. data/README.md +2 -2
  6. data/Rakefile +2 -1
  7. data/doc/AST_FORMAT.md +106 -3
  8. data/lib/parser.rb +1 -0
  9. data/lib/parser/all.rb +1 -0
  10. data/lib/parser/ast/processor.rb +9 -0
  11. data/lib/parser/builders/default.rb +103 -12
  12. data/lib/parser/context.rb +1 -0
  13. data/lib/parser/current.rb +13 -4
  14. data/lib/parser/diagnostic.rb +1 -1
  15. data/lib/parser/diagnostic/engine.rb +1 -2
  16. data/lib/parser/lexer.rl +15 -1
  17. data/lib/parser/macruby.y +14 -4
  18. data/lib/parser/messages.rb +15 -0
  19. data/lib/parser/meta.rb +4 -4
  20. data/lib/parser/ruby18.y +2 -0
  21. data/lib/parser/ruby19.y +14 -4
  22. data/lib/parser/ruby20.y +14 -4
  23. data/lib/parser/ruby21.y +9 -2
  24. data/lib/parser/ruby22.y +9 -2
  25. data/lib/parser/ruby23.y +9 -2
  26. data/lib/parser/ruby24.y +9 -2
  27. data/lib/parser/ruby25.y +9 -2
  28. data/lib/parser/ruby26.y +9 -2
  29. data/lib/parser/ruby27.y +28 -8
  30. data/lib/parser/ruby28.y +3043 -0
  31. data/lib/parser/rubymotion.y +14 -4
  32. data/lib/parser/runner.rb +26 -2
  33. data/lib/parser/runner/ruby_rewrite.rb +2 -2
  34. data/lib/parser/source/buffer.rb +3 -1
  35. data/lib/parser/source/comment/associator.rb +14 -4
  36. data/lib/parser/source/map/endless_definition.rb +23 -0
  37. data/lib/parser/source/range.rb +17 -1
  38. data/lib/parser/source/tree_rewriter.rb +115 -12
  39. data/lib/parser/source/tree_rewriter/action.rb +135 -26
  40. data/lib/parser/tree_rewriter.rb +1 -2
  41. data/lib/parser/version.rb +1 -1
  42. data/parser.gemspec +3 -2
  43. data/test/helper.rb +49 -6
  44. data/test/parse_helper.rb +27 -23
  45. data/test/test_ast_processor.rb +32 -0
  46. data/test/test_base.rb +1 -1
  47. data/test/test_current.rb +2 -0
  48. data/test/test_diagnostic.rb +6 -7
  49. data/test/test_diagnostic_engine.rb +5 -8
  50. data/test/test_lexer.rb +17 -8
  51. data/test/test_meta.rb +12 -0
  52. data/test/test_parser.rb +477 -54
  53. data/test/test_runner_parse.rb +22 -1
  54. data/test/test_runner_rewrite.rb +1 -1
  55. data/test/test_source_buffer.rb +4 -1
  56. data/test/test_source_comment.rb +2 -2
  57. data/test/test_source_comment_associator.rb +47 -15
  58. data/test/test_source_map.rb +1 -2
  59. data/test/test_source_range.rb +29 -9
  60. data/test/test_source_rewriter.rb +4 -4
  61. data/test/test_source_rewriter_action.rb +2 -2
  62. data/test/test_source_tree_rewriter.rb +201 -13
  63. metadata +19 -12
@@ -5,6 +5,7 @@ module Parser
5
5
  #
6
6
  # Supported states:
7
7
  # + :class - in the class body (class A; end)
8
+ # + :module - in the module body (module M; end)
8
9
  # + :sclass - in the singleton class body (class << obj; end)
9
10
  # + :def - in the method body (def m; end)
10
11
  # + :defs - in the singleton method body (def self.m; end)
@@ -48,7 +48,7 @@ module Parser
48
48
  CurrentRuby = Ruby23
49
49
 
50
50
  when /^2\.4\./
51
- current_version = '2.4.9'
51
+ current_version = '2.4.10'
52
52
  if RUBY_VERSION != current_version
53
53
  warn_syntax_deviation 'parser/ruby24', current_version
54
54
  end
@@ -57,7 +57,7 @@ module Parser
57
57
  CurrentRuby = Ruby24
58
58
 
59
59
  when /^2\.5\./
60
- current_version = '2.5.7'
60
+ current_version = '2.5.8'
61
61
  if RUBY_VERSION != current_version
62
62
  warn_syntax_deviation 'parser/ruby25', current_version
63
63
  end
@@ -66,7 +66,7 @@ module Parser
66
66
  CurrentRuby = Ruby25
67
67
 
68
68
  when /^2\.6\./
69
- current_version = '2.6.5'
69
+ current_version = '2.6.6'
70
70
  if RUBY_VERSION != current_version
71
71
  warn_syntax_deviation 'parser/ruby26', current_version
72
72
  end
@@ -75,7 +75,7 @@ module Parser
75
75
  CurrentRuby = Ruby26
76
76
 
77
77
  when /^2\.7\./
78
- current_version = '2.7.0'
78
+ current_version = '2.7.1'
79
79
  if RUBY_VERSION != current_version
80
80
  warn_syntax_deviation 'parser/ruby27', current_version
81
81
  end
@@ -83,6 +83,15 @@ module Parser
83
83
  require 'parser/ruby27'
84
84
  CurrentRuby = Ruby27
85
85
 
86
+ when /^2\.8\./
87
+ current_version = '2.8.0-dev'
88
+ if RUBY_VERSION != current_version
89
+ warn_syntax_deviation 'parser/ruby28', current_version
90
+ end
91
+
92
+ require 'parser/ruby28'
93
+ CurrentRuby = Ruby28
94
+
86
95
  else # :nocov:
87
96
  # Keep this in sync with released Ruby.
88
97
  warn_syntax_deviation 'parser/ruby27', '2.7.x'
@@ -67,7 +67,7 @@ module Parser
67
67
  # @return [String] the rendered message.
68
68
  #
69
69
  def message
70
- MESSAGES[@reason] % @arguments
70
+ Messages.compile(@reason, @arguments)
71
71
  end
72
72
 
73
73
  ##
@@ -7,8 +7,7 @@ module Parser
7
7
  # diagnostics by delegating them to registered consumers.
8
8
  #
9
9
  # @example
10
- # buffer = Parser::Source::Buffer.new(__FILE__)
11
- # buffer.code = 'foobar'
10
+ # buffer = Parser::Source::Buffer.new(__FILE__, source: 'foobar')
12
11
  #
13
12
  # consumer = lambda do |diagnostic|
14
13
  # puts diagnostic.message
@@ -283,6 +283,13 @@ class Parser::Lexer
283
283
  %% write exec;
284
284
  # %
285
285
 
286
+ # Ragel creates a local variable called `testEof` but it doesn't use
287
+ # it in any assignment. This dead code is here to swallow the warning.
288
+ # It has no runtime cost because Ruby doesn't produce any instructions from it.
289
+ if false
290
+ testEof
291
+ end
292
+
286
293
  @p = p
287
294
 
288
295
  if @token_queue.any?
@@ -2023,7 +2030,14 @@ class Parser::Lexer
2023
2030
 
2024
2031
  '...'
2025
2032
  => {
2026
- if @version >= 27
2033
+ if @version >= 28
2034
+ if @lambda_stack.any? && @lambda_stack.last + 1 == @paren_nest
2035
+ # To reject `->(...)` like `->...`
2036
+ emit(:tDOT3)
2037
+ else
2038
+ emit(:tBDOT3)
2039
+ end
2040
+ elsif @version >= 27
2027
2041
  emit(:tBDOT3)
2028
2042
  else
2029
2043
  emit(:tDOT3)
@@ -1042,11 +1042,15 @@ rule
1042
1042
  result = @builder.block(val[0],
1043
1043
  begin_t, args, body, end_t)
1044
1044
  }
1045
- | tLAMBDA lambda
1045
+ | tLAMBDA
1046
+ {
1047
+ @context.push(:lambda)
1048
+ }
1049
+ lambda
1046
1050
  {
1047
1051
  lambda_call = @builder.call_lambda(val[0])
1048
1052
 
1049
- args, (begin_t, body, end_t) = val[1]
1053
+ args, (begin_t, body, end_t) = val[2]
1050
1054
  result = @builder.block(lambda_call,
1051
1055
  begin_t, args, body, end_t)
1052
1056
  }
@@ -1160,6 +1164,7 @@ rule
1160
1164
  {
1161
1165
  @static_env.extend_static
1162
1166
  @lexer.push_cmdarg
1167
+ @context.push(:module)
1163
1168
  }
1164
1169
  bodystmt kEND
1165
1170
  {
@@ -1172,6 +1177,7 @@ rule
1172
1177
 
1173
1178
  @lexer.pop_cmdarg
1174
1179
  @static_env.unextend
1180
+ @context.pop
1175
1181
  }
1176
1182
  | kDEF fname
1177
1183
  {
@@ -1453,9 +1459,13 @@ rule
1453
1459
  lambda: {
1454
1460
  @static_env.extend_dynamic
1455
1461
  }
1456
- f_larglist lambda_body
1462
+ f_larglist
1463
+ {
1464
+ @context.pop
1465
+ }
1466
+ lambda_body
1457
1467
  {
1458
- result = [ val[1], val[2] ]
1468
+ result = [ val[1], val[3] ]
1459
1469
 
1460
1470
  @static_env.unextend
1461
1471
  }
@@ -93,4 +93,19 @@ module Parser
93
93
  :crossing_insertions => 'the rewriting action on:',
94
94
  :crossing_insertions_conflict => 'is crossing that on:',
95
95
  }.freeze
96
+
97
+ # @api private
98
+ module Messages
99
+ # Formats the message, returns a raw template if there's nothing to interpolate
100
+ #
101
+ # Code like `format("", {})` gives a warning, and so this method tries interpolating
102
+ # only if `arguments` hash is not empty.
103
+ #
104
+ # @api private
105
+ def self.compile(reason, arguments)
106
+ template = MESSAGES[reason]
107
+ return template if Hash === arguments && arguments.empty?
108
+ format(template, arguments)
109
+ end
110
+ end
96
111
  end
@@ -12,11 +12,11 @@ module Parser
12
12
  sym dsym xstr regopt regexp array splat
13
13
  pair kwsplat hash irange erange self
14
14
  lvar ivar cvar gvar const defined? lvasgn
15
- ivasgn cvasgn gvasgn casgn mlhs masgn
15
+ ivasgn cvasgn gvasgn casgn mlhs masgn rasgn mrasgn
16
16
  op_asgn and_asgn ensure rescue arg_expr
17
17
  or_asgn back_ref nth_ref
18
18
  match_with_lvasgn match_current_line
19
- module class sclass def defs undef alias args
19
+ module class sclass def defs def_e defs_e undef alias args
20
20
  cbase arg optarg restarg blockarg block_pass kwarg kwoptarg
21
21
  kwrestarg kwnilarg send csend super zsuper yield block
22
22
  and not or if when case while until while_post
@@ -26,12 +26,12 @@ module Parser
26
26
  ident root lambda indexasgn index procarg0
27
27
  restarg_expr blockarg_expr
28
28
  objc_kwarg objc_restarg objc_varargs
29
- numargs numblock forward_args forwarded_args
29
+ numargs numblock forward_args forwarded_args forward_arg
30
30
  case_match in_match in_pattern
31
31
  match_var pin match_alt match_as match_rest
32
32
  array_pattern match_with_trailing_comma array_pattern_with_tail
33
33
  hash_pattern const_pattern if_guard unless_guard match_nil_pattern
34
- empty_else
34
+ empty_else find_pattern
35
35
  ).map(&:to_sym).to_set.freeze
36
36
 
37
37
  end # Meta
@@ -1156,6 +1156,7 @@ rule
1156
1156
  | kMODULE cpath
1157
1157
  {
1158
1158
  @static_env.extend_static
1159
+ @context.push(:module)
1159
1160
  }
1160
1161
  bodystmt kEND
1161
1162
  {
@@ -1167,6 +1168,7 @@ rule
1167
1168
  val[3], val[4])
1168
1169
 
1169
1170
  @static_env.unextend
1171
+ @context.pop
1170
1172
  }
1171
1173
  | kDEF fname
1172
1174
  {
@@ -1009,11 +1009,15 @@ rule
1009
1009
  result = @builder.block(val[0],
1010
1010
  begin_t, args, body, end_t)
1011
1011
  }
1012
- | tLAMBDA lambda
1012
+ | tLAMBDA
1013
+ {
1014
+ @context.push(:lambda)
1015
+ }
1016
+ lambda
1013
1017
  {
1014
1018
  lambda_call = @builder.call_lambda(val[0])
1015
1019
 
1016
- args, (begin_t, body, end_t) = val[1]
1020
+ args, (begin_t, body, end_t) = val[2]
1017
1021
  result = @builder.block(lambda_call,
1018
1022
  begin_t, args, body, end_t)
1019
1023
  }
@@ -1127,6 +1131,7 @@ rule
1127
1131
  {
1128
1132
  @static_env.extend_static
1129
1133
  @lexer.push_cmdarg
1134
+ @context.push(:module)
1130
1135
  }
1131
1136
  bodystmt kEND
1132
1137
  {
@@ -1139,6 +1144,7 @@ rule
1139
1144
 
1140
1145
  @lexer.pop_cmdarg
1141
1146
  @static_env.unextend
1147
+ @context.pop
1142
1148
  }
1143
1149
  | kDEF fname
1144
1150
  {
@@ -1433,9 +1439,13 @@ rule
1433
1439
  lambda: {
1434
1440
  @static_env.extend_dynamic
1435
1441
  }
1436
- f_larglist lambda_body
1442
+ f_larglist
1443
+ {
1444
+ @context.pop
1445
+ }
1446
+ lambda_body
1437
1447
  {
1438
- result = [ val[1], val[2] ]
1448
+ result = [ val[1], val[3] ]
1439
1449
 
1440
1450
  @static_env.unextend
1441
1451
  }
@@ -1039,11 +1039,15 @@ rule
1039
1039
  result = @builder.block(val[0],
1040
1040
  begin_t, args, body, end_t)
1041
1041
  }
1042
- | tLAMBDA lambda
1042
+ | tLAMBDA
1043
+ {
1044
+ @context.push(:lambda)
1045
+ }
1046
+ lambda
1043
1047
  {
1044
1048
  lambda_call = @builder.call_lambda(val[0])
1045
1049
 
1046
- args, (begin_t, body, end_t) = val[1]
1050
+ args, (begin_t, body, end_t) = val[2]
1047
1051
  result = @builder.block(lambda_call,
1048
1052
  begin_t, args, body, end_t)
1049
1053
  }
@@ -1157,6 +1161,7 @@ rule
1157
1161
  {
1158
1162
  @static_env.extend_static
1159
1163
  @lexer.push_cmdarg
1164
+ @context.push(:module)
1160
1165
  }
1161
1166
  bodystmt kEND
1162
1167
  {
@@ -1169,6 +1174,7 @@ rule
1169
1174
 
1170
1175
  @lexer.pop_cmdarg
1171
1176
  @static_env.unextend
1177
+ @context.pop
1172
1178
  }
1173
1179
  | kDEF fname
1174
1180
  {
@@ -1487,9 +1493,13 @@ opt_block_args_tail:
1487
1493
  lambda: {
1488
1494
  @static_env.extend_dynamic
1489
1495
  }
1490
- f_larglist lambda_body
1496
+ f_larglist
1497
+ {
1498
+ @context.pop
1499
+ }
1500
+ lambda_body
1491
1501
  {
1492
- result = [ val[1], val[2] ]
1502
+ result = [ val[1], val[3] ]
1493
1503
 
1494
1504
  @static_env.unextend
1495
1505
  }
@@ -1029,11 +1029,15 @@ rule
1029
1029
  result = @builder.block(val[0],
1030
1030
  begin_t, args, body, end_t)
1031
1031
  }
1032
- | tLAMBDA lambda
1032
+ | tLAMBDA
1033
+ {
1034
+ @context.push(:lambda)
1035
+ }
1036
+ lambda
1033
1037
  {
1034
1038
  lambda_call = @builder.call_lambda(val[0])
1035
1039
 
1036
- args, (begin_t, body, end_t) = val[1]
1040
+ args, (begin_t, body, end_t) = val[2]
1037
1041
  result = @builder.block(lambda_call,
1038
1042
  begin_t, args, body, end_t)
1039
1043
  }
@@ -1147,6 +1151,7 @@ rule
1147
1151
  {
1148
1152
  @static_env.extend_static
1149
1153
  @lexer.push_cmdarg
1154
+ @context.push(:module)
1150
1155
  }
1151
1156
  bodystmt kEND
1152
1157
  {
@@ -1159,6 +1164,7 @@ rule
1159
1164
 
1160
1165
  @lexer.pop_cmdarg
1161
1166
  @static_env.unextend
1167
+ @context.pop
1162
1168
  }
1163
1169
  | kDEF fname
1164
1170
  {
@@ -1471,6 +1477,7 @@ opt_block_args_tail:
1471
1477
  {
1472
1478
  result = @lexer.cmdarg.dup
1473
1479
  @lexer.cmdarg.clear
1480
+ @context.pop
1474
1481
  }
1475
1482
  lambda_body
1476
1483
  {
@@ -1028,11 +1028,15 @@ rule
1028
1028
  result = @builder.block(val[0],
1029
1029
  begin_t, args, body, end_t)
1030
1030
  }
1031
- | tLAMBDA lambda
1031
+ | tLAMBDA
1032
+ {
1033
+ @context.push(:lambda)
1034
+ }
1035
+ lambda
1032
1036
  {
1033
1037
  lambda_call = @builder.call_lambda(val[0])
1034
1038
 
1035
- args, (begin_t, body, end_t) = val[1]
1039
+ args, (begin_t, body, end_t) = val[2]
1036
1040
  result = @builder.block(lambda_call,
1037
1041
  begin_t, args, body, end_t)
1038
1042
  }
@@ -1146,6 +1150,7 @@ rule
1146
1150
  {
1147
1151
  @static_env.extend_static
1148
1152
  @lexer.push_cmdarg
1153
+ @context.push(:module)
1149
1154
  }
1150
1155
  bodystmt kEND
1151
1156
  {
@@ -1158,6 +1163,7 @@ rule
1158
1163
 
1159
1164
  @lexer.pop_cmdarg
1160
1165
  @static_env.unextend
1166
+ @context.pop
1161
1167
  }
1162
1168
  | kDEF fname
1163
1169
  {
@@ -1470,6 +1476,7 @@ opt_block_args_tail:
1470
1476
  {
1471
1477
  result = @lexer.cmdarg.dup
1472
1478
  @lexer.cmdarg.clear
1479
+ @context.pop
1473
1480
  }
1474
1481
  lambda_body
1475
1482
  {
@@ -1028,11 +1028,15 @@ rule
1028
1028
  result = @builder.block(val[0],
1029
1029
  begin_t, args, body, end_t)
1030
1030
  }
1031
- | tLAMBDA lambda
1031
+ | tLAMBDA
1032
+ {
1033
+ @context.push(:lambda)
1034
+ }
1035
+ lambda
1032
1036
  {
1033
1037
  lambda_call = @builder.call_lambda(val[0])
1034
1038
 
1035
- args, (begin_t, body, end_t) = val[1]
1039
+ args, (begin_t, body, end_t) = val[2]
1036
1040
  result = @builder.block(lambda_call,
1037
1041
  begin_t, args, body, end_t)
1038
1042
  }
@@ -1146,6 +1150,7 @@ rule
1146
1150
  {
1147
1151
  @static_env.extend_static
1148
1152
  @lexer.push_cmdarg
1153
+ @context.push(:module)
1149
1154
  }
1150
1155
  bodystmt kEND
1151
1156
  {
@@ -1158,6 +1163,7 @@ rule
1158
1163
 
1159
1164
  @lexer.pop_cmdarg
1160
1165
  @static_env.unextend
1166
+ @context.pop
1161
1167
  }
1162
1168
  | kDEF fname
1163
1169
  {
@@ -1470,6 +1476,7 @@ opt_block_args_tail:
1470
1476
  {
1471
1477
  result = @lexer.cmdarg.dup
1472
1478
  @lexer.cmdarg.clear
1479
+ @context.pop
1473
1480
  }
1474
1481
  lambda_body
1475
1482
  {
@@ -1047,11 +1047,15 @@ rule
1047
1047
  result = @builder.block(val[0],
1048
1048
  begin_t, args, body, end_t)
1049
1049
  }
1050
- | tLAMBDA lambda
1050
+ | tLAMBDA
1051
+ {
1052
+ @context.push(:lambda)
1053
+ }
1054
+ lambda
1051
1055
  {
1052
1056
  lambda_call = @builder.call_lambda(val[0])
1053
1057
 
1054
- args, (begin_t, body, end_t) = val[1]
1058
+ args, (begin_t, body, end_t) = val[2]
1055
1059
  result = @builder.block(lambda_call,
1056
1060
  begin_t, args, body, end_t)
1057
1061
  }
@@ -1165,6 +1169,7 @@ rule
1165
1169
  {
1166
1170
  @static_env.extend_static
1167
1171
  @lexer.cmdarg.push(false)
1172
+ @context.push(:module)
1168
1173
  }
1169
1174
  bodystmt kEND
1170
1175
  {
@@ -1177,6 +1182,7 @@ rule
1177
1182
 
1178
1183
  @lexer.cmdarg.pop
1179
1184
  @static_env.unextend
1185
+ @context.pop
1180
1186
  }
1181
1187
  | kDEF fname
1182
1188
  {
@@ -1487,6 +1493,7 @@ opt_block_args_tail:
1487
1493
  }
1488
1494
  f_larglist
1489
1495
  {
1496
+ @context.pop
1490
1497
  @lexer.cmdarg.push(false)
1491
1498
  }
1492
1499
  lambda_body