From e02de9f7c28cd902ce4398c841a0470b3fedd87c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Mon, 24 Jan 2022 09:40:09 +0100 Subject: [PATCH] Require Elixir v1.11+ --- .github/workflows/ci.yml | 2 +- lib/ex_doc/language/erlang.ex | 11 ------ lib/ex_doc/refs.ex | 2 +- lib/ex_doc/retriever.ex | 2 +- lib/ex_doc/utils/code.ex | 73 ----------------------------------- lib/mix/tasks/docs.ex | 2 +- mix.exs | 2 +- test/ex_doc/refs_test.exs | 2 +- 8 files changed, 6 insertions(+), 90 deletions(-) delete mode 100644 lib/ex_doc/utils/code.ex diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c44d1295e..46f27156e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: matrix: include: - pair: - elixir: "1.10" + elixir: "1.11" otp: 21 - pair: elixir: "1.13" diff --git a/lib/ex_doc/language/erlang.ex b/lib/ex_doc/language/erlang.ex index b088af4d6..7b8097476 100644 --- a/lib/ex_doc/language/erlang.ex +++ b/lib/ex_doc/language/erlang.ex @@ -6,18 +6,7 @@ defmodule ExDoc.Language.Erlang do alias ExDoc.{Autolink, Refs} @impl true - # TODO: Move :hidden handling to retriever, as it is shared across all BEAM languages def module_data(module, docs_chunk, _config) do - {:docs_v1, _, _, _, doc, _, _} = docs_chunk - - if doc != :hidden do - module_data(module, docs_chunk) - else - :skip - end - end - - def module_data(module, docs_chunk) do # Make sure the module is loaded for future checks _ = Code.ensure_loaded(module) id = Atom.to_string(module) diff --git a/lib/ex_doc/refs.ex b/lib/ex_doc/refs.ex index 1cbb32a96..d6f7eaed4 100644 --- a/lib/ex_doc/refs.ex +++ b/lib/ex_doc/refs.ex @@ -76,7 +76,7 @@ defmodule ExDoc.Refs do end defp fetch({:module, module} = ref) do - entries = fetch_entries(module, ExDoc.Utils.Code.fetch_docs(module)) + entries = fetch_entries(module, Code.fetch_docs(module)) insert(entries) Map.get(Map.new(entries), ref, :undefined) end diff --git a/lib/ex_doc/retriever.ex b/lib/ex_doc/retriever.ex index 36ef69ccd..9467b489b 100644 --- a/lib/ex_doc/retriever.ex +++ b/lib/ex_doc/retriever.ex @@ -64,7 +64,7 @@ defmodule ExDoc.Retriever do end defp docs_chunk(module) do - result = ExDoc.Utils.Code.fetch_docs(module) + result = Code.fetch_docs(module) Refs.insert_from_chunk(module, result) case result do diff --git a/lib/ex_doc/utils/code.ex b/lib/ex_doc/utils/code.ex deleted file mode 100644 index ee1aa4f61..000000000 --- a/lib/ex_doc/utils/code.ex +++ /dev/null @@ -1,73 +0,0 @@ -defmodule ExDoc.Utils.Code do - @moduledoc false - - # TODO: this is vendored from Elixir v1.11.0. - # Remove and use Code.fetch_docs/1 in the future. - - def fetch_docs(module) when is_atom(module) do - case :code.get_object_code(module) do - {_module, bin, beam_path} -> - case fetch_docs_from_beam(bin) do - {:error, :chunk_not_found} -> - if :code.which(module) == :preloaded do - # TODO remove duplication - path = Path.join([:code.lib_dir(:erts), "doc", "chunks", "#{module}.chunk"]) - fetch_docs_from_chunk(path) - else - app_root = Path.expand(Path.join(["..", ".."]), beam_path) - path = Path.join([app_root, "doc", "chunks", "#{module}.chunk"]) - fetch_docs_from_chunk(path) - end - - other -> - other - end - - :error -> - case :code.which(module) do - :preloaded -> - path = Path.join([:code.lib_dir(:erts), "doc", "chunks", "#{module}.chunk"]) - fetch_docs_from_chunk(path) - - _ -> - {:error, :module_not_found} - end - end - end - - def fetch_docs(path) when is_binary(path) do - fetch_docs_from_beam(String.to_charlist(path)) - end - - @docs_chunk 'Docs' - - defp fetch_docs_from_beam(bin_or_path) do - case :beam_lib.chunks(bin_or_path, [@docs_chunk]) do - {:ok, {_module, [{@docs_chunk, bin}]}} -> - load_docs_chunk(bin) - - {:error, :beam_lib, {:missing_chunk, _, @docs_chunk}} -> - {:error, :chunk_not_found} - - {:error, :beam_lib, {:file_error, _, :enoent}} -> - {:error, :module_not_found} - end - end - - defp fetch_docs_from_chunk(path) do - case File.read(path) do - {:ok, bin} -> - load_docs_chunk(bin) - - {:error, _} -> - {:error, :chunk_not_found} - end - end - - defp load_docs_chunk(bin) do - :erlang.binary_to_term(bin) - rescue - _ -> - {:error, {:invalid_chunk, bin}} - end -end diff --git a/lib/mix/tasks/docs.ex b/lib/mix/tasks/docs.ex index 598cf87e9..f6f55291c 100644 --- a/lib/mix/tasks/docs.ex +++ b/lib/mix/tasks/docs.ex @@ -2,6 +2,7 @@ defmodule Mix.Tasks.Docs do use Mix.Task @shortdoc "Generate documentation for the project" + @requirements ["compile"] @moduledoc ~S""" Uses ExDoc to generate a static web page from the project documentation. @@ -315,7 +316,6 @@ defmodule Mix.Tasks.Docs do @doc false def run(args, config \\ Mix.Project.config(), generator \\ &ExDoc.generate_docs/3) do - Mix.Task.run("compile") {:ok, _} = Application.ensure_all_started(:ex_doc) unless Code.ensure_loaded?(ExDoc.Config) do diff --git a/mix.exs b/mix.exs index dd21cb373..9fbbb8643 100644 --- a/mix.exs +++ b/mix.exs @@ -8,7 +8,7 @@ defmodule ExDoc.Mixfile do [ app: :ex_doc, version: @version, - elixir: "~> 1.10", + elixir: "~> 1.11", deps: deps(), aliases: aliases(), package: package(), diff --git a/test/ex_doc/refs_test.exs b/test/ex_doc/refs_test.exs index fcb821c82..6a23d7e47 100644 --- a/test/ex_doc/refs_test.exs +++ b/test/ex_doc/refs_test.exs @@ -70,7 +70,7 @@ defmodule ExDoc.RefsTest do end test "insert_from_chunk/2 with module that doesn't exist" do - result = ExDoc.Utils.Code.fetch_docs(:elixir) + result = Code.fetch_docs(:elixir) assert :ok = ExDoc.Refs.insert_from_chunk(Elixir, result) end end