parser 2.7.0.5 → 2.7.1.4

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