Skip to content

Commit dcb1938

Browse files
authored
Make a function acceptable for :skip_undefined_reference_warnings_on option (#1879)
1 parent a9de3e6 commit dcb1938

File tree

5 files changed

+48
-12
lines changed

5 files changed

+48
-12
lines changed

lib/ex_doc/autolink.ex

+7-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ defmodule ExDoc.Autolink do
2424
#
2525
# * `:extras` - map of extras
2626
#
27-
# * `:skip_undefined_reference_warnings_on` - list of modules to skip the warning on
27+
# * `:skip_undefined_reference_warnings_on` - function that will be called with
28+
# a module/function/file/etc and return a boolean whether to skip warning on it.
2829
#
2930
# * `:skip_code_autolink_to` - function that will be called with a term and return a boolean
3031
# whether to skip autolinking to it.
@@ -54,7 +55,7 @@ defmodule ExDoc.Autolink do
5455
ext: ".html",
5556
current_kfa: nil,
5657
siblings: [],
57-
skip_undefined_reference_warnings_on: [],
58+
skip_undefined_reference_warnings_on: &ExDoc.Config.skip_undefined_reference_warnings_on/1,
5859
skip_code_autolink_to: &ExDoc.Config.skip_code_autolink_to/1,
5960
force_module_prefix: nil,
6061
filtered_modules: [],
@@ -165,10 +166,12 @@ defmodule ExDoc.Autolink do
165166
end
166167

167168
def maybe_warn(config, ref, visibility, metadata) do
168-
skipped = config.skip_undefined_reference_warnings_on
169169
file = Path.relative_to_cwd(config.file)
170170

171-
unless Enum.any?([config.id, config.module_id, file], &(&1 in skipped)) do
171+
unless Enum.any?(
172+
[config.id, config.module_id, file],
173+
config.skip_undefined_reference_warnings_on
174+
) do
172175
warn(config, ref, visibility, metadata)
173176
end
174177
end

lib/ex_doc/config.ex

+16-5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ defmodule ExDoc.Config do
88
def before_closing_footer_tag(_), do: ""
99
def before_closing_body_tag(_), do: ""
1010
def annotations_for_docs(_), do: []
11+
def skip_undefined_reference_warnings_on(_string), do: false
1112
def skip_code_autolink_to(_string), do: false
1213

1314
defstruct annotations_for_docs: &__MODULE__.annotations_for_docs/1,
@@ -39,7 +40,8 @@ defmodule ExDoc.Config do
3940
proglang: :elixir,
4041
project: nil,
4142
retriever: ExDoc.Retriever,
42-
skip_undefined_reference_warnings_on: [],
43+
skip_undefined_reference_warnings_on:
44+
&__MODULE__.skip_undefined_reference_warnings_on/1,
4345
skip_code_autolink_to: &__MODULE__.skip_code_autolink_to/1,
4446
source_beam: nil,
4547
source_ref: @default_source_ref,
@@ -77,7 +79,7 @@ defmodule ExDoc.Config do
7779
package: :atom | nil,
7880
project: nil | String.t(),
7981
retriever: atom(),
80-
skip_undefined_reference_warnings_on: [String.t()],
82+
skip_undefined_reference_warnings_on: (String.t() -> boolean),
8183
skip_code_autolink_to: (String.t() -> boolean),
8284
source_beam: nil | String.t(),
8385
source_ref: nil | String.t(),
@@ -103,6 +105,13 @@ defmodule ExDoc.Config do
103105
options
104106
end
105107

108+
{skip_undefined_reference_warnings_on, options} =
109+
Keyword.pop(
110+
options,
111+
:skip_undefined_reference_warnings_on,
112+
&skip_undefined_reference_warnings_on/1
113+
)
114+
106115
{skip_code_autolink_to, options} =
107116
Keyword.pop(options, :skip_code_autolink_to, &skip_code_autolink_to/1)
108117

@@ -120,7 +129,9 @@ defmodule ExDoc.Config do
120129
output: normalize_output(output),
121130
proglang: normalize_proglang(proglang),
122131
project: project,
123-
skip_code_autolink_to: normalize_skip_code_autolink_to(skip_code_autolink_to),
132+
skip_undefined_reference_warnings_on:
133+
normalize_skip_list_function(skip_undefined_reference_warnings_on),
134+
skip_code_autolink_to: normalize_skip_list_function(skip_code_autolink_to),
124135
source_url_pattern: source_url_pattern,
125136
version: vsn
126137
}
@@ -174,10 +185,10 @@ defmodule ExDoc.Config do
174185
defp normalize_filter_modules(fun) when is_function(fun, 2),
175186
do: fun
176187

177-
defp normalize_skip_code_autolink_to(strings) when is_list(strings),
188+
defp normalize_skip_list_function(strings) when is_list(strings),
178189
do: &(&1 in strings)
179190

180-
defp normalize_skip_code_autolink_to(fun) when is_function(fun, 1),
191+
defp normalize_skip_list_function(fun) when is_function(fun, 1),
181192
do: fun
182193

183194
defp guess_url(url, ref) do

lib/mix/tasks/docs.ex

+4-2
Original file line numberDiff line numberDiff line change
@@ -153,12 +153,14 @@ defmodule Mix.Tasks.Docs do
153153
* `:skip_undefined_reference_warnings_on` - ExDoc warns when it can't create a `Mod.fun/arity`
154154
reference in the current project docs e.g. because of a typo. This list controls where to
155155
skip the warnings, for a given module/function/callback/type (e.g.: `["Foo", "Bar.baz/0"]`)
156-
or on a given file (e.g.: `["pages/deprecations.md"]`); default: `[]`.
156+
or on a given file (e.g.: `["pages/deprecations.md"]`). This option can also be a function
157+
from a reference string to a boolean (e.g.: `&String.match?(&1, ~r/Foo/)`);
158+
default is nothing to be skipped.
157159
158160
* `:skip_code_autolink_to` - Similar to `:skip_undefined_reference_warnings_on`, this option
159161
controls which terms will be skipped by ExDoc when building documentation.
160162
Useful for example if you want to highlight private modules or functions without warnings.
161-
This option can be a function from a term to a boolean (e.g.: `&String.match?(&1, ~r/PrivateModule/)`
163+
This option can be a function from a term to a boolean (e.g.: `&String.match?(&1, ~r/PrivateModule/)`)
162164
or a list of terms (e.g.:`["PrivateModule", "PrivateModule.func/1"]`);
163165
default is nothing to be skipped.
164166

test/ex_doc/config_test.exs

+20
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,26 @@ defmodule ExDoc.ConfigTest do
3131
refute config.filter_modules.(Foo, %{works: false})
3232
end
3333

34+
test "normalizes skip_undefined_reference_warnings_on" do
35+
config =
36+
ExDoc.Config.build(@project, @version,
37+
skip_undefined_reference_warnings_on: ["Foo", "Bar.baz/0"]
38+
)
39+
40+
assert config.skip_undefined_reference_warnings_on.("Foo")
41+
assert config.skip_undefined_reference_warnings_on.("Bar.baz/0")
42+
refute config.skip_undefined_reference_warnings_on.("Foo.bar/1")
43+
44+
config =
45+
ExDoc.Config.build(@project, @version,
46+
skip_undefined_reference_warnings_on: &String.match?(&1, ~r/Foo/)
47+
)
48+
49+
assert config.skip_undefined_reference_warnings_on.("Foo")
50+
refute config.skip_undefined_reference_warnings_on.("Bar.baz/0")
51+
assert config.skip_undefined_reference_warnings_on.("Foo.bar/1")
52+
end
53+
3454
test "normalizes skip_code_autolink_to" do
3555
config =
3656
ExDoc.Config.build(@project, @version,

test/ex_doc/language/elixir_test.exs

+1-1
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ defmodule ExDoc.Language.ElixirTest do
668668

669669
opts = [
670670
warnings: :send,
671-
skip_undefined_reference_warnings_on: ["MyModule"],
671+
skip_undefined_reference_warnings_on: &(&1 in ["MyModule"]),
672672
module_id: "MyModule"
673673
]
674674

0 commit comments

Comments
 (0)