-
Notifications
You must be signed in to change notification settings - Fork 3.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Provide an API to access documentation metadata at compile time #8095
Comments
I would add "at compile time" to the title, because once compiled I think you can access the documentation using |
The documentation metadata and related fields is stored as private fields on the table, that's why you can't access it and you shouldn't rely on the compiler internals for this. :) The other thing is that, even if we provide a way to access metadata, then you would also need a way to remove the documentation because there is no actual function definition. It feels like the best way to go here is to use your own attribute, such as |
The proper solution here would be to make @doc "foo"
@doc bar: 1
@doc #=> [{2, bar: 1}, {1, "foo"}] This would also allow us to get rid of special cases in both Module and Kernel. The trouble with doing this now is that it will break code that expects |
@josevalim I agree that in this particular situation it makes sense to use custom attribute instead, but imagine something like that: defmacro defrecord(name, tag \\ nil, kv) do
quote do
def unquote(name)(), do: …
def unquote(name)(values), do: …
def unquote(name)(record, values), do: …
end
end And while you maybe do not want to share most docs between them then currently supported tags makes sense for them (like |
@josevalim Instead of this
could you consider this
? |
@mguimas unfortunately a metadata can be named |
@josevalim I would vote for the tuple + keyword list so: @doc "foo:
@doc bar: 1
@doc bar: 2
Would result with: {"foo", [bar: 1, bar: 2]} |
@josevalim I believe that a good data structure is one that makes it is easy to use So in the example
perhaps a good solution is
which respects not only the contents, but also the order of the doc entries. |
@hauleth @josevalim It's been 3 years; I don't think this issue has been resolved, but I figured I'd check in with both of you to verify. 😄 |
It’s not. It’s marked for Elixir v2.0. |
Ah my bad. I'm on mobile and didn't scroll down to see the addition of the 2.0 milestone. 🤦♂️ Disregard me! |
Environment
Current behavior
I wanted to create macro that would allow me to remove boilerplate over generating structures for events in my application. To document such structures I wanted to use
@doc
to simulate feeling that these are normal parts of the external module instead of being separate modules, ex.:While basic implementation is dumb easy documentation is quite challenging. What I have achieved is:
Which is fairly ok, except of the part where I need manually get data from ETS for documentation metadata. It cannot be mitigated by using
Module.get_attribute/2
as it explicitly requires atom as a second argument while metadata are stored under{:doc, :meta}
.Expected behavior
Somehow allow fetching documentation metadata in macros. This would allow macro writers to utilise that metadata in some way like example above.
The text was updated successfully, but these errors were encountered: