parser 2.5.1.0 → 2.5.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d4445244332537a2a91b8b6f6a2d35b750ffb1dbc3869c91f1a4de840a89600
4
- data.tar.gz: 800b3adeae6c64459f2b604c3c4b935eb728018bfe4136debae16c96df0384bf
3
+ metadata.gz: 74690ed0b42a0adf60b87ac491252301383d408f49c94b3ca57569f731bba610
4
+ data.tar.gz: bcfab73accb005126ca982eba28ceff93539f4f2b84523e1f31fe9d11f898808
5
5
  SHA512:
6
- metadata.gz: 99138e99f88e016a3da7cac3fe45c492068fe5fa5ecb6df640ade2f6890c05fdc2aff096d255e0fd57f75f4e5c3300c15f16fa9be177e9fdc56711c6e6ea29ac
7
- data.tar.gz: 71504873b9c22a3adfd0d0ee304e69e3317b93d52a7e2506c6225e2c768cea2ddd9bf1a874a04c8b0706047f78dc97f49b7841307f64198678f03a3336ad2675
6
+ metadata.gz: 4b84846a1eff219eb607276d2b21a3e9c3e08ffc527aa5eb221ae73712e3b3d461ede2b9fae72a995db4dc761d3dc438fd81f2b278bdf577a39a08b04ceb2364
7
+ data.tar.gz: 3a0febdb064269e6e0ef29e84d86f75c2b9b7ef2ab004e0fe25734d7a58ae947a2507eab90926c28a86cf9fb761c5882205633d25b37639c4807b4ee9bac9e7e
@@ -1,9 +1,21 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
- Not released (2018-04-12)
4
+ Not released (2018-07-10)
5
5
  -------------------------
6
6
 
7
+ Features implemented:
8
+ * ruby26.y: Endless ranges support. (Ilya Bylich)
9
+
10
+ Bugs fixed:
11
+ * lexer.rl: Fix parsing of 'm = -> *args do end'. (Ilya Bylich)
12
+ * AST::Processor: Properly recurse into "kwsplat" nodes (Nelson Elhage)
13
+ * ruby24, ruby25, ruby26: Fix cmdargs after command_args followed by tLBRACE_ARG. This commit tracks upstream commit ruby/ruby@f168dbd. (Ilya Bylich)
14
+ * lexer.rl: Fix parsing of `let (:a) { m do; end }`. (Ilya Bylich)
15
+
16
+ v2.5.1.0 (2018-04-12)
17
+ ---------------------
18
+
7
19
  API modifications:
8
20
  * Parser::Current: bump latest 2.2 branch to 2.2.10. (Ilya Bylich)
9
21
 
data/README.md CHANGED
@@ -217,7 +217,7 @@ at some point.
217
217
  Sometimes it is necessary to modify the format of AST nodes that are already being emitted
218
218
  in a way that would break existing applications. To avoid such breakage, applications
219
219
  must opt-in to these modifications; without explicit opt-in, Parser will continue to emit
220
- the old AST node format. The most recent set of opt-ins is speified in
220
+ the old AST node format. The most recent set of opt-ins is specified in
221
221
  the [usage section](#usage) of this README.
222
222
 
223
223
  ## Compatibility with Ruby MRI
@@ -322,6 +322,23 @@ Format:
322
322
  ~~~~~ expression
323
323
  ~~~
324
324
 
325
+
326
+ ### Endless (2.6)
327
+
328
+ Format:
329
+
330
+ ~~~
331
+ (irange (int 1) nil)
332
+ "1.."
333
+ ~~ operator
334
+ ~~~ expression
335
+
336
+ (erange (int 1) nil)
337
+ "1..."
338
+ ~~~ operator
339
+ ~~~~ expression
340
+ ~~~
341
+
325
342
  ## Access
326
343
 
327
344
  ### Self
@@ -1293,8 +1310,8 @@ Format:
1293
1310
  ~~~~~~ keyword
1294
1311
  ~~~~ begin
1295
1312
  ~~~~ else
1296
- ~~~ end
1297
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1313
+ ~~~ end
1314
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
1298
1315
 
1299
1316
  "unless cond; iftrue; else; iffalse; end"
1300
1317
  ~~~~~~ keyword
@@ -16,6 +16,7 @@ module Parser
16
16
  alias on_regexp process_regular_node
17
17
  alias on_xstr process_regular_node
18
18
  alias on_splat process_regular_node
19
+ alias on_kwsplat process_regular_node
19
20
  alias on_array process_regular_node
20
21
  alias on_pair process_regular_node
21
22
  alias on_hash process_regular_node
@@ -400,12 +400,12 @@ module Parser
400
400
 
401
401
  def range_inclusive(lhs, dot2_t, rhs)
402
402
  n(:irange, [ lhs, rhs ],
403
- binary_op_map(lhs, dot2_t, rhs))
403
+ range_map(lhs, dot2_t, rhs))
404
404
  end
405
405
 
406
406
  def range_exclusive(lhs, dot3_t, rhs)
407
407
  n(:erange, [ lhs, rhs ],
408
- binary_op_map(lhs, dot3_t, rhs))
408
+ range_map(lhs, dot3_t, rhs))
409
409
  end
410
410
 
411
411
  #
@@ -1388,6 +1388,16 @@ module Parser
1388
1388
  Source::Map::Operator.new(loc(op_t), expr_l)
1389
1389
  end
1390
1390
 
1391
+ def range_map(start_e, op_t, end_e)
1392
+ if end_e
1393
+ expr_l = join_exprs(start_e, end_e)
1394
+ else
1395
+ expr_l = start_e.loc.expression.join(loc(op_t))
1396
+ end
1397
+
1398
+ Source::Map::Operator.new(loc(op_t), expr_l)
1399
+ end
1400
+
1391
1401
  def arg_prefix_map(op_t, name_t=nil)
1392
1402
  if name_t.nil?
1393
1403
  expr_l = loc(op_t)
@@ -1628,7 +1628,7 @@ class Parser::Lexer
1628
1628
  else
1629
1629
  emit(:tLBRACE_ARG, '{'.freeze)
1630
1630
  end
1631
- fnext expr_value;
1631
+ fnext expr_value; fbreak;
1632
1632
  };
1633
1633
 
1634
1634
  'do'
@@ -2249,7 +2249,7 @@ class Parser::Lexer
2249
2249
  ( operator_arithmetic | operator_rest ) - ( '|' | '~' | '!' )
2250
2250
  => {
2251
2251
  emit_table(PUNCTUATION);
2252
- fnext expr_value; fbreak;
2252
+ fgoto expr_value;
2253
2253
  };
2254
2254
 
2255
2255
  ( e_lparen | '|' | '~' | '!' )
@@ -35,6 +35,10 @@ module Parser
35
35
  @stack[0] == 1
36
36
  end
37
37
 
38
+ def empty?
39
+ @stack == 0
40
+ end
41
+
38
42
  def to_s
39
43
  "[#{@stack.to_s(2)} <= #{@name}]"
40
44
  end
@@ -875,7 +875,20 @@ rule
875
875
  }
876
876
  call_args
877
877
  {
878
- @lexer.cmdarg.pop
878
+ # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer)
879
+ # but the push must be done after cmdarg.pop() in the parser.
880
+ # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG,
881
+ # cmdarg.pop() to pop 1 pushed by command_args,
882
+ # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG.
883
+ last_token = @last_token[0]
884
+ lookahead = last_token == :tLBRACE_ARG
885
+ if lookahead
886
+ top = @lexer.cmdarg.pop
887
+ @lexer.cmdarg.pop
888
+ @lexer.cmdarg.push(top)
889
+ else
890
+ @lexer.cmdarg.pop
891
+ end
879
892
 
880
893
  result = val[1]
881
894
  }
@@ -885,7 +885,20 @@ rule
885
885
  }
886
886
  call_args
887
887
  {
888
- @lexer.cmdarg.pop
888
+ # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer)
889
+ # but the push must be done after cmdarg.pop() in the parser.
890
+ # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG,
891
+ # cmdarg.pop() to pop 1 pushed by command_args,
892
+ # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG.
893
+ last_token = @last_token[0]
894
+ lookahead = last_token == :tLBRACE_ARG
895
+ if lookahead
896
+ top = @lexer.cmdarg.pop
897
+ @lexer.cmdarg.pop
898
+ @lexer.cmdarg.push(top)
899
+ else
900
+ @lexer.cmdarg.pop
901
+ end
889
902
 
890
903
  result = val[1]
891
904
  }
@@ -1504,7 +1517,7 @@ opt_block_args_tail:
1504
1517
  {
1505
1518
  @context.push(:lambda)
1506
1519
  }
1507
- bodystmt kEND
1520
+ compstmt kEND
1508
1521
  {
1509
1522
  result = [ val[0], val[2], val[3] ]
1510
1523
  @context.pop
@@ -665,6 +665,14 @@ rule
665
665
  {
666
666
  result = @builder.range_exclusive(val[0], val[1], val[2])
667
667
  }
668
+ | arg tDOT2
669
+ {
670
+ result = @builder.range_inclusive(val[0], val[1], nil)
671
+ }
672
+ | arg tDOT3
673
+ {
674
+ result = @builder.range_exclusive(val[0], val[1], nil)
675
+ }
668
676
  | arg tPLUS arg
669
677
  {
670
678
  result = @builder.binary_op(val[0], val[1], val[2])
@@ -885,7 +893,20 @@ rule
885
893
  }
886
894
  call_args
887
895
  {
888
- @lexer.cmdarg.pop
896
+ # call_args can be followed by tLBRACE_ARG (that does cmdarg.push(0) in the lexer)
897
+ # but the push must be done after cmdarg.pop() in the parser.
898
+ # So this code does cmdarg.pop() to pop 0 pushed by tLBRACE_ARG,
899
+ # cmdarg.pop() to pop 1 pushed by command_args,
900
+ # and cmdarg.push(0) to restore back the flag set by tLBRACE_ARG.
901
+ last_token = @last_token[0]
902
+ lookahead = last_token == :tLBRACE_ARG
903
+ if lookahead
904
+ top = @lexer.cmdarg.pop
905
+ @lexer.cmdarg.pop
906
+ @lexer.cmdarg.push(top)
907
+ else
908
+ @lexer.cmdarg.pop
909
+ end
889
910
 
890
911
  result = val[1]
891
912
  }
@@ -46,7 +46,7 @@ module Parser
46
46
  # magic encoding comment or UTF-8 BOM. `string` can be in any encoding.
47
47
  #
48
48
  # @param [String] string
49
- # @return [String|nil] encoding name, if recognized
49
+ # @return [String, nil] encoding name, if recognized
50
50
  #
51
51
  def self.recognize_encoding(string)
52
52
  return if string.empty?
@@ -24,8 +24,8 @@ module Parser
24
24
  # Associate `comments` with `ast` nodes by their corresponding node.
25
25
  #
26
26
  # @param [Parser::AST::Node] ast
27
- # @param [Array(Comment)] comments
28
- # @return [Hash(Parser::AST::Node, Array(Comment))]
27
+ # @param [Array<Comment>] comments
28
+ # @return [Hash<Parser::AST::Node, Array<Comment>>]
29
29
  # @see Parser::Source::Comment::Associator#associate
30
30
  # @deprecated Use {associate_locations}.
31
31
  #
@@ -39,8 +39,8 @@ module Parser
39
39
  # source.
40
40
  #
41
41
  # @param [Parser::AST::Node] ast
42
- # @param [Array(Comment)] comments
43
- # @return [Hash(Parser::Source::Map, Array(Comment))]
42
+ # @param [Array<Comment>] comments
43
+ # @return [Hash<Parser::Source::Map, Array<Comment>>]
44
44
  # @see Parser::Source::Comment::Associator#associate_locations
45
45
  #
46
46
  def self.associate_locations(ast, comments)
@@ -47,7 +47,7 @@ module Parser
47
47
 
48
48
  ##
49
49
  # @param [Parser::AST::Node] ast
50
- # @param [Array(Parser::Source::Comment)] comments
50
+ # @param [Array<Parser::Source::Comment>] comments
51
51
  def initialize(ast, comments)
52
52
  @ast = ast
53
53
  @comments = comments
@@ -85,7 +85,7 @@ module Parser
85
85
  # Note that {associate} produces unexpected result for nodes which are
86
86
  # equal but have distinct locations; comments for these nodes are merged.
87
87
  #
88
- # @return [Hash(Parser::AST::Node, Array(Parser::Source::Comment))]
88
+ # @return [Hash<Parser::AST::Node, Array<Parser::Source::Comment>>]
89
89
  # @deprecated Use {associate_locations}.
90
90
  #
91
91
  def associate
@@ -98,7 +98,7 @@ module Parser
98
98
  # the hash key, thus producing an unambiguous result even in presence
99
99
  # of equal nodes.
100
100
  #
101
- # @return [Hash(Parser::Source::Map, Array(Parser::Source::Comment))]
101
+ # @return [Hash<Parser::Source::Map, Array<Parser::Source::Comment>>]
102
102
  #
103
103
  def associate_locations
104
104
  @map_using_locations = true
@@ -161,7 +161,7 @@ module Parser
161
161
  # # :expression => #<Source::Range (string) 0...6>
162
162
  # # }
163
163
  #
164
- # @return [Hash(Symbol, Parser::Source::Range)]
164
+ # @return [Hash<Symbol, Parser::Source::Range>]
165
165
  #
166
166
  def to_hash
167
167
  instance_variables.inject({}) do |hash, ivar|
@@ -143,7 +143,7 @@ module Parser
143
143
  end
144
144
 
145
145
  ##
146
- # @return [Array(Integer)] a set of character indexes contained in this range.
146
+ # @return [Array<Integer>] a set of character indexes contained in this range.
147
147
  #
148
148
  def to_a
149
149
  (@begin_pos...@end_pos).to_a
@@ -133,8 +133,8 @@ module Parser
133
133
  # Inserts the given strings before and after the given range.
134
134
  #
135
135
  # @param [Range] range
136
- # @param [String or nil] insert_before
137
- # @param [String or nil] insert_after
136
+ # @param [String, nil] insert_before
137
+ # @param [String, nil] insert_after
138
138
  # @return [Rewriter] self
139
139
  # @raise [ClobberingError] when clobbering is detected
140
140
  #
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Parser
4
- VERSION = '2.5.1.0'
4
+ VERSION = '2.5.1.1'
5
5
  end
@@ -124,7 +124,7 @@ module ParseHelper
124
124
  assert_source_range(begin_pos, end_pos, range, version, line.inspect)
125
125
  end
126
126
 
127
- assert_equal parser.instance_eval { @lexer }.cmdarg.instance_eval { @stack }, 0,
127
+ assert parser.instance_eval { @lexer }.cmdarg.empty?,
128
128
  "(#{version}) expected cmdarg to be empty after parsing"
129
129
  end
130
130
 
@@ -833,6 +833,24 @@ class TestParser < Minitest::Test
833
833
  |~~~~~ expression})
834
834
  end
835
835
 
836
+ def test_range_endless
837
+ assert_parses(
838
+ s(:irange,
839
+ s(:int, 1), nil),
840
+ %q{1..},
841
+ %q{~~~ expression
842
+ | ~~ operator},
843
+ SINCE_2_6)
844
+
845
+ assert_parses(
846
+ s(:erange,
847
+ s(:int, 1), nil),
848
+ %q{1...},
849
+ %q{~~~~ expression
850
+ | ~~~ operator},
851
+ SINCE_2_6)
852
+ end
853
+
836
854
  #
837
855
  # Access
838
856
  #
@@ -6658,7 +6676,7 @@ class TestParser < Minitest::Test
6658
6676
  [:error, :unexpected_token, { :token => 'kRESCUE'}],
6659
6677
  %q{-> do rescue; end},
6660
6678
  %q{ ~~~~~~ location},
6661
- SINCE_1_9 - SINCE_2_5)
6679
+ SINCE_1_9 - SINCE_2_6)
6662
6680
 
6663
6681
  assert_parses(
6664
6682
  s(:block,
@@ -6668,7 +6686,7 @@ class TestParser < Minitest::Test
6668
6686
  s(:resbody, nil, nil, nil), nil)),
6669
6687
  %q{-> do rescue; end},
6670
6688
  %q{ ~~~~~~ keyword (rescue.resbody)},
6671
- SINCE_2_5)
6689
+ SINCE_2_6)
6672
6690
 
6673
6691
  assert_diagnoses(
6674
6692
  [:error, :unexpected_token, { :token => 'kRESCUE'}],
@@ -6965,4 +6983,46 @@ class TestParser < Minitest::Test
6965
6983
  %q{ ^ location},
6966
6984
  SINCE_2_2)
6967
6985
  end
6986
+
6987
+ def test_lbrace_arg_after_command_args
6988
+ assert_parses(
6989
+ s(:block,
6990
+ s(:send, nil, :let,
6991
+ s(:begin,
6992
+ s(:sym, :a))),
6993
+ s(:args),
6994
+ s(:block,
6995
+ s(:send, nil, :m),
6996
+ s(:args), nil)),
6997
+ %q{let (:a) { m do; end }},
6998
+ %q{},
6999
+ ALL_VERSIONS)
7000
+ end
7001
+
7002
+ def test_ruby_bug_14690
7003
+ assert_parses(
7004
+ s(:block,
7005
+ s(:send, nil, :let,
7006
+ s(:begin)),
7007
+ s(:args),
7008
+ s(:block,
7009
+ s(:send, nil, :m,
7010
+ s(:send, nil, :a)),
7011
+ s(:args), nil)),
7012
+ %q{let () { m(a) do; end }},
7013
+ %q{},
7014
+ SINCE_2_0)
7015
+ end
7016
+
7017
+ def test_parser_bug_507
7018
+ assert_parses(
7019
+ s(:lvasgn, :m,
7020
+ s(:block,
7021
+ s(:lambda),
7022
+ s(:args,
7023
+ s(:restarg, :args)), nil)),
7024
+ %q{m = -> *args do end},
7025
+ %q{},
7026
+ SINCE_1_9)
7027
+ end
6968
7028
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.5.1.0
4
+ version: 2.5.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - whitequark
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-12 00:00:00.000000000 Z
11
+ date: 2018-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ast