From 23c8bc367c6d700789a4059b831606966efb674c Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Tue, 13 Jul 2021 16:47:35 +0900 Subject: [PATCH] [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 a3d6510dc2..ce687fb2a2 100644 --- a/lib/error_highlight/formatter.rb +++ b/lib/error_highlight/formatter.rb @@ -3,7 +3,8 @@ module ErrorHighlight 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 c8effb7cd8..071b3bfd3e 100644 --- a/test/error_highlight/test_error_highlight.rb +++ b/test/error_highlight/test_error_highlight.rb @@ -1,6 +1,7 @@ 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 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