summaryrefslogtreecommitdiff
path: root/lib/irb/cmd/show_source.rb
diff options
context:
space:
mode:
authorMasataka Pocke Kuwabara <kuwabara@pocke.me>2021-06-25 14:29:28 +0900
committergit <svn-admin@ruby-lang.org>2021-06-27 10:36:11 +0900
commit6eb7c663c665c633bdeae185d45e78832e672acc (patch)
tree7a8b6d2fe962698df1632781657f7baacdd921fc /lib/irb/cmd/show_source.rb
parentbf789af28a3b7108186743f3cb4fd2f649afdd20 (diff)
[ruby/irb] Improve performance of `show_source` for large class
https://github.com/ruby/irb/commit/2b79e9ad21
Diffstat (limited to 'lib/irb/cmd/show_source.rb')
-rw-r--r--lib/irb/cmd/show_source.rb15
1 files changed, 11 insertions, 4 deletions
diff --git a/lib/irb/cmd/show_source.rb b/lib/irb/cmd/show_source.rb
index 0bd40b7d4e..dcba1d1c71 100644
--- a/lib/irb/cmd/show_source.rb
+++ b/lib/irb/cmd/show_source.rb
@@ -59,11 +59,18 @@ module IRB
def find_end(file, first_line)
return first_line unless File.exist?(file)
lex = RubyLex.new
- code = +""
- File.read(file).lines[(first_line - 1)..-1].each_with_index do |line, i|
- _ltype, _indent, continue, code_block_open = lex.check_state(code << line)
+ lines = File.read(file).lines[(first_line - 1)..-1]
+ tokens = RubyLex.ripper_lex_without_warning(lines.join)
+ prev_tokens = []
+
+ # chunk with line number
+ tokens.chunk { |tok| tok[0][0] }.each do |lnum, chunk|
+ code = lines[0..lnum].join
+ prev_tokens.concat chunk
+ continue = lex.process_continue(prev_tokens)
+ code_block_open = lex.check_code_block(code, prev_tokens)
if !continue && !code_block_open
- return first_line + i
+ return first_line + lnum
end
end
first_line