diff options
author | aycabta <aycabta@gmail.com> | 2021-01-19 13:01:31 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-19 13:01:31 +0900 |
commit | 58509767d17f7d4c6002f1159cefc0e038bbd629 (patch) | |
tree | 349493d13bcd0aa02cc4234abb2b927a4b75208f /lib/irb | |
parent | 29777cb32ad6417c3583a81b01127c93cd667e77 (diff) |
Backport lib/reline, ext/readline, and lib/irb for 3.0.1 (#4085)
* Get rid of inconsistent dll linkages against vcpkg readline
* [ruby/irb] Enhance colored inspect output
https://github.com/ruby/irb/commit/dffcdb5269
* [ruby/irb] Add color_printer.rb to gemspec
https://github.com/ruby/irb/commit/b4df0fd8b2
* [ruby/irb] Fix failing tests
https://github.com/ruby/irb/commit/7723ade899
* irb: add more syntax errors colorizing support (#3967)
* [ruby/irb] Do not colorize partially-correct inspect
This is to prevent a yellow-mixed output for ActiveSupport::TimeWithZone.
Follows up https://github.com/ruby/irb/pull/159 and https://github.com/ruby/ruby/pull/3967.
https://github.com/ruby/irb/commit/a5804c3560bb1de3ea8e40002635bff87f6a2825
* [ruby/irb] Remove unnecessary ignore_error in dispatch_seq
Just forgotten in https://github.com/ruby/irb/commit/a5804c3560bb1de3ea8e40002635bff87f6a2825
https://github.com/ruby/irb/commit/e42e548793
* Increase timeout for reline with --jit-wait
for failures like:
http://ci.rvm.jp/logfiles/brlog.trunk-mjit-wait.20201229-130509
http://ci.rvm.jp/logfiles/brlog.trunk-mjit-wait.20201229-165132
http://ci.rvm.jp/logfiles/brlog.trunk-mjit-wait.20201228-015519
* [ruby/irb] Stringify when a non-object is passed to PP#text
If a nested object is passed to #pp, it may be sometimes passed to the #text
method as an object without being stringified.
This is fixed on the Ruby main repository;
https://github.com/ruby/ruby/commit/433a3be86a811de0b4adbb92e054ee3a6fc6b4d8
but it was a bug of Ripper so still needs this workaround for using irb
as a gem on Ruby 3.0.0 or earlier.
Co-authored-by: k0kubun <takashikkbn@gmail.com>
https://github.com/ruby/irb/commit/8d13df22ee
* [ruby/irb] Newline in oneliner def doesn't reset indent
This closes ruby/irb#132.
https://github.com/ruby/irb/commit/43456dcf5e
* [ruby/irb] Escape invalid byte sequence in Exception
This fixes ruby/irb#141.
https://github.com/ruby/irb/commit/0815317d42
* [ruby/irb] Handle indentations related to keyword "do" correctly
This fixes ruby/irb#158.
https://github.com/ruby/irb/commit/964643400b
* [ruby/irb] Heredoc may contain multiple newlines in a single token
Use the start token as the indentation criteria so that it works properly in
heredoc.
ref. https://github.com/ruby/reline/pull/242
https://github.com/ruby/irb/commit/9704808dfd
* [ruby/irb] Use Ripper::Lexer#scan to take broken tokens
ref. https://github.com/ruby/reline/pull/242
https://github.com/ruby/irb/commit/54f90cb6c9
* [ruby/irb] Use error tokens if there are no correct tokens in the same place
For example, the broken code "%www" will result in only one error token.
https://github.com/ruby/irb/commit/9fa39a7cf3
* [ruby/irb] Ensure to restore $VERBOSE
https://github.com/ruby/irb/commit/cef474a76a
* 600x larger timeout for Reline
I didn't notice it's msec. 2.5s is too short.
http://ci.rvm.jp/results/trunk-mjit-wait@phosphorus-docker/3311385
* [ruby/irb] fix typo in `IRB::Irb#convert_invalid_byte_sequence`
https://github.com/ruby/irb/commit/d09d3c3d68
* [ruby/irb] do not escape a predicate method for doc namespace
* Fixes #88
https://github.com/ruby/irb/commit/d431a30af4
* [ruby/irb] refactoring an error handling in `IRB::Inspector`
* moved rescue clause to `#inspect_value` to catch all failures in inspectors
* test with all (currently five kind of) inspect modes
- tweaked the input due to only `Marshal` can inspect(dump) a `BasicObject`
https://github.com/ruby/irb/commit/9d112fab8e
* [ruby/irb] Use Exception#full_message to show backtrace in the correct order
[Bug #17466]
https://github.com/ruby/irb/commit/1c76845cca
* [ruby/irb] Fix BACK_TRACE_LIMIT logic
https://github.com/ruby/irb/commit/30dc5d43fe
* irb: Drop lines from backtrace for tests in Ruby repository
* [ruby/reline] Update cursor correctly when just cursor moving
This fixes ruby/reline#236 and ruby/reline#239.
https://github.com/ruby/reline/commit/3e3c89d00b
* [ruby/reline] Correct var names in Reline were different from vi-*-mode-string
https://github.com/ruby/reline/commit/8255fc93b9
* [ruby/reline] Remove debug print
https://github.com/ruby/reline/commit/d7fbaedc6a
* [ruby/reline] Suppress crashing when auto_indent_proc returns broken indent info
Co-authored-by: Juanito Fatas <me@juanitofatas.com>
https://github.com/ruby/reline/commit/7c24276275
* [ruby/reline] Suppress crashing when dynamic_prompt_proc returns a broken prompt list
Co-authored-by: Juanito Fatas <me@juanitofatas.com>
https://github.com/ruby/reline/commit/558f7be168
* [ruby/reline] Suppress auto indent for adding newlines in pasting
Co-authored-by: Juanito Fatas <me@juanitofatas.com>
https://github.com/ruby/reline/commit/074bb017a7
* [ruby/reline] Add acknowledgments and license for rb-readline
https://github.com/ruby/reline/commit/19df59b916
* [ruby/irb] Fix comment, irb gem supports 2.5.0 or older
https://github.com/ruby/irb/commit/36118015ba
* should use `assert_include` here.
Random ordering test can introduce antoher candidate so it should be
`assert_include`.
* [ruby/irb] Add missing require
This is useful if you want to use IRB::ColorPrinter as a library like:
```
begin
require 'irb/color_printer'
IRB::ColorPrinter.pp(obj)
rescue LoadError
pp(obj)
end
```
https://github.com/ruby/irb/commit/f8461691c7
* [ruby/irb] Make IRB::ColorPrinter.pp compatible with PP.pp
The incompatible interface is not helpful, again if you want to use it
as a standalone library, falling it back to PP.
Original PP.pp also ends with `out << "\n"`.
https://github.com/ruby/irb/commit/4c74c7d84c
* Suppress constant redefinition warnings
* Fix the failing test with XDG_CONFIG_HOME
* [ruby/irb] Version 1.3.1
https://github.com/ruby/irb/commit/c230d08911
* [ruby/reline] Handle ed_search_{prev,next}_history in multiline correctly
The current line was being handled incorrectly when displaying the hit
history, so it has been fixed to be correct.
https://github.com/ruby/reline/commit/a3df4343b3
* [ruby/reline] Move the cursor correctly when deleting at eol
This fixes ruby/reline#246.
https://github.com/ruby/reline/commit/07a73ba601
* [ruby/reline] Version 0.2.1
https://github.com/ruby/reline/commit/a3b3c6ee60
* [ruby/reline] Initialize a variable just in case
https://github.com/ruby/reline/commit/29b10f6e98
* [ruby/reline] Tests with yamatanooroti don't need chdir
Because of chdir, log files ware created in temporary directries on Windows.
https://github.com/ruby/reline/commit/200b469a68
* [ruby/reline] Windows needs more times to wait rendering
https://github.com/ruby/reline/commit/53ff2b09c7
* [ruby/reline] Support for change in Windows-specific behavior at eol
The behavior of automatically moving the cursor to the next line when
displaying a char at the eol on Windows suddenly disappeared.
https://github.com/ruby/reline/commit/cad4de6ee8
* [ruby/reline] Reline::Windows.erase_after_cursor erases attributes too
https://github.com/ruby/reline/commit/68b961dfc7
* [ruby/irb] [ruby/irb] [ruby/reline] Version 0.2.2
https://github.com/ruby/reline/commit/dfb710946f
https://github.com/ruby/irb/commit/1a1cdf9628
https://github.com/ruby/irb/commit/fe99faf8bd
* [ruby/irb] handle `__ENCODING__` as a keyword as well
https://github.com/ruby/irb/commit/a6a33d908f
* [ruby/irb] handle repeated exception separately
https://github.com/ruby/irb/commit/fcf6b34bc5
* [ruby/irb] skip a failling test on TruffleRuby
* due to the difference of backtrace pointed out by @aycabta
https://github.com/ruby/irb/commit/5e00a0ae61
* [ruby/irb] Version 1.3.2
https://github.com/ruby/irb/commit/a7699026cc
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
Co-authored-by: Takashi Kokubun <takashikkbn@gmail.com>
Co-authored-by: Nobuhiro IMAI <nov@yo.rim.or.jp>
Co-authored-by: Koichi Sasada <ko1@atdot.net>
Co-authored-by: Hiroshi SHIBATA <hsbt@ruby-lang.org>
Diffstat (limited to 'lib/irb')
-rw-r--r-- | lib/irb/color.rb | 19 | ||||
-rw-r--r-- | lib/irb/color_printer.rb | 28 | ||||
-rw-r--r-- | lib/irb/completion.rb | 22 | ||||
-rw-r--r-- | lib/irb/inspector.rb | 26 | ||||
-rw-r--r-- | lib/irb/irb.gemspec | 1 | ||||
-rw-r--r-- | lib/irb/ruby-lex.rb | 133 | ||||
-rw-r--r-- | lib/irb/version.rb | 4 | ||||
-rw-r--r-- | lib/irb/workspace.rb | 1 |
8 files changed, 177 insertions, 57 deletions
diff --git a/lib/irb/color.rb b/lib/irb/color.rb index 0f49291d85..a054bb20f8 100644 --- a/lib/irb/color.rb +++ b/lib/irb/color.rb @@ -17,7 +17,7 @@ module IRB # :nodoc: CYAN = 36 TOKEN_KEYWORDS = { - on_kw: ['nil', 'self', 'true', 'false', '__FILE__', '__LINE__'], + on_kw: ['nil', 'self', 'true', 'false', '__FILE__', '__LINE__', '__ENCODING__'], on_const: ['ENV'], } private_constant :TOKEN_KEYWORDS @@ -60,6 +60,10 @@ module IRB # :nodoc: on_words_beg: [[RED, BOLD], ALL], on_parse_error: [[RED, REVERSE], ALL], compile_error: [[RED, REVERSE], ALL], + on_assign_error: [[RED, REVERSE], ALL], + on_alias_error: [[RED, REVERSE], ALL], + on_class_name_error:[[RED, REVERSE], ALL], + on_param_error: [[RED, REVERSE], ALL], } rescue NameError # Give up highlighting Ripper-incompatible older Ruby @@ -67,6 +71,9 @@ module IRB # :nodoc: end private_constant :TOKEN_SEQ_EXPRS + ERROR_TOKENS = TOKEN_SEQ_EXPRS.keys.select { |k| k.to_s.end_with?('error') } + private_constant :ERROR_TOKENS + class << self def colorable? $stdout.tty? && supported? && (/mswin|mingw/ =~ RUBY_PLATFORM || (ENV.key?('TERM') && ENV['TERM'] != 'dumb')) @@ -107,7 +114,7 @@ module IRB # :nodoc: # If `complete` is false (code is incomplete), this does not warn compile_error. # This option is needed to avoid warning a user when the compile_error is happening # because the input is not wrong but just incomplete. - def colorize_code(code, complete: true) + def colorize_code(code, complete: true, ignore_error: false) return code unless colorable? symbol_state = SymbolState.new @@ -115,6 +122,11 @@ module IRB # :nodoc: length = 0 scan(code, allow_last_error: !complete) do |token, str, expr| + # IRB::ColorPrinter skips colorizing fragments with any invalid token + if ignore_error && ERROR_TOKENS.include?(token) + return Reline::Unicode.escape_for_print(code) + end + in_symbol = symbol_state.scan_token(token) str.each_line do |line| line = Reline::Unicode.escape_for_print(line) @@ -180,11 +192,12 @@ module IRB # :nodoc: end end end + ensure $VERBOSE = verbose end def dispatch_seq(token, expr, str, in_symbol:) - if token == :on_parse_error or token == :compile_error + if ERROR_TOKENS.include?(token) TOKEN_SEQ_EXPRS[token][0] elsif in_symbol [YELLOW] diff --git a/lib/irb/color_printer.rb b/lib/irb/color_printer.rb new file mode 100644 index 0000000000..73a150f881 --- /dev/null +++ b/lib/irb/color_printer.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true +require 'pp' +require 'irb/color' + +module IRB + class ColorPrinter < ::PP + def self.pp(obj, out = $>, width = 79) + q = ColorPrinter.new(out, width) + q.guard_inspect_key {q.pp obj} + q.flush + out << "\n" + end + + def text(str, width = nil) + unless str.is_a?(String) + str = str.inspect + end + width ||= str.length + + case str + when /\A#</, '=', '>' + super(Color.colorize(str, [:GREEN]), width) + else + super(Color.colorize_code(str, ignore_error: true), width) + end + end + end +end diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb index 6d82139aeb..22a1ad1d3d 100644 --- a/lib/irb/completion.rb +++ b/lib/irb/completion.rb @@ -47,7 +47,7 @@ module IRB when /^((["'`]).*\2)\.([^.]*)$/ # String receiver = $1 - message = Regexp.quote($3) + message = $3 candidates = String.instance_methods.collect{|m| m.to_s} if doc_namespace @@ -59,7 +59,7 @@ module IRB when /^(\/[^\/]*\/)\.([^.]*)$/ # Regexp receiver = $1 - message = Regexp.quote($2) + message = $2 candidates = Regexp.instance_methods.collect{|m| m.to_s} if doc_namespace @@ -71,7 +71,7 @@ module IRB when /^([^\]]*\])\.([^.]*)$/ # Array receiver = $1 - message = Regexp.quote($2) + message = $2 candidates = Array.instance_methods.collect{|m| m.to_s} if doc_namespace @@ -83,7 +83,7 @@ module IRB when /^([^\}]*\})\.([^.]*)$/ # Proc or Hash receiver = $1 - message = Regexp.quote($2) + message = $2 proc_candidates = Proc.instance_methods.collect{|m| m.to_s} hash_candidates = Hash.instance_methods.collect{|m| m.to_s} @@ -117,7 +117,7 @@ module IRB when /^([A-Z].*)::([^:.]*)$/ # Constant or class methods receiver = $1 - message = Regexp.quote($2) + message = $2 begin candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind) candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind) @@ -134,7 +134,7 @@ module IRB # Symbol receiver = $1 sep = $2 - message = Regexp.quote($3) + message = $3 candidates = Symbol.instance_methods.collect{|m| m.to_s} if doc_namespace @@ -147,7 +147,7 @@ module IRB # Numeric receiver = $~[:num] sep = $~[:sep] - message = Regexp.quote($~[:mes]) + message = $~[:mes] begin instance = eval(receiver, bind) @@ -169,7 +169,7 @@ module IRB # Numeric(0xFFFF) receiver = $1 sep = $2 - message = Regexp.quote($3) + message = $3 begin instance = eval(receiver, bind) @@ -201,7 +201,7 @@ module IRB # variable.func or func.func receiver = $1 sep = $2 - message = Regexp.quote($3) + message = $3 gv = eval("global_variables", bind).collect{|m| m.to_s}.push("true", "false", "nil") lv = eval("local_variables", bind).collect{|m| m.to_s} @@ -244,7 +244,7 @@ module IRB # unknown(maybe String) receiver = "" - message = Regexp.quote($1) + message = $1 candidates = String.instance_methods(true).collect{|m| m.to_s} if doc_namespace @@ -294,7 +294,7 @@ module IRB Operators = %w[% & * ** + - / < << <= <=> == === =~ > >= >> [] []= ^ ! != !~] def self.select_message(receiver, message, candidates, sep = ".") - candidates.grep(/^#{message}/).collect do |e| + candidates.grep(/^#{Regexp.quote(message)}/).collect do |e| case e when /^[a-zA-Z_]/ receiver + sep + e diff --git a/lib/irb/inspector.rb b/lib/irb/inspector.rb index 671b32b6e8..c2f3b605db 100644 --- a/lib/irb/inspector.rb +++ b/lib/irb/inspector.rb @@ -100,29 +100,27 @@ module IRB # :nodoc: # Proc to call when the input is evaluated and output in irb. def inspect_value(v) @inspect.call(v) + rescue + puts "(Object doesn't support #inspect)" + '' end end Inspector.def_inspector([false, :to_s, :raw]){|v| v.to_s} - Inspector.def_inspector([true, :p, :inspect]){|v| - begin - result = v.inspect - if IRB.conf[:MAIN_CONTEXT]&.use_colorize? && Color.inspect_colorable?(v) - result = Color.colorize_code(result) - end - result - rescue NoMethodError - puts "(Object doesn't support #inspect)" - '' - end - } - Inspector.def_inspector([:pp, :pretty_inspect], proc{require "pp"}){|v| - result = v.pretty_inspect.chomp + Inspector.def_inspector([:p, :inspect]){|v| + result = v.inspect if IRB.conf[:MAIN_CONTEXT]&.use_colorize? && Color.inspect_colorable?(v) result = Color.colorize_code(result) end result } + Inspector.def_inspector([true, :pp, :pretty_inspect], proc{require "irb/color_printer"}){|v| + if IRB.conf[:MAIN_CONTEXT]&.use_colorize? + IRB::ColorPrinter.pp(v, '').chomp + else + v.pretty_inspect.chomp + end + } Inspector.def_inspector([:yaml, :YAML], proc{require "yaml"}){|v| begin YAML.dump(v) diff --git a/lib/irb/irb.gemspec b/lib/irb/irb.gemspec index aba3f15675..9d889dfbf6 100644 --- a/lib/irb/irb.gemspec +++ b/lib/irb/irb.gemspec @@ -38,6 +38,7 @@ Gem::Specification.new do |spec| "lib/irb/cmd/pushws.rb", "lib/irb/cmd/subirb.rb", "lib/irb/color.rb", + "lib/irb/color_printer.rb", "lib/irb/completion.rb", "lib/irb/context.rb", "lib/irb/easter-egg.rb", diff --git a/lib/irb/ruby-lex.rb b/lib/irb/ruby-lex.rb index 9914aece5e..35af148d02 100644 --- a/lib/irb/ruby-lex.rb +++ b/lib/irb/ruby-lex.rb @@ -106,24 +106,72 @@ class RubyLex end end + ERROR_TOKENS = [ + :on_parse_error, + :compile_error, + :on_assign_error, + :on_alias_error, + :on_class_name_error, + :on_param_error + ] + def ripper_lex_without_warning(code) verbose, $VERBOSE = $VERBOSE, nil tokens = nil self.class.compile_with_errors_suppressed(code) do |inner_code, line_no| - tokens = Ripper.lex(inner_code, '-', line_no) + lexer = Ripper::Lexer.new(inner_code, '-', line_no) + if lexer.respond_to?(:scan) # Ruby 2.7+ + tokens = [] + pos_to_index = {} + lexer.scan.each do |t| + if pos_to_index.has_key?(t[0]) + index = pos_to_index[t[0]] + found_tk = tokens[index] + if ERROR_TOKENS.include?(found_tk[1]) && !ERROR_TOKENS.include?(t[1]) + tokens[index] = t + end + else + pos_to_index[t[0]] = tokens.size + tokens << t + end + end + else + tokens = lexer.parse + end end - $VERBOSE = verbose tokens + ensure + $VERBOSE = verbose + end + + def find_prev_spaces(line_index) + return 0 if @tokens.size == 0 + md = @tokens[0][2].match(/(\A +)/) + prev_spaces = md.nil? ? 0 : md[1].count(' ') + line_count = 0 + @tokens.each_with_index do |t, i| + if t[2].include?("\n") + line_count += t[2].count("\n") + if line_count >= line_index + return prev_spaces + end + if (@tokens.size - 1) > i + md = @tokens[i + 1][2].match(/(\A +)/) + prev_spaces = md.nil? ? 0 : md[1].count(' ') + end + end + end + prev_spaces end def set_auto_indent(context) 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 - md = lines[line_index - 1].match(/(\A +)/) - prev_spaces = md.nil? ? 0 : md[1].count(' ') @tokens = ripper_lex_without_warning(lines[0..line_index].join("\n")) + 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 @@ -360,14 +408,8 @@ class RubyLex next if index > 0 and tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME) case t[2] when 'do' - if index > 0 and tokens[index - 1][3].anybits?(Ripper::EXPR_CMDARG | Ripper::EXPR_ENDFN | Ripper::EXPR_ARG) - # method_with_block do; end - indent += 1 - else - # while cond do; end # also "until" or "for" - # This "do" doesn't increment indent because "while" already - # incremented. - end + syntax_of_do = take_corresponding_syntax_to_kw_do(tokens, index) + indent += 1 if syntax_of_do == :method_calling when 'def', 'case', 'for', 'begin', 'class', 'module' indent += 1 when 'if', 'unless', 'while', 'until' @@ -382,6 +424,40 @@ class RubyLex indent end + def take_corresponding_syntax_to_kw_do(tokens, index) + syntax_of_do = nil + # Finding a syntax correnponding to "do". + index.downto(0) do |i| + tk = tokens[i] + # In "continue", the token isn't the corresponding syntax to "do". + #is_continue = process_continue(@tokens[0..(i - 1)]) + # continue ではなく、直前に (:on_ignored_nl|:on_nl|:on_comment):on_sp* みたいなのがあるかどうかを調べる + non_sp_index = tokens[0..(i - 1)].rindex{ |t| t[1] != :on_sp } + first_in_fomula = false + if non_sp_index.nil? + first_in_fomula = true + elsif [:on_ignored_nl, :on_nl, :on_comment].include?(tokens[non_sp_index][1]) + first_in_fomula = true + end + if tk[3].anybits?(Ripper::EXPR_CMDARG) and tk[1] == :on_ident + # The target method call to pass the block with "do". + syntax_of_do = :method_calling + break if first_in_fomula + elsif tk[1] == :on_kw && %w{while until for}.include?(tk[2]) + # A loop syntax in front of "do" found. + # + # while cond do # also "until" or "for" + # end + # + # This "do" doesn't increment indent because the loop syntax already + # incremented. + syntax_of_do = :loop_syntax + break if first_in_fomula + end + end + syntax_of_do + end + def check_newline_depth_difference depth_difference = 0 open_brace_on_line = 0 @@ -410,7 +486,7 @@ class RubyLex case t[1] when :on_ignored_nl, :on_nl, :on_comment - if index != (@tokens.size - 1) + if index != (@tokens.size - 1) and in_oneliner_def != :BODY depth_difference = 0 open_brace_on_line = 0 end @@ -428,14 +504,8 @@ class RubyLex next if index > 0 and @tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME) case t[2] when 'do' - if index > 0 and @tokens[index - 1][3].anybits?(Ripper::EXPR_CMDARG | Ripper::EXPR_ENDFN | Ripper::EXPR_ARG) - # method_with_block do; end - depth_difference += 1 - else - # while cond do; end # also "until" or "for" - # This "do" doesn't increment indent because "while" already - # incremented. - end + syntax_of_do = take_corresponding_syntax_to_kw_do(@tokens, index) + depth_difference += 1 if syntax_of_do == :method_calling when 'def', 'case', 'for', 'begin', 'class', 'module' depth_difference += 1 when 'if', 'unless', 'while', 'until', 'rescue' @@ -445,6 +515,8 @@ class RubyLex end when 'else', 'elsif', 'ensure', 'when', 'in' depth_difference += 1 + when 'end' + depth_difference -= 1 end end end @@ -488,11 +560,13 @@ class RubyLex case t[1] when :on_ignored_nl, :on_nl, :on_comment - corresponding_token_depth = nil - spaces_at_line_head = 0 - is_first_spaces_of_line = true - is_first_printable_of_line = true - open_brace_on_line = 0 + if in_oneliner_def != :BODY + corresponding_token_depth = nil + spaces_at_line_head = 0 + is_first_spaces_of_line = true + is_first_printable_of_line = true + open_brace_on_line = 0 + end next when :on_sp spaces_at_line_head = t[2].count(' ') if is_first_spaces_of_line @@ -514,7 +588,12 @@ class RubyLex when :on_kw next if index > 0 and @tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME) case t[2] - when 'def', 'do', 'case', 'for', 'begin', 'class', 'module' + when 'do' + syntax_of_do = take_corresponding_syntax_to_kw_do(@tokens, index) + if syntax_of_do == :method_calling + spaces_of_nest.push(spaces_at_line_head) + end + when 'def', 'case', 'for', 'begin', 'class', 'module' spaces_of_nest.push(spaces_at_line_head) when 'rescue' unless t[3].allbits?(Ripper::EXPR_LABEL) diff --git a/lib/irb/version.rb b/lib/irb/version.rb index d28143f16e..51b55766a5 100644 --- a/lib/irb/version.rb +++ b/lib/irb/version.rb @@ -11,7 +11,7 @@ # module IRB # :nodoc: - VERSION = "1.3.0" + VERSION = "1.3.2" @RELEASE_VERSION = VERSION - @LAST_UPDATE_DATE = "2020-12-25" + @LAST_UPDATE_DATE = "2021-01-18" end diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb index 5a3a4bc020..c6c328e7b5 100644 --- a/lib/irb/workspace.rb +++ b/lib/irb/workspace.rb @@ -128,6 +128,7 @@ EOF def filter_backtrace(bt) return nil if bt =~ /\/irb\/.*\.rb/ return nil if bt =~ /\/irb\.rb/ + return nil if bt =~ /tool\/lib\/.*\.rb|runner\.rb/ # for tests in Ruby repository case IRB.conf[:CONTEXT_MODE] when 1 return nil if bt =~ %r!/tmp/irb-binding! |