From 38f20fa542bc1ec9d263d4dd7fa154b1d6eb230b Mon Sep 17 00:00:00 2001 From: Yusuke Endoh Date: Tue, 13 Jul 2021 16:47:35 +0900 Subject: [PATCH] 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 --- lib/error_highlight/formatter.rb | 3 ++- test/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 @@ class DefaultFormatter 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/test_error_highlight.rb b/test/test_error_highlight.rb index c8effb7..071b3bf 100644 --- a/test/test_error_highlight.rb +++ b/test/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 @@ def custom_formatter.message_for(spot) 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