parser 3.0.1.1 → 3.1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/parser/all.rb +1 -0
- data/lib/parser/ast/processor.rb +3 -0
- data/lib/parser/builders/default.rb +108 -15
- data/lib/parser/context.rb +22 -41
- data/lib/parser/current.rb +19 -10
- data/lib/parser/lexer/dedenter.rb +7 -1
- data/lib/parser/lexer/explanation.rb +1 -1
- data/lib/parser/lexer.rb +12804 -11539
- data/lib/parser/macruby.rb +6371 -2888
- data/lib/parser/max_numparam_stack.rb +5 -5
- data/lib/parser/messages.rb +6 -0
- data/lib/parser/meta.rb +1 -0
- data/lib/parser/ruby18.rb +6310 -2707
- data/lib/parser/ruby19.rb +6334 -2870
- data/lib/parser/ruby20.rb +6796 -3096
- data/lib/parser/ruby21.rb +6776 -3153
- data/lib/parser/ruby22.rb +6864 -3177
- data/lib/parser/ruby23.rb +6879 -3183
- data/lib/parser/ruby24.rb +6964 -3206
- data/lib/parser/ruby25.rb +6891 -3181
- data/lib/parser/ruby26.rb +6863 -3189
- data/lib/parser/ruby27.rb +7915 -3832
- data/lib/parser/ruby30.rb +8326 -4145
- data/lib/parser/ruby31.rb +9255 -4616
- data/lib/parser/ruby32.rb +12691 -0
- data/lib/parser/rubymotion.rb +6284 -2857
- data/lib/parser/runner.rb +6 -0
- data/lib/parser/static_environment.rb +27 -0
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +1 -1
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 41190efffa46e773dca6e8579ecca87ded55e3156774838d0e6bea3cec40803e
|
4
|
+
data.tar.gz: e9219ad92e0da926e964d5f13a00208e772f4f3ba2af7910ac13fd9bf9dcb19b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 786be93811a076e9736a02fccafab91eac37e4d6eab27cdafffc41743ed93e910c84cf073fde0195b7e51e47e1d6868b9673d7c91fbd792ac17428afeabcf68f
|
7
|
+
data.tar.gz: 472cc7b075befe6502a6f1f543565941cc9d1ffd3c7e5f66f2f21bfed82597cc0a0ad42b8e0f3319321fa9554fbd44a9d375b9a7f226231c7980d8782e5dd23a
|
data/lib/parser/all.rb
CHANGED
data/lib/parser/ast/processor.rb
CHANGED
@@ -148,6 +148,9 @@ module Parser
|
|
148
148
|
alias on_blockarg_expr process_regular_node
|
149
149
|
alias on_block_pass process_regular_node
|
150
150
|
|
151
|
+
alias on_forwarded_restarg process_regular_node
|
152
|
+
alias on_forwarded_kwrestarg process_regular_node
|
153
|
+
|
151
154
|
alias on_module process_regular_node
|
152
155
|
alias on_class process_regular_node
|
153
156
|
alias on_sclass process_regular_node
|
@@ -161,7 +161,7 @@ module Parser
|
|
161
161
|
#
|
162
162
|
# ```
|
163
163
|
# (send nil :foo
|
164
|
-
# (
|
164
|
+
# (kwargs
|
165
165
|
# (pair
|
166
166
|
# (sym :a)
|
167
167
|
# (int 42))
|
@@ -518,12 +518,52 @@ module Parser
|
|
518
518
|
n(:pair, [ key, value ], pair_map)
|
519
519
|
end
|
520
520
|
|
521
|
+
def pair_label(key_t)
|
522
|
+
key_l = loc(key_t)
|
523
|
+
value_l = key_l.adjust(end_pos: -1)
|
524
|
+
|
525
|
+
label = value(key_t)
|
526
|
+
value =
|
527
|
+
if label =~ /\A[[:lower:]]/
|
528
|
+
n(:ident, [ label.to_sym ], Source::Map::Variable.new(value_l))
|
529
|
+
else
|
530
|
+
n(:const, [ nil, label.to_sym ], Source::Map::Constant.new(nil, value_l, value_l))
|
531
|
+
end
|
532
|
+
pair_keyword(key_t, accessible(value))
|
533
|
+
end
|
534
|
+
|
521
535
|
def kwsplat(dstar_t, arg)
|
522
536
|
n(:kwsplat, [ arg ],
|
523
537
|
unary_op_map(dstar_t, arg))
|
524
538
|
end
|
525
539
|
|
526
540
|
def associate(begin_t, pairs, end_t)
|
541
|
+
0.upto(pairs.length - 1) do |i|
|
542
|
+
(i + 1).upto(pairs.length - 1) do |j|
|
543
|
+
key1, = *pairs[i]
|
544
|
+
key2, = *pairs[j]
|
545
|
+
|
546
|
+
do_warn = false
|
547
|
+
|
548
|
+
# keys have to be simple nodes, MRI ignores equal composite keys like
|
549
|
+
# `{ a(1) => 1, a(1) => 1 }`
|
550
|
+
case key1.type
|
551
|
+
when :sym, :str, :int, :float
|
552
|
+
if key1 == key2
|
553
|
+
do_warn = true
|
554
|
+
end
|
555
|
+
when :rational, :complex, :regexp
|
556
|
+
if @parser.version >= 31 && key1 == key2
|
557
|
+
do_warn = true
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
if do_warn
|
562
|
+
diagnostic :warning, :duplicate_hash_key, nil, key2.loc.expression
|
563
|
+
end
|
564
|
+
end
|
565
|
+
end
|
566
|
+
|
527
567
|
n(:hash, [ *pairs ],
|
528
568
|
collection_map(begin_t, pairs, end_t))
|
529
569
|
end
|
@@ -608,19 +648,29 @@ module Parser
|
|
608
648
|
when :ident
|
609
649
|
name, = *node
|
610
650
|
|
611
|
-
if
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
end
|
651
|
+
if %w[? !].any? { |c| name.to_s.end_with?(c) }
|
652
|
+
diagnostic :error, :invalid_id_to_get,
|
653
|
+
{ :identifier => name.to_s }, node.loc.expression
|
654
|
+
end
|
616
655
|
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
656
|
+
# Numbered parameters are not declared anywhere,
|
657
|
+
# so they take precedence over method calls in numblock contexts
|
658
|
+
if @parser.version >= 27 && @parser.try_declare_numparam(node)
|
659
|
+
return node.updated(:lvar)
|
660
|
+
end
|
661
|
+
|
662
|
+
unless @parser.static_env.declared?(name)
|
663
|
+
return n(:send, [ nil, name ],
|
621
664
|
var_send_map(node))
|
622
665
|
end
|
623
666
|
|
667
|
+
if name.to_s == parser.current_arg_stack.top
|
668
|
+
diagnostic :error, :circular_argument_reference,
|
669
|
+
{ :var_name => name.to_s }, node.loc.expression
|
670
|
+
end
|
671
|
+
|
672
|
+
node.updated(:lvar)
|
673
|
+
|
624
674
|
else
|
625
675
|
node
|
626
676
|
end
|
@@ -664,7 +714,7 @@ module Parser
|
|
664
714
|
node.updated(:gvasgn)
|
665
715
|
|
666
716
|
when :const
|
667
|
-
|
717
|
+
if @parser.context.in_def
|
668
718
|
diagnostic :error, :dynamic_const, nil, node.loc.expression
|
669
719
|
end
|
670
720
|
|
@@ -683,6 +733,17 @@ module Parser
|
|
683
733
|
|
684
734
|
node.updated(:lvasgn)
|
685
735
|
|
736
|
+
when :match_var
|
737
|
+
name, = *node
|
738
|
+
|
739
|
+
var_name = node.children[0].to_s
|
740
|
+
name_loc = node.loc.expression
|
741
|
+
|
742
|
+
check_assignment_to_numparam(var_name, name_loc)
|
743
|
+
check_reserved_for_numparam(var_name, name_loc)
|
744
|
+
|
745
|
+
node
|
746
|
+
|
686
747
|
when :nil, :self, :true, :false,
|
687
748
|
:__FILE__, :__LINE__, :__ENCODING__
|
688
749
|
diagnostic :error, :invalid_assignment, nil, node.loc.expression
|
@@ -818,8 +879,14 @@ module Parser
|
|
818
879
|
|
819
880
|
def args(begin_t, args, end_t, check_args=true)
|
820
881
|
args = check_duplicate_args(args) if check_args
|
821
|
-
|
822
|
-
|
882
|
+
validate_no_forward_arg_after_restarg(args)
|
883
|
+
|
884
|
+
map = collection_map(begin_t, args, end_t)
|
885
|
+
if !self.class.emit_forward_arg && args.length == 1 && args[0].type == :forward_arg
|
886
|
+
n(:forward_args, [], map)
|
887
|
+
else
|
888
|
+
n(:args, args, map)
|
889
|
+
end
|
823
890
|
end
|
824
891
|
|
825
892
|
def numargs(max_numparam)
|
@@ -906,9 +973,12 @@ module Parser
|
|
906
973
|
end
|
907
974
|
|
908
975
|
def blockarg(amper_t, name_t)
|
909
|
-
|
976
|
+
if !name_t.nil?
|
977
|
+
check_reserved_for_numparam(value(name_t), loc(name_t))
|
978
|
+
end
|
910
979
|
|
911
|
-
|
980
|
+
arg_name = name_t ? value(name_t).to_sym : nil
|
981
|
+
n(:blockarg, [ arg_name ],
|
912
982
|
arg_prefix_map(amper_t, name_t))
|
913
983
|
end
|
914
984
|
|
@@ -1008,6 +1078,14 @@ module Parser
|
|
1008
1078
|
n(:forwarded_args, [], token_map(dots_t))
|
1009
1079
|
end
|
1010
1080
|
|
1081
|
+
def forwarded_restarg(star_t)
|
1082
|
+
n(:forwarded_restarg, [], token_map(star_t))
|
1083
|
+
end
|
1084
|
+
|
1085
|
+
def forwarded_kwrestarg(dstar_t)
|
1086
|
+
n(:forwarded_kwrestarg, [], token_map(dstar_t))
|
1087
|
+
end
|
1088
|
+
|
1011
1089
|
def call_method(receiver, dot_t, selector_t,
|
1012
1090
|
lparen_t=nil, args=[], rparen_t=nil)
|
1013
1091
|
type = call_type_for_dot(dot_t)
|
@@ -1683,6 +1761,21 @@ module Parser
|
|
1683
1761
|
end
|
1684
1762
|
end
|
1685
1763
|
|
1764
|
+
def validate_no_forward_arg_after_restarg(args)
|
1765
|
+
restarg = nil
|
1766
|
+
forward_arg = nil
|
1767
|
+
args.each do |arg|
|
1768
|
+
case arg.type
|
1769
|
+
when :restarg then restarg = arg
|
1770
|
+
when :forward_arg then forward_arg = arg
|
1771
|
+
end
|
1772
|
+
end
|
1773
|
+
|
1774
|
+
if !forward_arg.nil? && !restarg.nil?
|
1775
|
+
diagnostic :error, :forward_arg_after_restarg, nil, forward_arg.loc.expression, [restarg.loc.expression]
|
1776
|
+
end
|
1777
|
+
end
|
1778
|
+
|
1686
1779
|
def check_assignment_to_numparam(name, loc)
|
1687
1780
|
# MRI < 2.7 treats numbered parameters as regular variables
|
1688
1781
|
# and so it's allowed to perform assignments like `_1 = 42`.
|
data/lib/parser/context.rb
CHANGED
@@ -9,60 +9,41 @@ module Parser
|
|
9
9
|
# + :sclass - in the singleton class body (class << obj; end)
|
10
10
|
# + :def - in the method body (def m; end)
|
11
11
|
# + :defs - in the singleton method body (def self.m; end)
|
12
|
+
# + :def_open_args - in the arglist of the method definition
|
13
|
+
# keep in mind that it's set **only** after reducing the first argument,
|
14
|
+
# if you need to handle the first argument check `lex_state == expr_fname`
|
12
15
|
# + :block - in the block body (tap {})
|
13
16
|
# + :lambda - in the lambda body (-> {})
|
14
17
|
#
|
15
18
|
class Context
|
16
|
-
|
19
|
+
FLAGS = %i[
|
20
|
+
in_defined
|
21
|
+
in_kwarg
|
22
|
+
in_argdef
|
23
|
+
in_def
|
24
|
+
in_class
|
25
|
+
in_block
|
26
|
+
in_lambda
|
27
|
+
]
|
17
28
|
|
18
29
|
def initialize
|
19
|
-
|
20
|
-
freeze
|
21
|
-
end
|
22
|
-
|
23
|
-
def push(state)
|
24
|
-
@stack << state
|
25
|
-
end
|
26
|
-
|
27
|
-
def pop
|
28
|
-
@stack.pop
|
30
|
+
reset
|
29
31
|
end
|
30
32
|
|
31
33
|
def reset
|
32
|
-
@
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
@
|
37
|
-
|
38
|
-
|
39
|
-
def in_class?
|
40
|
-
@stack.last == :class
|
34
|
+
@in_defined = false
|
35
|
+
@in_kwarg = false
|
36
|
+
@in_argdef = false
|
37
|
+
@in_def = false
|
38
|
+
@in_class = false
|
39
|
+
@in_block = false
|
40
|
+
@in_lambda = false
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
@stack.include?(:def) || @stack.include?(:defs)
|
45
|
-
end
|
46
|
-
|
47
|
-
def class_definition_allowed?
|
48
|
-
def_index = stack.rindex { |item| [:def, :defs].include?(item) }
|
49
|
-
sclass_index = stack.rindex(:sclass)
|
50
|
-
|
51
|
-
def_index.nil? || (!sclass_index.nil? && sclass_index > def_index)
|
52
|
-
end
|
53
|
-
alias module_definition_allowed? class_definition_allowed?
|
54
|
-
alias dynamic_const_definition_allowed? class_definition_allowed?
|
55
|
-
|
56
|
-
def in_block?
|
57
|
-
@stack.last == :block
|
58
|
-
end
|
59
|
-
|
60
|
-
def in_lambda?
|
61
|
-
@stack.last == :lambda
|
62
|
-
end
|
43
|
+
attr_accessor(*FLAGS)
|
63
44
|
|
64
45
|
def in_dynamic_block?
|
65
|
-
in_block
|
46
|
+
in_block || in_lambda
|
66
47
|
end
|
67
48
|
end
|
68
49
|
end
|
data/lib/parser/current.rb
CHANGED
@@ -3,9 +3,9 @@
|
|
3
3
|
module Parser
|
4
4
|
class << self
|
5
5
|
def warn_syntax_deviation(feature, version)
|
6
|
-
warn "warning: parser/current is loading #{feature}, which recognizes"
|
7
|
-
|
8
|
-
|
6
|
+
warn "warning: parser/current is loading #{feature}, which recognizes" \
|
7
|
+
"#{version}-compliant syntax, but you are running #{RUBY_VERSION}.\n" \
|
8
|
+
"Please see https://github.com/whitequark/parser#compatibility-with-ruby-mri."
|
9
9
|
end
|
10
10
|
private :warn_syntax_deviation
|
11
11
|
end
|
@@ -66,7 +66,7 @@ module Parser
|
|
66
66
|
CurrentRuby = Ruby25
|
67
67
|
|
68
68
|
when /^2\.6\./
|
69
|
-
current_version = '2.6.
|
69
|
+
current_version = '2.6.10'
|
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.
|
78
|
+
current_version = '2.7.7'
|
79
79
|
if RUBY_VERSION != current_version
|
80
80
|
warn_syntax_deviation 'parser/ruby27', current_version
|
81
81
|
end
|
@@ -84,7 +84,7 @@ module Parser
|
|
84
84
|
CurrentRuby = Ruby27
|
85
85
|
|
86
86
|
when /^3\.0\./
|
87
|
-
current_version = '3.0.
|
87
|
+
current_version = '3.0.5'
|
88
88
|
if RUBY_VERSION != current_version
|
89
89
|
warn_syntax_deviation 'parser/ruby30', current_version
|
90
90
|
end
|
@@ -93,7 +93,7 @@ module Parser
|
|
93
93
|
CurrentRuby = Ruby30
|
94
94
|
|
95
95
|
when /^3\.1\./
|
96
|
-
current_version = '3.1.
|
96
|
+
current_version = '3.1.3'
|
97
97
|
if RUBY_VERSION != current_version
|
98
98
|
warn_syntax_deviation 'parser/ruby31', current_version
|
99
99
|
end
|
@@ -101,10 +101,19 @@ module Parser
|
|
101
101
|
require 'parser/ruby31'
|
102
102
|
CurrentRuby = Ruby31
|
103
103
|
|
104
|
+
when /^3\.2\./
|
105
|
+
current_version = '3.2.0-dev'
|
106
|
+
if RUBY_VERSION != current_version
|
107
|
+
warn_syntax_deviation 'parser/ruby32', current_version
|
108
|
+
end
|
109
|
+
|
110
|
+
require 'parser/ruby32'
|
111
|
+
CurrentRuby = Ruby32
|
112
|
+
|
104
113
|
else # :nocov:
|
105
114
|
# Keep this in sync with released Ruby.
|
106
|
-
warn_syntax_deviation 'parser/
|
107
|
-
require 'parser/
|
108
|
-
CurrentRuby =
|
115
|
+
warn_syntax_deviation 'parser/ruby31', '3.1.x'
|
116
|
+
require 'parser/ruby31'
|
117
|
+
CurrentRuby = Ruby31
|
109
118
|
end
|
110
119
|
end
|
@@ -38,7 +38,13 @@ module Parser
|
|
38
38
|
# Prevent the following error when processing binary encoded source.
|
39
39
|
# "\xC0".split # => ArgumentError (invalid byte sequence in UTF-8)
|
40
40
|
lines = string.force_encoding(Encoding::BINARY).split("\\\n")
|
41
|
-
lines.
|
41
|
+
if lines.length == 1
|
42
|
+
# If the line continuation sequence was found but there is no second
|
43
|
+
# line, it was not really a line continuation and must be ignored.
|
44
|
+
lines = [string.force_encoding(original_encoding)]
|
45
|
+
else
|
46
|
+
lines.map! {|s| s.force_encoding(original_encoding) }
|
47
|
+
end
|
42
48
|
|
43
49
|
if @at_line_begin
|
44
50
|
lines_to_dedent = lines
|