From 180802906190501e4eb9b9423adfb6116ceb334b Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Thu, 13 Jun 2019 00:29:45 +0900 Subject: make sync-default-gems GEM=irb Upgrade IRB to https://github.com/ruby/irb/commit/41ea43a4a732e094acfa1b0fc1473fdcda9e6227 Mostly backport changes. --- lib/irb/color.rb | 41 +++++++++++++++++++++++++++-------------- lib/irb/irb.gemspec | 1 + lib/irb/ruby-lex.rb | 31 ++++++++++++++++--------------- 3 files changed, 44 insertions(+), 29 deletions(-) (limited to 'lib') diff --git a/lib/irb/color.rb b/lib/irb/color.rb index b942299789..6b489646b5 100644 --- a/lib/irb/color.rb +++ b/lib/irb/color.rb @@ -67,7 +67,7 @@ module IRB # :nodoc: class << self def colorable? - $stdout.tty? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb')) + $stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb')) end def inspect_colorable?(obj) @@ -132,24 +132,37 @@ module IRB # :nodoc: private + # Ripper::Lexer::Elem#state is supported on Ruby 2.5+ + def supported? + return @supported if defined?(@supported) + @supported = Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.5.0') + end + def scan(code, allow_last_error:) pos = [1, 0] - Ripper::Lexer.new(code).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 + 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 + + 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) + yield(elem.event, str, elem.state) + end + else + lexer.parse.each do |elem| + yield(elem.event, elem.tok, elem.state) + end end end diff --git a/lib/irb/irb.gemspec b/lib/irb/irb.gemspec index d16d6b0ecc..12633bf15c 100644 --- a/lib/irb/irb.gemspec +++ b/lib/irb/irb.gemspec @@ -21,6 +21,7 @@ Gem::Specification.new do |spec| spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] + spec.add_dependency "reline" spec.add_development_dependency "bundler" spec.add_development_dependency "rake" end diff --git a/lib/irb/ruby-lex.rb b/lib/irb/ruby-lex.rb index d77354fb83..a57a5dfcd9 100644 --- a/lib/irb/ruby-lex.rb +++ b/lib/irb/ruby-lex.rb @@ -127,7 +127,6 @@ class RubyLex end def process_continue - continued_bits = Ripper::EXPR_BEG | Ripper::EXPR_FNAME # last token is always newline if @tokens.size >= 2 and @tokens[-2][1] == :on_regexp_end # end of regexp literal @@ -149,7 +148,7 @@ class RubyLex return true elsif @tokens.size >= 1 and @tokens[-1][1] == :on_heredoc_end # "EOH\n" return false - elsif @tokens.size >= 2 and @tokens[-2][3].anybits?(continued_bits) + elsif @tokens.size >= 2 and defined?(Ripper::EXPR_BEG) and @tokens[-2][3].anybits?(Ripper::EXPR_BEG | Ripper::EXPR_FNAME) # end of literal except for regexp return true end @@ -221,19 +220,21 @@ class RubyLex $VERBOSE = verbose end - last_lex_state = @tokens.last[3] - if last_lex_state.allbits?(Ripper::EXPR_BEG) - return false - elsif last_lex_state.allbits?(Ripper::EXPR_DOT) - return true - elsif last_lex_state.allbits?(Ripper::EXPR_CLASS) - return true - elsif last_lex_state.allbits?(Ripper::EXPR_FNAME) - return true - elsif last_lex_state.allbits?(Ripper::EXPR_VALUE) - return true - elsif last_lex_state.allbits?(Ripper::EXPR_ARG) - return false + if defined?(Ripper::EXPR_BEG) + last_lex_state = @tokens.last[3] + if last_lex_state.allbits?(Ripper::EXPR_BEG) + return false + elsif last_lex_state.allbits?(Ripper::EXPR_DOT) + return true + elsif last_lex_state.allbits?(Ripper::EXPR_CLASS) + return true + elsif last_lex_state.allbits?(Ripper::EXPR_FNAME) + return true + elsif last_lex_state.allbits?(Ripper::EXPR_VALUE) + return true + elsif last_lex_state.allbits?(Ripper::EXPR_ARG) + return false + end end false -- cgit v1.2.3