mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/irb] Suppress incomplete coding magic comment error
https://github.com/ruby/irb/commit/6a457edbd1
This commit is contained in:
parent
48eb1ad2c3
commit
78ccab2530
3 changed files with 52 additions and 20 deletions
|
@ -155,27 +155,29 @@ module IRB # :nodoc:
|
|||
pos = [1, 0]
|
||||
|
||||
verbose, $VERBOSE = $VERBOSE, nil
|
||||
lexer = Ripper::Lexer.new(code)
|
||||
if lexer.respond_to?(:scan) # Ruby 2.7+
|
||||
lexer.scan.each do |elem|
|
||||
str = elem.tok
|
||||
next if allow_last_error and /meets end of file|unexpected end-of-input/ =~ elem.message
|
||||
next if ([elem.pos[0], elem.pos[1] + str.bytesize] <=> pos) <= 0
|
||||
RubyLex.compile_with_errors_suppressed(code) do |inner_code|
|
||||
lexer = Ripper::Lexer.new(inner_code)
|
||||
if lexer.respond_to?(:scan) # Ruby 2.7+
|
||||
lexer.scan.each do |elem|
|
||||
str = elem.tok
|
||||
next if allow_last_error and /meets end of file|unexpected end-of-input/ =~ elem.message
|
||||
next if ([elem.pos[0], elem.pos[1] + str.bytesize] <=> pos) <= 0
|
||||
|
||||
str.each_line do |line|
|
||||
if line.end_with?("\n")
|
||||
pos[0] += 1
|
||||
pos[1] = 0
|
||||
else
|
||||
pos[1] += line.bytesize
|
||||
str.each_line do |line|
|
||||
if line.end_with?("\n")
|
||||
pos[0] += 1
|
||||
pos[1] = 0
|
||||
else
|
||||
pos[1] += line.bytesize
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
yield(elem.event, str, elem.state)
|
||||
end
|
||||
else
|
||||
lexer.parse.each do |elem|
|
||||
yield(elem.event, elem.tok, elem.state)
|
||||
yield(elem.event, str, elem.state)
|
||||
end
|
||||
else
|
||||
lexer.parse.each do |elem|
|
||||
yield(elem.event, elem.tok, elem.state)
|
||||
end
|
||||
end
|
||||
end
|
||||
$VERBOSE = verbose
|
||||
|
|
|
@ -30,6 +30,18 @@ class RubyLex
|
|||
@prompt = nil
|
||||
end
|
||||
|
||||
def self.compile_with_errors_suppressed(code)
|
||||
begin
|
||||
result = yield code
|
||||
rescue ArgumentError => e
|
||||
if e.message.match?(/unknown encoding name/) && code.match?(/\A(?<shebang>#.*\n)?#\s*coding\s*:.*(?<nl>\n)?/)
|
||||
code = code.gsub(/\A(?<shebang>#.*\n)?#\s*coding\s*:.*(?<nl>\n)?/, "\\k<shebang>#\\k<nl>")
|
||||
retry
|
||||
end
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
# io functions
|
||||
def set_input(io, p = nil, &block)
|
||||
@io = io
|
||||
|
@ -76,7 +88,10 @@ class RubyLex
|
|||
|
||||
def ripper_lex_without_warning(code)
|
||||
verbose, $VERBOSE = $VERBOSE, nil
|
||||
tokens = Ripper.lex(code)
|
||||
tokens = nil
|
||||
self.class.compile_with_errors_suppressed(code) do |inner_code|
|
||||
tokens = Ripper.lex(inner_code)
|
||||
end
|
||||
$VERBOSE = verbose
|
||||
tokens
|
||||
end
|
||||
|
@ -210,7 +225,9 @@ class RubyLex
|
|||
when 'jruby'
|
||||
JRuby.compile_ir(code)
|
||||
else
|
||||
RubyVM::InstructionSequence.compile(code)
|
||||
self.class.compile_with_errors_suppressed(code) do |inner_code|
|
||||
RubyVM::InstructionSequence.compile(inner_code)
|
||||
end
|
||||
end
|
||||
rescue EncodingError
|
||||
# This is for a hash with invalid encoding symbol, {"\xAE": 1}
|
||||
|
|
|
@ -126,5 +126,18 @@ module TestIRB
|
|||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
end
|
||||
end
|
||||
|
||||
def test_incomplete_coding_magic_comment
|
||||
input_with_correct_indents = [
|
||||
Row.new(%q(#coding:u), nil, 0),
|
||||
]
|
||||
|
||||
lines = []
|
||||
input_with_correct_indents.each do |row|
|
||||
lines << row.content
|
||||
assert_indenting(lines, row.current_line_spaces, false)
|
||||
assert_indenting(lines, row.new_line_spaces, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue