Skip to content

Commit

Permalink
Support hard tabs
Browse files Browse the repository at this point in the history
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
  • Loading branch information
mame committed Jul 13, 2021
1 parent 2fc70d7 commit 38f20fa
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/error_highlight/formatter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
17 changes: 17 additions & 0 deletions test/test_error_highlight.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
require "test/unit"

require "error_highlight"
require "tempfile"

class ErrorHighlightTest < Test::Unit::TestCase
class DummyFormatter
Expand Down Expand Up @@ -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

0 comments on commit 38f20fa

Please sign in to comment.