ruby_parser 3.0.0.a4 → 3.0.0.a5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ruby_parser might be problematic. Click here for more details.

data.tar.gz.sig CHANGED
Binary file
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ === 3.0.0.a5 / 2012-07-31
2
+
3
+ * 5 bug fixes:
4
+
5
+ * 1.9: Fix construction of 'f(:x, y: nil,)' w/ trailing comma.
6
+ * 1.9: cleaned up lexing exit lex_state handling. Fixes bug parsing 'if f :x; end'
7
+ * 1.9: fixed building of right-leaning masgns: 'f { |a, (b, c)| }'
8
+ * 1.9: fixed lexing 'when *splat'
9
+ * 1.9: fixed lexing of regexps in whens
10
+
1
11
  === 3.0.0.a4 / 2012-07-26
2
12
 
3
13
  * 10 minor enhancements:
@@ -42,7 +42,9 @@ ARGV.replace ARGV.map { |path|
42
42
  else
43
43
  path
44
44
  end
45
- }.flatten
45
+ }.flatten.reject { |f|
46
+ f =~ /bad_ruby_file/ # I have intentionally bad code in my test dirs
47
+ }
46
48
 
47
49
  parser = Ruby19Parser.new
48
50
 
data/lib/ruby19_parser.rb CHANGED
@@ -4315,8 +4315,7 @@ def _reduce_250(val, _values, result)
4315
4315
  end
4316
4316
 
4317
4317
  def _reduce_251(val, _values, result)
4318
- warning "parenthesize argument(s) for future version"
4319
- result = val[0].add val[2]
4318
+ result = val[0] << s(:hash, *val[2][1..-1])
4320
4319
 
4321
4320
  result
4322
4321
  end
@@ -5868,7 +5867,7 @@ def _reduce_526(val, _values, result)
5868
5867
  end
5869
5868
 
5870
5869
  def _reduce_527(val, _values, result)
5871
- val[0] << val[2].to_sym
5870
+ val[0] << val[2]
5872
5871
  result = val[0]
5873
5872
 
5874
5873
  result
data/lib/ruby19_parser.y CHANGED
@@ -809,8 +809,7 @@ rule
809
809
  }
810
810
  | args tCOMMA assocs tCOMMA
811
811
  {
812
- warning "parenthesize argument(s) for future version"
813
- result = val[0].add val[2]
812
+ result = val[0] << s(:hash, *val[2][1..-1])
814
813
  }
815
814
  | assocs tCOMMA
816
815
  {
@@ -1909,7 +1908,7 @@ keyword_variable: kNIL { result = s(:nil) }
1909
1908
  }
1910
1909
  | f_arg tCOMMA f_arg_item
1911
1910
  {
1912
- val[0] << val[2].to_sym
1911
+ val[0] << val[2]
1913
1912
  result = val[0]
1914
1913
  }
1915
1914
 
data/lib/ruby_lexer.rb CHANGED
@@ -239,7 +239,7 @@ class RubyLexer
239
239
  end
240
240
 
241
241
  def lex_state= o
242
- # warn "wtf lex_state = #{o.inspect}"
242
+ # warn "wtf lex_state = #{o.inspect} from #{caller.first}"
243
243
  raise "wtf\?" unless Symbol === o
244
244
  @lex_state = o
245
245
  end
@@ -485,6 +485,10 @@ class RubyLexer
485
485
  Ruby18Parser === parser
486
486
  end
487
487
 
488
+ def ruby19
489
+ Ruby19Parser === parser
490
+ end
491
+
488
492
  def src= src
489
493
  raise "bad src: #{src.inspect}" unless String === src
490
494
  @src = RPStringScanner.new(src)
@@ -769,15 +773,16 @@ class RubyLexer
769
773
  self.lex_state = :expr_dot
770
774
  self.yacc_value = "::"
771
775
  return :tCOLON2
772
- elsif lex_state != :expr_end && lex_state != :expr_endarg && src.scan(/:([a-zA-Z_]\w*(?:[?!]|=(?!>))?)/) then
776
+ elsif ! is_end? && src.scan(/:([a-zA-Z_]\w*(?:[?!]|=(?!>))?)/) then
777
+ # scanning shortcut to symbols
773
778
  self.yacc_value = src[1]
774
779
  self.lex_state = :expr_end
775
780
  return :tSYMBOL
776
781
  elsif src.scan(/\:/) then
777
782
  # ?: / then / when
778
- if (lex_state == :expr_end || lex_state == :expr_endarg||
779
- src.check(/\s/)) then
783
+ if is_end? || src.check(/\s/) then
780
784
  self.lex_state = :expr_beg
785
+ # TODO warn_balanced(":", "symbol literal");
781
786
  self.yacc_value = ":"
782
787
  return :tCOLON
783
788
  end
@@ -933,7 +938,7 @@ class RubyLexer
933
938
  result = if lex_state.is_argument && space_seen && src.check(/\S/) then
934
939
  warning("`*' interpreted as argument prefix")
935
940
  :tSTAR
936
- elsif lex_state == :expr_beg || lex_state == :expr_mid then
941
+ elsif is_beg? then
937
942
  :tSTAR
938
943
  else
939
944
  :tSTAR2
@@ -1091,7 +1096,7 @@ class RubyLexer
1091
1096
  return result
1092
1097
  end
1093
1098
  elsif src.scan(/\//) then
1094
- if lex_state == :expr_beg || lex_state == :expr_mid then
1099
+ if is_beg? then
1095
1100
  self.lex_strterm = [:strterm, STR_REGEXP, '/', "\0"]
1096
1101
  self.yacc_value = "/"
1097
1102
  return :tREGEXP_BEG
@@ -1394,17 +1399,19 @@ class RubyLexer
1394
1399
  end
1395
1400
  end
1396
1401
 
1397
- if (lex_state == :expr_beg || lex_state == :expr_mid ||
1398
- lex_state == :expr_dot || lex_state == :expr_arg ||
1399
- lex_state == :expr_cmdarg) then
1400
- if command_state then
1401
- self.lex_state = :expr_cmdarg
1402
+ self.lex_state =
1403
+ if is_beg? || lex_state == :expr_dot || is_arg? then
1404
+ if command_state then
1405
+ :expr_cmdarg
1406
+ else
1407
+ :expr_arg
1408
+ end
1409
+ elsif ruby19 && lex_state == :expr_fname then
1410
+ :expr_endfn
1402
1411
  else
1403
- self.lex_state = :expr_arg
1412
+ :expr_end
1404
1413
  end
1405
- else
1406
- self.lex_state = :expr_end
1407
- end
1414
+
1408
1415
  end
1409
1416
 
1410
1417
  self.yacc_value = token
@@ -78,7 +78,7 @@ class RPStringScanner < StringScanner
78
78
  end
79
79
 
80
80
  module RubyParserStuff
81
- VERSION = '3.0.0.a4' unless constants.include? "VERSION" # SIGH
81
+ VERSION = '3.0.0.a5' unless constants.include? "VERSION" # SIGH
82
82
 
83
83
  attr_accessor :lexer, :in_def, :in_single, :file
84
84
  attr_reader :env, :comments
@@ -201,7 +201,16 @@ module RubyParserStuff
201
201
  when Sexp then
202
202
  case v.first
203
203
  when :args then
204
- r.concat v[1..-1].map { |s| s(:lasgn, s) }
204
+ r.concat v[1..-1].map { |s| # FIX: this is a smell
205
+ case s
206
+ when Symbol then
207
+ s(:lasgn, s)
208
+ when Sexp then
209
+ s
210
+ else
211
+ raise "unhandled type: #{s.inspect}"
212
+ end
213
+ }
205
214
  when :block_arg then
206
215
  r << s(:lasgn, :"&#{v.last}")
207
216
  when :masgn then
@@ -1221,6 +1230,7 @@ class Sexp
1221
1230
  end
1222
1231
 
1223
1232
  def to_sym
1233
+ raise "no"
1224
1234
  self.value.to_sym
1225
1235
  end
1226
1236
 
@@ -646,16 +646,31 @@ module TestRubyParserShared
646
646
  assert_parse rb, pt
647
647
  end
648
648
 
649
- def test_bug_args_masgn
649
+ # according to 2.3.1 parser:
650
+ # rp.process("f { |(a,b),c| }") == rp.process("f { |((a,b),c)| }")
651
+
652
+ # def test_bug_args_masgn
653
+ # rb = "f { |(a, b), c| }"
654
+ # pt = s(:iter,
655
+ # s(:call, nil, :f),
656
+ # s(:masgn,
657
+ # s(:array,
658
+ # s(:masgn, s(:array, s(:lasgn, :a), s(:lasgn, :b))),
659
+ # s(:lasgn, :c))))
660
+ #
661
+ # assert_parse rb, pt.dup
662
+ # end
663
+
664
+ def test_bug_args_masgn_outer_parens
650
665
  rb = "f { |((a, b), c)| }"
651
- pt = s(:iter,
666
+ pt = s(:iter, # NOTE: same sexp as test_bug_args_masgn
652
667
  s(:call, nil, :f),
653
668
  s(:masgn,
654
669
  s(:array,
655
670
  s(:masgn, s(:array, s(:lasgn, :a), s(:lasgn, :b))),
656
671
  s(:lasgn, :c))))
657
672
 
658
- assert_parse rb, pt
673
+ assert_parse rb, pt.dup
659
674
  end
660
675
 
661
676
  # TODO:
@@ -675,16 +690,61 @@ module TestRubyParserShared
675
690
  # assert_parse rb, pt
676
691
  # end
677
692
 
678
- # TODO:
679
- # def test_bug_comma
680
- # rb = "if test ?d, dir then end"
681
- # pt = s(:if,
682
- # s(:call, nil, :test, s(:lit, 100), s(:call, nil, :dir)),
683
- # nil,
684
- # nil)
685
- #
686
- # assert_parse rb, pt
687
- # end
693
+ def test_bug_comma
694
+ val = case self.processor
695
+ when Ruby18Parser then
696
+ s(:lit, 100)
697
+ when Ruby19Parser then
698
+ s(:str, "d")
699
+ else
700
+ raise "wtf"
701
+ end
702
+
703
+ rb = "if test ?d, dir then end"
704
+ pt = s(:if,
705
+ s(:call, nil, :test, val, s(:call, nil, :dir)),
706
+ nil,
707
+ nil)
708
+
709
+ assert_parse rb, pt
710
+ end
711
+
712
+ def test_bug_case_when_regexp
713
+ rb = "case :x; when /x/ then end"
714
+ pt = s(:case, s(:lit, :x),
715
+ s(:when, s(:array, s(:lit, /x/)), nil),
716
+ nil)
717
+
718
+ assert_parse rb, pt
719
+ end
720
+
721
+ def test_bug_masgn_right
722
+ rb = "f { |a, (b, c)| }"
723
+ pt = s(:iter,
724
+ s(:call, nil, :f),
725
+ s(:masgn,
726
+ s(:array,
727
+ s(:lasgn, :a),
728
+ s(:masgn, s(:array, s(:lasgn, :b), s(:lasgn, :c))))))
729
+
730
+ assert_parse rb, pt
731
+ end
732
+
733
+ def test_when_splat
734
+ rb = "case a; when *b then; end"
735
+ pt = s(:case, s(:call, nil, :a),
736
+ s(:when, s(:array, s(:splat, s(:call, nil, :b))), nil),
737
+ nil)
738
+
739
+ assert_parse rb, pt
740
+ end
741
+
742
+ def test_if_symbol
743
+ rb = "if f :x; end"
744
+ pt = s(:if, s(:call, nil, :f, s(:lit, :x)), nil, nil)
745
+
746
+ assert_parse rb, pt
747
+ end
688
748
  end
689
749
 
690
750
  class TestRubyParser < MiniTest::Unit::TestCase
@@ -1034,6 +1094,24 @@ class TestRuby19Parser < RubyParserTestCase
1034
1094
  assert_parse rb, pt
1035
1095
  end
1036
1096
 
1097
+ def test_bug_hash_args
1098
+ rb = "foo(:bar, baz: nil)"
1099
+ pt = s(:call, nil, :foo,
1100
+ s(:lit, :bar),
1101
+ s(:hash, s(:lit, :baz), s(:nil)))
1102
+
1103
+ assert_parse rb, pt
1104
+ end
1105
+
1106
+ def test_bug_hash_args_trailing_comma
1107
+ rb = "foo(:bar, baz: nil,)"
1108
+ pt = s(:call, nil, :foo, # NOTE: same sexp as test_bug_hash_args
1109
+ s(:lit, :bar),
1110
+ s(:hash, s(:lit, :baz), s(:nil)))
1111
+
1112
+ assert_parse rb, pt
1113
+ end
1114
+
1037
1115
  # HACK: need to figure out the desired structure and get this working
1038
1116
  # def test_wtf
1039
1117
  # # lambda -> f_larglist lambda_body
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_parser
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1314497749
4
+ hash: -2559988010
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 3
8
8
  - 0
9
9
  - 0
10
10
  - a
11
- - 4
12
- version: 3.0.0.a4
11
+ - 5
12
+ version: 3.0.0.a5
13
13
  platform: ruby
14
14
  authors:
15
15
  - Ryan Davis
@@ -38,7 +38,7 @@ cert_chain:
38
38
  FBHgymkyj/AOSqKRIpXPhjC6
39
39
  -----END CERTIFICATE-----
40
40
 
41
- date: 2012-07-26 00:00:00 Z
41
+ date: 2012-08-01 00:00:00 Z
42
42
  dependencies:
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: sexp_processor
metadata.gz.sig CHANGED
Binary file