[ruby/irb] Simplify RubyLex.compile_with_errors_suppressed

nobu-san reviewed,

https://github.com/ruby/irb/pull/106#pullrequestreview-423400033
> How about lexer = Ripper::Lexer.new(";\n#{code}", nil, 0)?
> Encoding pragma is effective only at the beginning.
> And the semicolon and newline will be skipped because the position is before
> the initial pos.

I employ the way.

Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>

https://github.com/ruby/irb/commit/e593cc65b7
This commit is contained in:
aycabta 2020-06-07 23:29:01 +09:00
Родитель 1dfd24a7fc
Коммит c72a2fad97
2 изменённых файлов: 11 добавлений и 12 удалений

Просмотреть файл

@ -155,8 +155,8 @@ module IRB # :nodoc:
pos = [1, 0]
verbose, $VERBOSE = $VERBOSE, nil
RubyLex.compile_with_errors_suppressed(code) do |inner_code|
lexer = Ripper::Lexer.new(inner_code)
RubyLex.compile_with_errors_suppressed(code) do |inner_code, line_no|
lexer = Ripper::Lexer.new(inner_code, '(ripper)', line_no)
if lexer.respond_to?(:scan) # Ruby 2.7+
lexer.scan.each do |elem|
str = elem.tok

Просмотреть файл

@ -31,14 +31,13 @@ class RubyLex
end
def self.compile_with_errors_suppressed(code)
line_no = 1
begin
result = yield code
result = yield code, line_no
rescue ArgumentError => e
magic_comment_regexp = /\A(?<shebang>#.*\n)?#\s*(?:encoding|coding)\s*:.*(?<nl>\n)?/
if e.message.match?(/unknown encoding name/) && code.match?(magic_comment_regexp)
code = code.gsub(magic_comment_regexp, "\\k<shebang>#\\k<nl>")
retry
end
code = ";\n#{code}"
line_no = 0
result = yield code, line_no
end
result
end
@ -90,8 +89,8 @@ class RubyLex
def ripper_lex_without_warning(code)
verbose, $VERBOSE = $VERBOSE, nil
tokens = nil
self.class.compile_with_errors_suppressed(code) do |inner_code|
tokens = Ripper.lex(inner_code)
self.class.compile_with_errors_suppressed(code) do |inner_code, line_no|
tokens = Ripper.lex(inner_code, '-', line_no)
end
$VERBOSE = verbose
tokens
@ -226,8 +225,8 @@ class RubyLex
when 'jruby'
JRuby.compile_ir(code)
else
self.class.compile_with_errors_suppressed(code) do |inner_code|
RubyVM::InstructionSequence.compile(inner_code)
self.class.compile_with_errors_suppressed(code) do |inner_code, line_no|
RubyVM::InstructionSequence.compile(inner_code, nil, nil, line_no)
end
end
rescue EncodingError