diff options
author | Laszlo Bacsi <lackac@lackac.hu> | 2018-07-10 11:36:33 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2018-07-10 13:42:20 +0200 |
commit | cf68b9f652ce7b3788d496dd344e6fb8efe8a470 (patch) | |
tree | c3f7e73ab1e8d3acb83dd97b4a4372fa097b9e39 | |
parent | f303ea61352dacca149c355a31b9188f81ff2045 (diff) | |
download | elixir-cf68b9f652ce7b3788d496dd344e6fb8efe8a470.tar.gz |
Move compilation of docs metadata to Elixir side
-rw-r--r-- | lib/elixir/lib/kernel/typespec.ex | 9 | ||||
-rw-r--r-- | lib/elixir/lib/module.ex | 15 | ||||
-rw-r--r-- | lib/elixir/src/elixir_erl.erl | 17 |
3 files changed, 20 insertions, 21 deletions
diff --git a/lib/elixir/lib/kernel/typespec.ex b/lib/elixir/lib/kernel/typespec.ex index 040b6d3ff..c457ba5ef 100644 --- a/lib/elixir/lib/kernel/typespec.ex +++ b/lib/elixir/lib/kernel/typespec.ex @@ -110,7 +110,7 @@ defmodule Kernel.Typespec do case spec_to_signature(expr) do {name, arity} -> {line, doc} = get_doc_info(set, :doc, line) - store_doc(set, kind, name, arity, line, doc) + store_doc(set, kind, name, arity, line, doc, %{}) :error -> :error @@ -136,7 +136,8 @@ defmodule Kernel.Typespec do {name, arity} -> {line, doc} = get_doc_info(set, :typedoc, line) - store_doc(set, :type, name, arity, line, doc) + meta = if kind == :opaque, do: %{opaque: true}, else: %{} + store_doc(set, :type, name, arity, line, doc, meta) :error -> :error @@ -156,11 +157,11 @@ defmodule Kernel.Typespec do :ok end - defp store_doc(set, kind, name, arity, line, doc) do + defp store_doc(set, kind, name, arity, line, doc, meta) do # TODO: Add and merge this information to doc metadata _ = get_since_info(set) _ = get_deprecated_info(set) - :ets.insert(set, {{kind, name, arity}, line, doc}) + :ets.insert(set, {{kind, name, arity}, line, doc, meta}) end defp get_doc_info(set, attr, line) do diff --git a/lib/elixir/lib/module.ex b/lib/elixir/lib/module.ex index c270141b9..be87caa26 100644 --- a/lib/elixir/lib/module.ex +++ b/lib/elixir/lib/module.ex @@ -1242,7 +1242,7 @@ defmodule Module do if doc, do: {:error, :private_doc}, else: :ok else {set, _bag} = data_tables_for(module) - compile_doc(set, line, kind, name, arity, signature, nil, doc, __ENV__, false) + compile_doc(set, line, kind, name, arity, signature, nil, doc, %{}, __ENV__, false) :ok end end @@ -1261,12 +1261,12 @@ defmodule Module do # TODO: Store @since and @deprecated alongside the docs {line, doc} = get_doc_info(set, env) - compile_doc(set, line, kind, name, arity, args, body, doc, env, impl) + compile_doc(set, line, kind, name, arity, args, body, doc, %{}, env, impl) :ok end - defp compile_doc(_table, line, kind, name, arity, _args, _body, doc, env, _impl) + defp compile_doc(_table, line, kind, name, arity, _args, _body, doc, _meta, env, _impl) when kind in [:defp, :defmacrop] do if doc do message = @@ -1277,16 +1277,16 @@ defmodule Module do end end - defp compile_doc(table, line, kind, name, arity, args, body, doc, env, impl) do + defp compile_doc(table, line, kind, name, arity, args, body, doc, meta, env, impl) do key = {doc_key(kind), name, arity} signature = build_signature(args, env) case :ets.lookup(table, key) do [] -> doc = if is_nil(doc) && impl, do: false, else: doc - :ets.insert(table, {key, line, signature, doc}) + :ets.insert(table, {key, line, signature, doc, meta}) - [{_, current_line, current_sign, current_doc}] -> + [{_, current_line, current_sign, current_doc, current_meta}] -> signature = merge_signatures(current_sign, signature, 1) if is_binary(doc) and is_binary(current_doc) and not is_nil(body) do @@ -1300,7 +1300,8 @@ defmodule Module do doc = if is_nil(doc), do: current_doc, else: doc doc = if is_nil(doc) && impl, do: false, else: doc - :ets.insert(table, {key, current_line, signature, doc}) + meta = Map.merge(current_meta, meta) + :ets.insert(table, {key, current_line, signature, doc, meta}) end end diff --git a/lib/elixir/src/elixir_erl.erl b/lib/elixir/src/elixir_erl.erl index 0212d029e..5788714f8 100644 --- a/lib/elixir/src/elixir_erl.erl +++ b/lib/elixir/src/elixir_erl.erl @@ -558,27 +558,27 @@ get_docs(Set, Module, Definitions, Kind) -> erl_anno:new(Line), [signature_to_binary(Module, Name, Signature)], doc_value(Doc), - doc_metadata(Kind) + Meta } || {Name, Arity} <- Definitions, - {Key, Line, Signature, Doc} <- ets:lookup(Set, {Kind, Name, Arity})]. + {Key, Line, Signature, Doc, Meta} <- ets:lookup(Set, {Kind, Name, Arity})]. get_callback_docs(Set, Callbacks) -> [{Key, erl_anno:new(Line), [], doc_value(Doc), - doc_metadata(Kind) + Meta } || {Kind, {Name, Arity}, _, _} <- Callbacks, - {Key, Line, Doc} <- ets:lookup(Set, {Kind, Name, Arity})]. + {Key, Line, Doc, Meta} <- ets:lookup(Set, {Kind, Name, Arity})]. get_type_docs(Set, Types) -> [{Key, erl_anno:new(Line), [], doc_value(Doc), - doc_metadata(Kind) - } || {Kind, {Name, Arity}, _, _, true} <- Types, - {Key, Line, Doc} <- ets:lookup(Set, {type, Name, Arity})]. + Meta + } || {_Kind, {Name, Arity}, _, _, true} <- Types, + {Key, Line, Doc, Meta} <- ets:lookup(Set, {type, Name, Arity})]. signature_to_binary(_Module, Name, _Signature) when Name == '__aliases__'; Name == '__block__' -> <<(atom_to_binary(Name, utf8))/binary, "(args)">>; @@ -597,9 +597,6 @@ signature_to_binary(Module, '__struct__', 0) -> signature_to_binary(_, Name, Signature) -> 'Elixir.Macro':to_string({Name, [], Signature}). -doc_metadata(opaque) -> #{opaque => true}; -doc_metadata(_) -> #{}. - %% Errors form_error(#{line := Line, file := File}, Error) -> |