summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaszlo Bacsi <lackac@lackac.hu>2018-07-10 11:36:33 +0200
committerJosé Valim <jose.valim@gmail.com>2018-07-10 13:42:20 +0200
commitcf68b9f652ce7b3788d496dd344e6fb8efe8a470 (patch)
treec3f7e73ab1e8d3acb83dd97b4a4372fa097b9e39
parentf303ea61352dacca149c355a31b9188f81ff2045 (diff)
downloadelixir-cf68b9f652ce7b3788d496dd344e6fb8efe8a470.tar.gz
Move compilation of docs metadata to Elixir side
-rw-r--r--lib/elixir/lib/kernel/typespec.ex9
-rw-r--r--lib/elixir/lib/module.ex15
-rw-r--r--lib/elixir/src/elixir_erl.erl17
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) ->