From 97ade0611b70ceebffd85a81281c5eac381a9406 Mon Sep 17 00:00:00 2001 From: Mitchell Hanberg Date: Fri, 28 Feb 2025 14:15:50 -0500 Subject: [PATCH] Add columns to FIXME and TODO tag checks This allows text editors to correctly render the diagnostic --- lib/credo/check/design/tag_fixme.ex | 3 ++- lib/credo/check/design/tag_helper.ex | 17 ++++++++++------- lib/credo/check/design/tag_todo.ex | 3 ++- test/credo/check/design/tag_fixme_test.exs | 5 ++++- test/credo/check/design/tag_helper_test.exs | 3 +++ test/credo/check/design/tag_todo_test.exs | 5 ++++- 6 files changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/credo/check/design/tag_fixme.ex b/lib/credo/check/design/tag_fixme.ex index 5983df00e..e6e347416 100644 --- a/lib/credo/check/design/tag_fixme.ex +++ b/lib/credo/check/design/tag_fixme.ex @@ -40,11 +40,12 @@ defmodule Credo.Check.Design.TagFIXME do |> Enum.map(&issue_for(issue_meta, &1)) end - defp issue_for(issue_meta, {line_no, _line, trigger}) do + defp issue_for(issue_meta, {line_no, column, _line, trigger}) do format_issue( issue_meta, message: "Found a #{@tag_name} tag in a comment: #{trigger}", line_no: line_no, + column: column, trigger: trigger ) end diff --git a/lib/credo/check/design/tag_helper.ex b/lib/credo/check/design/tag_helper.ex index 4f033e055..14b9ea339 100644 --- a/lib/credo/check/design/tag_helper.ex +++ b/lib/credo/check/design/tag_helper.ex @@ -29,8 +29,7 @@ defmodule Credo.Check.Design.TagHelper do |> Credo.Code.clean_charlists_strings_and_sigils() |> String.split("\n") |> Enum.with_index() - |> Enum.map(&find_tag_in_line(&1, regex)) - |> Enum.filter(&tags?/1) + |> Enum.flat_map(&find_tag_in_line(&1, regex)) else [] end @@ -41,7 +40,7 @@ defmodule Credo.Check.Design.TagHelper do if string =~ regex do trimmed = String.trim_trailing(string) - {nil, memo ++ [{meta[:line], trimmed, trimmed}]} + {nil, memo ++ [{meta[:line], meta[:column], trimmed, trimmed}]} else {ast, memo} end @@ -58,9 +57,13 @@ defmodule Credo.Check.Design.TagHelper do |> List.wrap() |> Enum.map(&String.trim/1) - {index + 1, line, List.first(tag_list)} - end + if tag = List.first(tag_list) do + col = + Regex.run(~r"(.*)#"U, line) |> List.first("") |> String.length() - defp tags?({_line_no, _line, nil}), do: false - defp tags?({_line_no, _line, _tag}), do: true + [{index + 1, col, line, tag}] + else + [] + end + end end diff --git a/lib/credo/check/design/tag_todo.ex b/lib/credo/check/design/tag_todo.ex index 8859b3fd6..d1ef76e98 100644 --- a/lib/credo/check/design/tag_todo.ex +++ b/lib/credo/check/design/tag_todo.ex @@ -39,11 +39,12 @@ defmodule Credo.Check.Design.TagTODO do |> Enum.map(&issue_for(issue_meta, &1)) end - defp issue_for(issue_meta, {line_no, _line, trigger}) do + defp issue_for(issue_meta, {line_no, column, _line, trigger}) do format_issue( issue_meta, message: "Found a #{@tag_name} tag in a comment: #{trigger}", line_no: line_no, + column: column, trigger: trigger ) end diff --git a/test/credo/check/design/tag_fixme_test.exs b/test/credo/check/design/tag_fixme_test.exs index b38298fa8..3de5f49c0 100644 --- a/test/credo/check/design/tag_fixme_test.exs +++ b/test/credo/check/design/tag_fixme_test.exs @@ -40,7 +40,10 @@ defmodule Credo.Check.Design.TagFIXMETest do """ |> to_source_file |> run_check(@described_check) - |> assert_issue() + |> assert_issue(fn issue -> + assert issue.line_no == 4 + assert issue.column == 3 + end) end test "it should report an issue when lower case" do diff --git a/test/credo/check/design/tag_helper_test.exs b/test/credo/check/design/tag_helper_test.exs index d9e758718..d3b51cd94 100644 --- a/test/credo/check/design/tag_helper_test.exs +++ b/test/credo/check/design/tag_helper_test.exs @@ -37,6 +37,7 @@ defmodule Credo.Check.Design.TagHelperTest do expected = [ { 4, + 19, " def some_fun do # TODO: find a better name for this", "# TODO: find a better name for this" } @@ -62,6 +63,7 @@ defmodule Credo.Check.Design.TagHelperTest do expected = [ { 4, + 19, " def some_fun do # TODO find a better name for this", "# TODO find a better name for this" } @@ -88,6 +90,7 @@ defmodule Credo.Check.Design.TagHelperTest do expected = [ { 4, + 3, " # todo find a better name for this", "# todo find a better name for this" } diff --git a/test/credo/check/design/tag_todo_test.exs b/test/credo/check/design/tag_todo_test.exs index 0a215d0a9..4767db339 100644 --- a/test/credo/check/design/tag_todo_test.exs +++ b/test/credo/check/design/tag_todo_test.exs @@ -87,7 +87,10 @@ defmodule Credo.Check.Design.TagTODOTest do """ |> to_source_file |> run_check(@described_check) - |> assert_issue() + |> assert_issue(fn issue -> + assert issue.line_no == 4 + assert issue.column == 3 + end) end test "it should report an issue for @doc tags" do