katakata_irb 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,102 +0,0 @@
1
- diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
2
- index 8153aab..1c33a4b 100644
3
- --- a/lib/reline/line_editor.rb
4
- +++ b/lib/reline/line_editor.rb
5
- @@ -449,12 +449,8 @@ class Reline::LineEditor
6
- Reline::IOGate.move_cursor_up(@first_line_started_from + @started_from - @scroll_partial_screen)
7
- Reline::IOGate.move_cursor_column(0)
8
- @scroll_partial_screen = nil
9
- - prompt, prompt_width, prompt_list = check_multiline_prompt(whole_lines)
10
- - if @previous_line_index
11
- - new_lines = whole_lines(index: @previous_line_index, line: @line)
12
- - else
13
- - new_lines = whole_lines
14
- - end
15
- + new_lines = whole_lines
16
- + prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
17
- modify_lines(new_lines).each_with_index do |line, index|
18
- @output.write "#{prompt_list ? prompt_list[index] : prompt}#{line}\n"
19
- Reline::IOGate.erase_after_cursor
20
- @@ -490,11 +486,7 @@ class Reline::LineEditor
21
- if @is_multiline
22
- if finished?
23
- # Always rerender on finish because output_modifier_proc may return a different output.
24
- - if @previous_line_index
25
- - new_lines = whole_lines(index: @previous_line_index, line: @line)
26
- - else
27
- - new_lines = whole_lines
28
- - end
29
- + new_lines = whole_lines
30
- line = modify_lines(new_lines)[@line_index]
31
- clear_dialog
32
- prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
33
- @@ -1013,11 +1005,7 @@ class Reline::LineEditor
34
- end
35
-
36
- private def rerender_changed_current_line
37
- - if @previous_line_index
38
- - new_lines = whole_lines(index: @previous_line_index, line: @line)
39
- - else
40
- - new_lines = whole_lines
41
- - end
42
- + new_lines = whole_lines
43
- prompt, prompt_width, prompt_list = check_multiline_prompt(new_lines)
44
- all_height = calculate_height_by_lines(new_lines, prompt_list || prompt)
45
- diff = all_height - @highest_in_all
46
- @@ -1698,7 +1686,7 @@ class Reline::LineEditor
47
- return if not @check_new_auto_indent and @previous_line_index # move cursor up or down
48
- if @check_new_auto_indent and @previous_line_index and @previous_line_index > 0 and @line_index > @previous_line_index
49
- # Fix indent of a line when a newline is inserted to the next
50
- - new_lines = whole_lines(index: @previous_line_index, line: @line)
51
- + new_lines = whole_lines
52
- new_indent = @auto_indent_proc.(new_lines[0..-3].push(''), @line_index - 1, 0, true)
53
- md = @line.match(/\A */)
54
- prev_indent = md[0].count(' ')
55
- @@ -1713,11 +1701,7 @@ class Reline::LineEditor
56
- @line = ' ' * new_indent + @line.lstrip
57
- end
58
- end
59
- - if @previous_line_index
60
- - new_lines = whole_lines(index: @previous_line_index, line: @line)
61
- - else
62
- - new_lines = whole_lines
63
- - end
64
- + new_lines = whole_lines
65
- new_indent = @auto_indent_proc.(new_lines, @line_index, @byte_pointer, @check_new_auto_indent)
66
- new_indent = @cursor_max if new_indent&.> @cursor_max
67
- if new_indent&.>= 0
68
- @@ -1803,11 +1787,7 @@ class Reline::LineEditor
69
- target = before
70
- end
71
- if @is_multiline
72
- - if @previous_line_index
73
- - lines = whole_lines(index: @previous_line_index, line: @line)
74
- - else
75
- - lines = whole_lines
76
- - end
77
- + lines = whole_lines
78
- if @line_index > 0
79
- preposing = lines[0..(@line_index - 1)].join("\n") + "\n" + preposing
80
- end
81
- @@ -1907,7 +1887,7 @@ class Reline::LineEditor
82
- @cursor_max = calculate_width(@line)
83
- end
84
-
85
- - def whole_lines(index: @line_index, line: @line)
86
- + def whole_lines(index: @previous_line_index || @line_index, line: @line)
87
- temp_lines = @buffer_of_lines.dup
88
- temp_lines[index] = line
89
- temp_lines
90
- @@ -1917,11 +1897,7 @@ class Reline::LineEditor
91
- if @buffer_of_lines.size == 1 and @line.nil?
92
- nil
93
- else
94
- - if @previous_line_index
95
- - whole_lines(index: @previous_line_index, line: @line).join("\n")
96
- - else
97
- - whole_lines.join("\n")
98
- - end
99
- + whole_lines.join("\n")
100
- end
101
- end
102
-
@@ -1,221 +0,0 @@
1
- require 'irb'
2
- require_relative 'trex'
3
-
4
- module KatakataIrb::RubyLexPatch
5
- def self.patch_to_ruby_lex
6
- (RubyLex.instance_methods(false) - [:set_prompt, :process_continue, :check_code_block]).each { RubyLex.remove_method _1 }
7
- RubyLex.prepend self
8
- end
9
-
10
- def self.complete_tokens(code, context: nil)
11
- incomplete_tokens = RubyLex.ripper_lex_without_warning(code, context: context)
12
- KatakataIrb::TRex.interpolate_ripper_ignored_tokens(code, incomplete_tokens)
13
- end
14
-
15
- def calc_nesting_depth(opens)
16
- indent_level = 0
17
- nesting_level = 0
18
- opens.each_with_index do |t, index|
19
- case t.event
20
- when :on_heredoc_beg
21
- if opens[index + 1]&.event != :on_heredoc_beg
22
- if t.tok.start_with?('<<~')
23
- indent_level += 1
24
- else
25
- indent_level = 0
26
- end
27
- end
28
- when :on_tstring_beg, :on_regexp_beg, :on_symbeg
29
- indent_level += 1 if t.tok[0] == '%'
30
- when :on_embdoc_beg
31
- indent_level = 0
32
- else
33
- nesting_level += 1
34
- indent_level += 1
35
- end
36
- end
37
- [indent_level, nesting_level]
38
- end
39
-
40
- def process_indent_level(tokens)
41
- opens = KatakataIrb::TRex.parse(tokens)
42
- indent, _nesting = calc_nesting_depth(opens)
43
- indent * 2
44
- end
45
-
46
- def check_corresponding_token_depth(tokens, line_index)
47
- line_results = KatakataIrb::TRex.parse_line(tokens)
48
- result = line_results[line_index]
49
- return unless result
50
- _tokens, prev, opens, min_depth = result
51
- depth, = calc_nesting_depth(opens.take(min_depth))
52
- prev_depth, = calc_nesting_depth(prev)
53
- depth * 2 if depth < prev_depth
54
- end
55
-
56
- def ltype_from_open_tokens(opens)
57
- return nil if opens.empty?
58
- case opens.last.tok
59
- when ?`, /^<<[-~]?`/, /^%x.$/
60
- ?`
61
- when ?', /^<<[-~]?'/, /^%q.$/
62
- ?'
63
- when ?", /^<</, /^%.$/, /^%Q.$/
64
- ?"
65
- when ":'", ':"', ':', /^%s.$/
66
- ':'
67
- when /^%[iwIW].$/
68
- ']'
69
- when '/', /^%r.$/
70
- '/'
71
- end
72
- end
73
-
74
- def check_termination_in_prev_line(code, context: nil)
75
- tokens = self.class.ripper_lex_without_warning(code, context: context)
76
- last_newline_index = tokens.rindex { |t| t.tok.include?("\n") }
77
- index = (0...last_newline_index).reverse_each.find { |i| tokens[i].tok.include?("\n") }
78
- return false unless index
79
-
80
- last_line_tokens = tokens[(index + 1)..(tokens.size - 1)]
81
- first_token = last_line_tokens.find do |t|
82
- ![:on_sp, :on_ignored_sp, :on_comment].include?(t.event)
83
- end
84
-
85
- if first_token && first_token.state != Ripper::EXPR_DOT
86
- tokens_without_last_line = tokens[0..index]
87
- if check_termination(tokens_without_last_line.map(&:tok).join, context: context)
88
- return last_line_tokens.map(&:tok).join
89
- end
90
- end
91
- false
92
- end
93
-
94
- def check_termination(code, context: nil)
95
- tokens = KatakataIrb::RubyLexPatch.complete_tokens(code, context: context)
96
- opens = KatakataIrb::TRex.parse(tokens)
97
- opens.empty? && !process_continue(tokens) && !check_code_block(code, tokens)
98
- end
99
-
100
- def set_input(io, p = nil, context: nil, &block)
101
- @io = io
102
- if @io.respond_to?(:check_termination)
103
- @io.check_termination do |code|
104
- if Reline::IOGate.in_pasting?
105
- rest = check_termination_in_prev_line(code, context: context)
106
- if rest
107
- Reline.delete_text
108
- rest.bytes.reverse_each do |c|
109
- Reline.ungetc(c)
110
- end
111
- true
112
- else
113
- false
114
- end
115
- else
116
- # Accept any single-line input for symbol aliases or commands that transform args
117
- command = code.split(/\s/, 2).first
118
- if context.symbol_alias?(command) || context.transform_args?(command)
119
- next true
120
- end
121
-
122
- code.gsub!(/\s*\z/, '').concat("\n")
123
- check_termination(code, context: context)
124
- end
125
- end
126
- end
127
- if @io.respond_to?(:dynamic_prompt)
128
- @io.dynamic_prompt do |lines|
129
- lines << '' if lines.empty?
130
- code = lines.map{ |l| l + "\n" }.join
131
- tokens = KatakataIrb::RubyLexPatch.complete_tokens code, context: context
132
- line_results = KatakataIrb::TRex.parse_line(tokens)
133
- continue = false
134
- tokens_until_line = []
135
- line_results.map.with_index do |(line_tokens, _prev_opens, next_opens), line_num_offset|
136
- line_tokens.each do |token, _s|
137
- tokens_until_line << token if token != tokens_until_line.last
138
- end
139
- continue = process_continue(tokens_until_line)
140
- prompt next_opens, continue, line_num_offset
141
- end
142
- end
143
- end
144
-
145
- if p.respond_to?(:call)
146
- @input = p
147
- elsif block_given?
148
- @input = block
149
- else
150
- @input = Proc.new{@io.gets}
151
- end
152
- end
153
-
154
- def set_auto_indent(context)
155
- if @io.respond_to?(:auto_indent) and context.auto_indent_mode
156
- @io.auto_indent do |lines, line_index, byte_pointer, is_newline|
157
- if is_newline
158
- tokens = KatakataIrb::RubyLexPatch.complete_tokens(lines[0..line_index].join("\n"), context: context)
159
- process_indent_level(tokens)
160
- else
161
- code = line_index.zero? ? '' : lines[0..(line_index - 1)].map{ |l| l + "\n" }.join
162
- last_line = lines[line_index]&.byteslice(0, byte_pointer)
163
- code += last_line if last_line
164
- tokens = KatakataIrb::RubyLexPatch.complete_tokens(code, context: context)
165
- check_corresponding_token_depth(tokens, line_index)
166
- end
167
- end
168
- end
169
- end
170
-
171
- def prompt(opens, continue, line_num_offset)
172
- ltype = ltype_from_open_tokens(opens)
173
- _indent, nesting_level = calc_nesting_depth(opens)
174
- @prompt.call(ltype, nesting_level, opens.any? || continue, @line_no + line_num_offset)
175
- end
176
-
177
- # TODO: do not use this. change the api. example: @input.call(prompt)
178
- def store_prompt_to_irb(opens, continue, line_num_offset)
179
- prompt(opens, continue, line_num_offset)
180
- end
181
-
182
- def readmultiline(context)
183
- if @io.respond_to? :check_termination
184
- store_prompt_to_irb([], false, 0)
185
- @input.call
186
- else
187
- # nomultiline
188
- line = ''
189
- line_offset = 0
190
- store_prompt_to_irb([], false, 0)
191
- loop do
192
- l = @input.call
193
- unless l
194
- return if line.empty?
195
- next
196
- end
197
- line << l
198
- tokens = KatakataIrb::RubyLexPatch.complete_tokens(line, context: context)
199
- _line_tokens, _prev_opens, next_opens = KatakataIrb::TRex.parse_line(tokens).last
200
- return line if next_opens.empty?
201
- line_offset += 1
202
- store_prompt_to_irb(next_opens, true, line_offset)
203
- end
204
- end
205
- end
206
-
207
- def each_top_level_statement(context = nil)
208
- loop do
209
- begin
210
- line = readmultiline(context)
211
- break unless line
212
- if line != "\n"
213
- line.force_encoding(@io.encoding)
214
- yield line, @line_no
215
- end
216
- @line_no += line.count("\n")
217
- rescue RubyLex::TerminateLineInput
218
- end
219
- end
220
- end
221
- end