ruby-changes:66758
From: Yusuke <ko1@a...>
Date: Tue, 13 Jul 2021 16:51:13 +0900 (JST)
Subject: [ruby-changes:66758] 23c8bc367c (master): [ruby/error_highlight] Support hard tabs
https://git.ruby-lang.org/ruby.git/commit/?id=23c8bc367c From 23c8bc367c6d700789a4059b831606966efb674c Mon Sep 17 00:00:00 2001 From: Yusuke Endoh <mame@r...> Date: Tue, 13 Jul 2021 16:47:35 +0900 Subject: [ruby/error_highlight] Support hard tabs Now, the highlight line is created by replacing non-tab characters with spaces, and keeping all hard tabs as-is. This means the highlight line has the completely same indentation as the code snippet line. Fixes #7 https://github.com/ruby/error_highlight/commit/38f20fa542 --- lib/error_highlight/formatter.rb | 3 ++- test/error_highlight/test_error_highlight.rb | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/error_highlight/formatter.rb b/lib/error_highlight/formatter.rb index a3d6510..ce687fb 100644 --- a/lib/error_highlight/formatter.rb +++ b/lib/error_highlight/formatter.rb @@ -3,7 +3,8 @@ module ErrorHighlight https://github.com/ruby/ruby/blob/trunk/lib/error_highlight/formatter.rb#L3 def message_for(spot) # currently only a one-line code snippet is supported if spot[:first_lineno] == spot[:last_lineno] - marker = " " * spot[:first_column] + "^" * (spot[:last_column] - spot[:first_column]) + indent = spot[:snippet][0...spot[:first_column]].gsub(/[^\t]/, " ") + marker = indent + "^" * (spot[:last_column] - spot[:first_column]) "\n\n#{ spot[:snippet] }#{ marker }" else diff --git a/test/error_highlight/test_error_highlight.rb b/test/error_highlight/test_error_highlight.rb index c8effb7..071b3bf 100644 --- a/test/error_highlight/test_error_highlight.rb +++ b/test/error_highlight/test_error_highlight.rb @@ -1,6 +1,7 @@ https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L1 require "test/unit" require "error_highlight" +require "tempfile" class ErrorHighlightTest < Test::Unit::TestCase class DummyFormatter @@ -999,4 +1000,20 @@ undefined method `time' for 1:Integer https://github.com/ruby/ruby/blob/trunk/test/error_highlight/test_error_highlight.rb#L1000 ensure ErrorHighlight.formatter = original_formatter end + + def test_hard_tabs + tmp = Tempfile.new(["error_highlight_test", ".rb"]) + tmp << "\t \t1.time {}\n" + tmp.close(false) + + assert_error_message(NoMethodError, <<~END.gsub("_", "\t")) do +undefined method `time' for 1:Integer + +_ _1.time {} +_ _ ^^^^^ + END + + load tmp.path + end + end end -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/