Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions test/reline/yamatanooroti/multiline_repl
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,9 @@ opt.on('--color-bold') {
}
}
opt.on('--auto-indent') {
AutoIndent.new
Reline.auto_indent_proc = lambda do |lines, line_index, byte_pointer, is_newline|
AutoIndent.calculate_indent(lines, line_index, byte_pointer, is_newline)
end
}
opt.on('--dialog VAL') { |v|
Reline.add_dialog_proc(:simple_dialog, lambda {
Expand Down Expand Up @@ -194,8 +196,7 @@ end
begin
prompt = ENV['RELINE_TEST_PROMPT'] || 'prompt> '
puts 'Multiline REPL.'
checker = TerminationChecker.new
while code = Reline.readmultiline(prompt, true) { |code| checker.terminated?(code) }
while code = Reline.readmultiline(prompt, true) { |code| TerminationChecker.terminated?(code) }
case code.chomp
when 'exit', 'quit', 'q'
exit 0
Expand Down
36 changes: 17 additions & 19 deletions test/reline/yamatanooroti/termination_checker.rb
Original file line number Diff line number Diff line change
@@ -1,28 +1,26 @@
require 'ripper'
require 'irb/ruby-lex'

class TerminationChecker < RubyLex
def terminated?(code)
code.gsub!(/\n*$/, '').concat("\n")
tokens = self.class.ripper_lex_without_warning(code)
continue = process_continue(tokens)
code_block_open = check_code_block(code, tokens)
indent = process_nesting_level(tokens)
ltype = process_literal_type(tokens)
if code_block_open or ltype or continue or indent > 0
false
else
true
end
module TerminationChecker
def self.terminated?(code)
Ripper.sexp(code) ? true : false
end
end

class AutoIndent < RubyLex
def initialize
@context = Struct.new("MockIRBContext", :auto_indent_mode, :workspace, :local_variables).new(true, nil, [])
module AutoIndent
def self.calculate_indent(lines, line_index, byte_pointer, is_newline)
if is_newline
2 * nesting_level(lines[0..line_index - 1])
else
lines = lines.dup
lines[line_index] = lines[line_index]&.byteslice(0, byte_pointer)
prev_level = nesting_level(lines[0..line_index - 1])
level = nesting_level(lines[0..line_index])
2 * level if level < prev_level
end
end

def auto_indent(&block)
Reline.auto_indent_proc = block
def self.nesting_level(lines)
code = lines.join("\n")
code.scan(/if|def|\(|\[|\{/).size - code.scan(/end|\)|\]|\}/).size
end
end
29 changes: 29 additions & 0 deletions test/reline/yamatanooroti/test_rendering.rb
Original file line number Diff line number Diff line change
Expand Up @@ -661,6 +661,35 @@ def test_update_cursor_correctly_when_just_cursor_moving
EOC
end

def test_auto_indent
start_terminal(10, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
"def hoge\nputs(\n1,\n2\n)\nend".lines do |line|
write line
end
close
assert_screen(<<~EOC)
Multiline REPL.
prompt> def hoge
prompt> puts(
prompt> 1,
prompt> 2
prompt> )
prompt> end
EOC
end

def test_auto_indent_when_inserting_line
start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
write 'aa(bb(cc(dd(ee('
write "\C-b" * 5 + "\n"
close
assert_screen(<<~EOC)
Multiline REPL.
prompt> aa(bb(cc(d
prompt> d(ee(
EOC
end

def test_suppress_auto_indent_just_after_pasted
start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/test/reline/yamatanooroti/multiline_repl --auto-indent}, startup_message: 'Multiline REPL.')
write("def hoge\n [[\n 3]]\ned")
Expand Down