diff options
author | Stan Lo <[email protected]> | 2023-05-19 04:00:29 +0900 |
---|---|---|
committer | git <[email protected]> | 2023-05-18 19:00:33 +0000 |
commit | cfb79973537e081da0ab1aa828883524716efe72 (patch) | |
tree | 93b551c71fa08320b7ec76c964f6b32f82ef15a7 /lib/irb/ruby-lex.rb | |
parent | d74b32db9d1e0234b17e4645d270394f7b657f85 (diff) |
[ruby/irb] Refactor RubyLex's input/io methods
(https://github.com/ruby/irb/pull/583)
1. Make `RubyLex#set_input` simply assign the input block. This matches
the behavior of `RubyLex#set_prompt`.
2. Merge `RubyLex#set_input`'s IO configuration logic with `#set_auto_indent`
into `#configure_io`.
Diffstat (limited to 'lib/irb/ruby-lex.rb')
-rw-r--r-- | lib/irb/ruby-lex.rb | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/lib/irb/ruby-lex.rb b/lib/irb/ruby-lex.rb index a156f3707a..ac734072df 100644 --- a/lib/irb/ruby-lex.rb +++ b/lib/irb/ruby-lex.rb @@ -43,7 +43,11 @@ class RubyLex end # io functions - def set_input(io, &block) + def set_input(&block) + @input = block + end + + def configure_io(io) @io = io if @io.respond_to?(:check_termination) @io.check_termination do |code| @@ -112,10 +116,22 @@ class RubyLex end end - if block_given? - @input = block - else - @input = Proc.new{@io.gets} + if @io.respond_to?(:auto_indent) and @context.auto_indent_mode + @io.auto_indent do |lines, line_index, byte_pointer, is_newline| + if is_newline + @tokens = self.class.ripper_lex_without_warning(lines[0..line_index].join("\n"), context: @context) + prev_spaces = find_prev_spaces(line_index) + depth_difference = check_newline_depth_difference + depth_difference = 0 if depth_difference < 0 + prev_spaces + depth_difference * 2 + else + code = line_index.zero? ? '' : lines[0..(line_index - 1)].map{ |l| l + "\n" }.join + last_line = lines[line_index]&.byteslice(0, byte_pointer) + code += last_line if last_line + @tokens = self.class.ripper_lex_without_warning(code, context: @context) + check_corresponding_token_depth(lines, line_index) + end + end end end @@ -184,26 +200,6 @@ class RubyLex prev_spaces end - def set_auto_indent - if @io.respond_to?(:auto_indent) and @context.auto_indent_mode - @io.auto_indent do |lines, line_index, byte_pointer, is_newline| - if is_newline - @tokens = self.class.ripper_lex_without_warning(lines[0..line_index].join("\n"), context: @context) - prev_spaces = find_prev_spaces(line_index) - depth_difference = check_newline_depth_difference - depth_difference = 0 if depth_difference < 0 - prev_spaces + depth_difference * 2 - else - code = line_index.zero? ? '' : lines[0..(line_index - 1)].map{ |l| l + "\n" }.join - last_line = lines[line_index]&.byteslice(0, byte_pointer) - code += last_line if last_line - @tokens = self.class.ripper_lex_without_warning(code, context: @context) - check_corresponding_token_depth(lines, line_index) - end - end - end - end - def check_state(code, tokens) ltype = process_literal_type(tokens) indent = process_nesting_level(tokens) |