parser 2.5.1.0 → 2.5.1.1

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