summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2019-06-13 00:29:45 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-06-13 00:32:20 +0900
commit180802906190501e4eb9b9423adfb6116ceb334b (patch)
tree03a1fa0f4e8561528c69b4c7673684dc4f5e9072 /lib
parent88411d350e9e3eb6425375238a20af9b6aae28ae (diff)
make sync-default-gems GEM=irb
Upgrade IRB to https://github.com/ruby/irb/commit/41ea43a4a732e094acfa1b0fc1473fdcda9e6227 Mostly backport changes.
Diffstat (limited to 'lib')
-rw-r--r--lib/irb/color.rb41
-rw-r--r--lib/irb/irb.gemspec1
-rw-r--r--lib/irb/ruby-lex.rb31
3 files changed, 44 insertions, 29 deletions
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