parser 2.4.0.2 → 2.5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -6
- data/CHANGELOG.md +35 -1
- data/Gemfile +2 -0
- data/README.md +1 -2
- data/Rakefile +2 -1
- data/bin/ruby-parse +2 -1
- data/bin/ruby-rewrite +2 -1
- data/lib/gauntlet_parser.rb +2 -0
- data/lib/parser.rb +16 -17
- data/lib/parser/all.rb +2 -0
- data/lib/parser/ast/node.rb +2 -0
- data/lib/parser/ast/processor.rb +2 -0
- data/lib/parser/base.rb +6 -12
- data/lib/parser/builders/default.rb +28 -47
- data/lib/parser/clobbering_error.rb +2 -0
- data/lib/parser/context.rb +42 -0
- data/lib/parser/current.rb +4 -20
- data/lib/parser/deprecation.rb +13 -0
- data/lib/parser/diagnostic.rb +3 -3
- data/lib/parser/diagnostic/engine.rb +2 -0
- data/lib/parser/lexer.rl +122 -60
- data/lib/parser/lexer/dedenter.rb +2 -0
- data/lib/parser/lexer/explanation.rb +2 -0
- data/lib/parser/lexer/literal.rb +4 -9
- data/lib/parser/lexer/stack_state.rb +4 -1
- data/lib/parser/macruby.y +32 -17
- data/lib/parser/messages.rb +14 -0
- data/lib/parser/meta.rb +2 -0
- data/lib/parser/rewriter.rb +30 -44
- data/lib/parser/ruby18.y +20 -13
- data/lib/parser/ruby19.y +32 -17
- data/lib/parser/ruby20.y +33 -18
- data/lib/parser/ruby21.y +32 -17
- data/lib/parser/ruby22.y +32 -17
- data/lib/parser/ruby23.y +32 -17
- data/lib/parser/ruby24.y +63 -46
- data/lib/parser/ruby25.y +72 -48
- data/lib/parser/rubymotion.y +33 -18
- data/lib/parser/runner.rb +4 -7
- data/lib/parser/runner/ruby_parse.rb +10 -0
- data/lib/parser/runner/ruby_rewrite.rb +2 -0
- data/lib/parser/source/buffer.rb +19 -24
- data/lib/parser/source/comment.rb +2 -0
- data/lib/parser/source/comment/associator.rb +2 -0
- data/lib/parser/source/map.rb +2 -0
- data/lib/parser/source/map/collection.rb +2 -0
- data/lib/parser/source/map/condition.rb +2 -0
- data/lib/parser/source/map/constant.rb +2 -0
- data/lib/parser/source/map/definition.rb +2 -0
- data/lib/parser/source/map/for.rb +2 -0
- data/lib/parser/source/map/heredoc.rb +2 -0
- data/lib/parser/source/map/keyword.rb +2 -0
- data/lib/parser/source/map/objc_kwarg.rb +2 -0
- data/lib/parser/source/map/operator.rb +2 -0
- data/lib/parser/source/map/rescue_body.rb +2 -0
- data/lib/parser/source/map/send.rb +2 -0
- data/lib/parser/source/map/ternary.rb +2 -0
- data/lib/parser/source/map/variable.rb +2 -0
- data/lib/parser/source/range.rb +81 -13
- data/lib/parser/source/rewriter.rb +48 -10
- data/lib/parser/source/rewriter/action.rb +2 -0
- data/lib/parser/source/tree_rewriter.rb +301 -0
- data/lib/parser/source/tree_rewriter/action.rb +133 -0
- data/lib/parser/static_environment.rb +2 -0
- data/lib/parser/syntax_error.rb +2 -0
- data/lib/parser/tree_rewriter.rb +133 -0
- data/lib/parser/version.rb +3 -1
- data/parser.gemspec +4 -1
- data/test/bug_163/fixtures/input.rb +2 -0
- data/test/bug_163/fixtures/output.rb +2 -0
- data/test/bug_163/rewriter.rb +2 -0
- data/test/helper.rb +7 -7
- data/test/parse_helper.rb +57 -10
- data/test/racc_coverage_helper.rb +2 -0
- data/test/test_base.rb +2 -0
- data/test/test_current.rb +2 -4
- data/test/test_diagnostic.rb +3 -1
- data/test/test_diagnostic_engine.rb +2 -0
- data/test/test_encoding.rb +61 -49
- data/test/test_lexer.rb +164 -77
- data/test/test_lexer_stack_state.rb +2 -0
- data/test/test_parse_helper.rb +8 -8
- data/test/test_parser.rb +613 -51
- data/test/test_runner_rewrite.rb +47 -0
- data/test/test_source_buffer.rb +22 -10
- data/test/test_source_comment.rb +2 -0
- data/test/test_source_comment_associator.rb +2 -0
- data/test/test_source_map.rb +2 -0
- data/test/test_source_range.rb +92 -45
- data/test/test_source_rewriter.rb +3 -1
- data/test/test_source_rewriter_action.rb +2 -0
- data/test/test_source_tree_rewriter.rb +177 -0
- data/test/test_static_environment.rb +2 -0
- data/test/using_tree_rewriter/fixtures/input.rb +3 -0
- data/test/using_tree_rewriter/fixtures/output.rb +3 -0
- data/test/using_tree_rewriter/using_tree_rewriter.rb +9 -0
- metadata +21 -10
- data/lib/parser/compatibility/ruby1_8.rb +0 -20
- data/lib/parser/compatibility/ruby1_9.rb +0 -32
- data/test/bug_163/test_runner_rewrite.rb +0 -35
data/lib/parser/current.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Parser
|
2
4
|
class << self
|
3
5
|
def warn_syntax_deviation(feature, version)
|
@@ -9,24 +11,6 @@ module Parser
|
|
9
11
|
end
|
10
12
|
|
11
13
|
case RUBY_VERSION
|
12
|
-
when /^1\.8\./
|
13
|
-
current_version = '1.8.7'
|
14
|
-
if RUBY_VERSION != current_version
|
15
|
-
warn_syntax_deviation 'parser/ruby18', current_version
|
16
|
-
end
|
17
|
-
|
18
|
-
require 'parser/ruby18'
|
19
|
-
CurrentRuby = Ruby18
|
20
|
-
|
21
|
-
when /^1\.9\./
|
22
|
-
current_version = '1.9.3'
|
23
|
-
if RUBY_VERSION != current_version
|
24
|
-
warn_syntax_deviation 'parser/ruby19', current_version
|
25
|
-
end
|
26
|
-
|
27
|
-
require 'parser/ruby19'
|
28
|
-
CurrentRuby = Ruby19
|
29
|
-
|
30
14
|
when /^2\.0\./
|
31
15
|
current_version = '2.0.0'
|
32
16
|
if RUBY_VERSION != current_version
|
@@ -46,7 +30,7 @@ module Parser
|
|
46
30
|
CurrentRuby = Ruby21
|
47
31
|
|
48
32
|
when /^2\.2\./
|
49
|
-
current_version = '2.2.
|
33
|
+
current_version = '2.2.9'
|
50
34
|
if RUBY_VERSION != current_version
|
51
35
|
warn_syntax_deviation 'parser/ruby22', current_version
|
52
36
|
end
|
@@ -55,7 +39,7 @@ module Parser
|
|
55
39
|
CurrentRuby = Ruby22
|
56
40
|
|
57
41
|
when /^2\.3\./
|
58
|
-
current_version = '2.3.
|
42
|
+
current_version = '2.3.6'
|
59
43
|
if RUBY_VERSION != current_version
|
60
44
|
warn_syntax_deviation 'parser/ruby23', current_version
|
61
45
|
end
|
data/lib/parser/diagnostic.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Parser
|
2
4
|
|
3
5
|
##
|
@@ -152,9 +154,7 @@ module Parser
|
|
152
154
|
#
|
153
155
|
def last_line_only(range)
|
154
156
|
if range.line != range.last_line
|
155
|
-
|
156
|
-
range.begin_pos + (range.source =~ /[^\n]*\z/),
|
157
|
-
range.end_pos)
|
157
|
+
range.adjust(begin_pos: range.source =~ /[^\n]*\z/)
|
158
158
|
else
|
159
159
|
range
|
160
160
|
end
|
data/lib/parser/lexer.rl
CHANGED
@@ -89,8 +89,6 @@ class Parser::Lexer
|
|
89
89
|
|
90
90
|
REGEXP_META_CHARACTERS = Regexp.union(*"\\$()*+.<>?[]^{|}".chars).freeze
|
91
91
|
|
92
|
-
RBRACE_OR_RBRACK = %w"} ]".freeze
|
93
|
-
|
94
92
|
attr_reader :source_buffer
|
95
93
|
|
96
94
|
attr_accessor :diagnostics
|
@@ -174,6 +172,9 @@ class Parser::Lexer
|
|
174
172
|
|
175
173
|
# True at the end of "def foo a:"
|
176
174
|
@in_kwarg = false
|
175
|
+
|
176
|
+
# State before =begin / =end block comment
|
177
|
+
@cs_before_block_comment = self.class.lex_en_line_begin
|
177
178
|
end
|
178
179
|
|
179
180
|
def source_buffer=(source_buffer)
|
@@ -182,7 +183,7 @@ class Parser::Lexer
|
|
182
183
|
if @source_buffer
|
183
184
|
source = @source_buffer.source
|
184
185
|
|
185
|
-
if
|
186
|
+
if source.encoding == Encoding::UTF_8
|
186
187
|
@source_pts = source.unpack('U*')
|
187
188
|
else
|
188
189
|
@source_pts = source.unpack('C*')
|
@@ -308,14 +309,8 @@ class Parser::Lexer
|
|
308
309
|
@stack[@top]
|
309
310
|
end
|
310
311
|
|
311
|
-
|
312
|
-
|
313
|
-
ord.chr.force_encoding(@source_buffer.source.encoding)
|
314
|
-
end
|
315
|
-
else
|
316
|
-
def encode_escape(ord)
|
317
|
-
ord.chr
|
318
|
-
end
|
312
|
+
def encode_escape(ord)
|
313
|
+
ord.chr.force_encoding(@source_buffer.source.encoding)
|
319
314
|
end
|
320
315
|
|
321
316
|
def tok(s = @ts, e = @te)
|
@@ -622,19 +617,23 @@ class Parser::Lexer
|
|
622
617
|
flo_pow = [eE] [+\-]? ( digit+ '_' )* digit+;
|
623
618
|
|
624
619
|
int_suffix =
|
625
|
-
''
|
626
|
-
| 'r'
|
627
|
-
| 'i'
|
628
|
-
| 'ri'
|
620
|
+
'' % { @num_xfrm = lambda { |chars| emit(:tINTEGER, chars) } }
|
621
|
+
| 'r' % { @num_xfrm = lambda { |chars| emit(:tRATIONAL, Rational(chars)) } }
|
622
|
+
| 'i' % { @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, chars)) } }
|
623
|
+
| 'ri' % { @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Rational(chars))) } }
|
624
|
+
| 'if' % { @num_xfrm = lambda { |chars| emit(:tINTEGER, chars, @ts, @te - 2); p -= 2 } }
|
625
|
+
| 'rescue' % { @num_xfrm = lambda { |chars| emit(:tINTEGER, chars, @ts, @te - 6); p -= 6 } };
|
629
626
|
|
630
627
|
flo_pow_suffix =
|
631
628
|
'' % { @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars)) } }
|
632
|
-
| 'i' % { @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Float(chars))) } }
|
629
|
+
| 'i' % { @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Float(chars))) } }
|
630
|
+
| 'if' % { @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars), @ts, @te - 2); p -= 2 } };
|
633
631
|
|
634
632
|
flo_suffix =
|
635
633
|
flo_pow_suffix
|
636
|
-
| 'r'
|
637
|
-
| 'ri'
|
634
|
+
| 'r' % { @num_xfrm = lambda { |chars| emit(:tRATIONAL, Rational(chars)) } }
|
635
|
+
| 'ri' % { @num_xfrm = lambda { |chars| emit(:tIMAGINARY, Complex(0, Rational(chars))) } }
|
636
|
+
| 'rescue' % { @num_xfrm = lambda { |chars| emit(:tFLOAT, Float(chars), @ts, @te - 6); p -= 6 } };
|
638
637
|
|
639
638
|
#
|
640
639
|
# === ESCAPE SEQUENCE PARSING ===
|
@@ -655,17 +654,37 @@ class Parser::Lexer
|
|
655
654
|
codepoints = tok(@escape_s + 2, p - 1)
|
656
655
|
codepoint_s = @escape_s + 2
|
657
656
|
|
658
|
-
|
659
|
-
|
657
|
+
if @version < 24
|
658
|
+
if codepoints.start_with?(" ") || codepoints.start_with?("\t")
|
659
|
+
diagnostic :fatal, :invalid_unicode_escape, nil,
|
660
|
+
range(@escape_s + 2, @escape_s + 3)
|
661
|
+
end
|
660
662
|
|
661
|
-
if
|
662
|
-
diagnostic :
|
663
|
-
|
664
|
-
break
|
663
|
+
if spaces_p = codepoints.index(/[ \t]{2}/)
|
664
|
+
diagnostic :fatal, :invalid_unicode_escape, nil,
|
665
|
+
range(codepoint_s + spaces_p + 1, codepoint_s + spaces_p + 2)
|
665
666
|
end
|
666
667
|
|
667
|
-
|
668
|
-
|
668
|
+
if codepoints.end_with?(" ") || codepoints.end_with?("\t")
|
669
|
+
diagnostic :fatal, :invalid_unicode_escape, nil, range(p - 1, p)
|
670
|
+
end
|
671
|
+
end
|
672
|
+
|
673
|
+
codepoints.scan(/([0-9a-fA-F]+)|([ \t]+)/).each do |(codepoint_str, spaces)|
|
674
|
+
if spaces
|
675
|
+
codepoint_s += spaces.length
|
676
|
+
else
|
677
|
+
codepoint = codepoint_str.to_i(16)
|
678
|
+
|
679
|
+
if codepoint >= 0x110000
|
680
|
+
diagnostic :error, :unicode_point_too_large, nil,
|
681
|
+
range(codepoint_s, codepoint_s + codepoint_str.length)
|
682
|
+
break
|
683
|
+
end
|
684
|
+
|
685
|
+
@escape += codepoint.chr(Encoding::UTF_8)
|
686
|
+
codepoint_s += codepoint_str.length
|
687
|
+
end
|
669
688
|
end
|
670
689
|
}
|
671
690
|
|
@@ -708,35 +727,38 @@ class Parser::Lexer
|
|
708
727
|
| 'x' xdigit{1,2}
|
709
728
|
% { @escape = encode_escape(tok(@escape_s + 1, p).to_i(16)) }
|
710
729
|
|
730
|
+
# %q[\x]
|
731
|
+
| 'x' ( c_any - xdigit )
|
732
|
+
% {
|
733
|
+
diagnostic :fatal, :invalid_hex_escape, nil, range(@escape_s - 1, p + 2)
|
734
|
+
}
|
735
|
+
|
711
736
|
# \u263a
|
712
737
|
| 'u' xdigit{4}
|
713
738
|
% { @escape = tok(@escape_s + 1, p).to_i(16).chr(Encoding::UTF_8) }
|
714
739
|
|
715
|
-
#
|
716
|
-
| '
|
740
|
+
# \u123
|
741
|
+
| 'u' xdigit{0,3}
|
717
742
|
% {
|
718
|
-
diagnostic :fatal, :
|
743
|
+
diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p)
|
719
744
|
}
|
720
745
|
|
721
|
-
#
|
722
|
-
| 'u' ( c_any
|
723
|
-
xdigit{4} - # \u1234 is valid
|
724
|
-
( '{' xdigit{1,3} # \u{1 \u{12 \u{123 are valid
|
725
|
-
| '{' xdigit [ \t}] any? # \u{1. \u{1} are valid
|
726
|
-
| '{' xdigit{2} [ \t}] # \u{12. \u{12} are valid
|
727
|
-
)
|
728
|
-
)
|
746
|
+
# u{not hex} or u{}
|
747
|
+
| 'u{' ( c_any - xdigit - [ \t}] )* '}'
|
729
748
|
% {
|
730
749
|
diagnostic :fatal, :invalid_unicode_escape, nil, range(@escape_s - 1, p)
|
731
750
|
}
|
732
751
|
|
733
|
-
# \u{123 456}
|
734
|
-
| 'u{' ( xdigit{1,6} [ \t] )*
|
735
|
-
(
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
|
752
|
+
# \u{ \t 123 \t 456 \t\t }
|
753
|
+
| 'u{' [ \t]* ( xdigit{1,6} [ \t]+ )*
|
754
|
+
(
|
755
|
+
( xdigit{1,6} [ \t]* '}'
|
756
|
+
%unicode_points
|
757
|
+
)
|
758
|
+
|
|
759
|
+
( xdigit* ( c_any - xdigit - [ \t}] )+ '}'
|
760
|
+
| ( c_any - [ \t}] )* c_eof
|
761
|
+
| xdigit{7,}
|
740
762
|
) % {
|
741
763
|
diagnostic :fatal, :unterminated_unicode, nil, range(p - 1, p)
|
742
764
|
}
|
@@ -1096,13 +1118,15 @@ class Parser::Lexer
|
|
1096
1118
|
end
|
1097
1119
|
|
1098
1120
|
emit(:tREGEXP_OPT)
|
1099
|
-
fnext expr_end;
|
1121
|
+
fnext expr_end;
|
1122
|
+
fbreak;
|
1100
1123
|
};
|
1101
1124
|
|
1102
1125
|
any
|
1103
1126
|
=> {
|
1104
1127
|
emit(:tREGEXP_OPT, tok(@ts, @te - 1), @ts, @te - 1)
|
1105
|
-
fhold;
|
1128
|
+
fhold;
|
1129
|
+
fgoto expr_end;
|
1106
1130
|
};
|
1107
1131
|
*|;
|
1108
1132
|
|
@@ -1669,19 +1693,30 @@ class Parser::Lexer
|
|
1669
1693
|
# <<-END | <<-'END' | <<-"END" | <<-`END` |
|
1670
1694
|
# <<~END | <<~'END' | <<~"END" | <<~`END`
|
1671
1695
|
'<<' [~\-]?
|
1672
|
-
( '"' (
|
1673
|
-
| "'" (
|
1674
|
-
| "`" (
|
1696
|
+
( '"' ( any - '"' )* '"'
|
1697
|
+
| "'" ( any - "'" )* "'"
|
1698
|
+
| "`" ( any - "`" )* "`"
|
1675
1699
|
| bareword ) % { heredoc_e = p }
|
1676
1700
|
c_line* c_nl % { new_herebody_s = p }
|
1677
1701
|
=> {
|
1678
|
-
tok(@ts, heredoc_e) =~ /^<<(-?)(~?)(["'`]?)(.*)\3$/
|
1702
|
+
tok(@ts, heredoc_e) =~ /^<<(-?)(~?)(["'`]?)(.*)\3$/m
|
1679
1703
|
|
1680
1704
|
indent = !$1.empty? || !$2.empty?
|
1681
1705
|
dedent_body = !$2.empty?
|
1682
1706
|
type = $3.empty? ? '<<"'.freeze : ('<<'.freeze + $3)
|
1683
1707
|
delimiter = $4
|
1684
1708
|
|
1709
|
+
if @version >= 24
|
1710
|
+
if delimiter.count("\n") > 0
|
1711
|
+
if delimiter.end_with?("\n")
|
1712
|
+
diagnostic :warning, :heredoc_id_ends_with_nl, nil, range(@ts, @ts + 1)
|
1713
|
+
delimiter = delimiter.rstrip
|
1714
|
+
else
|
1715
|
+
diagnostic :fatal, :heredoc_id_has_newline, nil, range(@ts, @ts + 1)
|
1716
|
+
end
|
1717
|
+
end
|
1718
|
+
end
|
1719
|
+
|
1685
1720
|
if dedent_body && version?(18, 19, 20, 21, 22)
|
1686
1721
|
emit(:tLSHFT, '<<'.freeze, @ts, @ts + 2)
|
1687
1722
|
p = @ts + 1
|
@@ -1698,6 +1733,13 @@ class Parser::Lexer
|
|
1698
1733
|
# SYMBOL LITERALS
|
1699
1734
|
#
|
1700
1735
|
|
1736
|
+
# :&&, :||
|
1737
|
+
':' ('&&' | '||') => {
|
1738
|
+
fhold; fhold;
|
1739
|
+
emit(:tSYMBEG, tok(@ts, @ts + 1), @ts, @ts + 1)
|
1740
|
+
fgoto expr_fname;
|
1741
|
+
};
|
1742
|
+
|
1701
1743
|
# :"bar", :'baz'
|
1702
1744
|
':' ['"] # '
|
1703
1745
|
=> {
|
@@ -1732,11 +1774,7 @@ class Parser::Lexer
|
|
1732
1774
|
value = @escape || tok(@ts + 1)
|
1733
1775
|
|
1734
1776
|
if version?(18)
|
1735
|
-
|
1736
|
-
emit(:tINTEGER, value.dup.force_encoding(Encoding::BINARY)[0].ord)
|
1737
|
-
else
|
1738
|
-
emit(:tINTEGER, value[0].ord)
|
1739
|
-
end
|
1777
|
+
emit(:tINTEGER, value.dup.force_encoding(Encoding::BINARY)[0].ord)
|
1740
1778
|
else
|
1741
1779
|
emit(:tCHARACTER, value)
|
1742
1780
|
end
|
@@ -1853,6 +1891,21 @@ class Parser::Lexer
|
|
1853
1891
|
call_or_var
|
1854
1892
|
=> local_ident;
|
1855
1893
|
|
1894
|
+
(call_or_var - keyword)
|
1895
|
+
% { ident_tok = tok; ident_ts = @ts; ident_te = @te; }
|
1896
|
+
w_space+ '('
|
1897
|
+
=> {
|
1898
|
+
emit(:tIDENTIFIER, ident_tok, ident_ts, ident_te)
|
1899
|
+
p = ident_te - 1
|
1900
|
+
|
1901
|
+
if !@static_env.nil? && @static_env.declared?(ident_tok) && @version < 25
|
1902
|
+
fnext expr_endfn;
|
1903
|
+
else
|
1904
|
+
fnext expr_cmdarg;
|
1905
|
+
end
|
1906
|
+
fbreak;
|
1907
|
+
};
|
1908
|
+
|
1856
1909
|
#
|
1857
1910
|
# WHITESPACE
|
1858
1911
|
#
|
@@ -1860,8 +1913,11 @@ class Parser::Lexer
|
|
1860
1913
|
w_any;
|
1861
1914
|
|
1862
1915
|
e_heredoc_nl '=begin' ( c_space | c_nl_zlen )
|
1863
|
-
=> {
|
1864
|
-
|
1916
|
+
=> {
|
1917
|
+
p = @ts - 1
|
1918
|
+
@cs_before_block_comment = @cs
|
1919
|
+
fgoto line_begin;
|
1920
|
+
};
|
1865
1921
|
|
1866
1922
|
#
|
1867
1923
|
# DEFAULT TRANSITION
|
@@ -2159,10 +2215,16 @@ class Parser::Lexer
|
|
2159
2215
|
e_rbrace | e_rparen | ']'
|
2160
2216
|
=> {
|
2161
2217
|
emit_table(PUNCTUATION)
|
2162
|
-
@cond.lexpop; @cmdarg.
|
2218
|
+
@cond.lexpop; @cmdarg.pop
|
2163
2219
|
|
2164
|
-
if
|
2220
|
+
if tok == '}'.freeze
|
2165
2221
|
fnext expr_endarg;
|
2222
|
+
elsif tok == ']'
|
2223
|
+
if @version >= 24
|
2224
|
+
fnext expr_end;
|
2225
|
+
else
|
2226
|
+
fnext expr_endarg;
|
2227
|
+
end
|
2166
2228
|
else # )
|
2167
2229
|
# fnext expr_endfn; ?
|
2168
2230
|
end
|
@@ -2232,7 +2294,7 @@ class Parser::Lexer
|
|
2232
2294
|
'=end' c_line* c_nl_zlen
|
2233
2295
|
=> {
|
2234
2296
|
emit_comment(@eq_begin_s, @te)
|
2235
|
-
fgoto
|
2297
|
+
fgoto *@cs_before_block_comment;
|
2236
2298
|
};
|
2237
2299
|
|
2238
2300
|
c_line* c_nl;
|
data/lib/parser/lexer/literal.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: binary
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Parser
|
4
5
|
|
@@ -229,21 +230,15 @@ module Parser
|
|
229
230
|
end
|
230
231
|
|
231
232
|
def coerce_encoding(string)
|
232
|
-
|
233
|
-
string.dup.force_encoding(Encoding::BINARY)
|
234
|
-
else
|
235
|
-
string
|
236
|
-
end
|
233
|
+
string.dup.force_encoding(Encoding::BINARY)
|
237
234
|
end
|
238
235
|
|
239
236
|
def clear_buffer
|
240
|
-
@buffer = ''
|
237
|
+
@buffer = ''.dup
|
241
238
|
|
242
239
|
# Prime the buffer with lexer encoding; otherwise,
|
243
240
|
# concatenation will produce varying results.
|
244
|
-
|
245
|
-
@buffer.force_encoding(@lexer.source_buffer.source.encoding)
|
246
|
-
end
|
241
|
+
@buffer.force_encoding(@lexer.source_buffer.source.encoding)
|
247
242
|
|
248
243
|
@buffer_s = nil
|
249
244
|
@buffer_e = nil
|