2017-01-19 1 views
1

コード内でtypespecの定義にどのようにアクセスできますか?いくつかのコード生成を行うためにマクロ内で使用したいと思います。プログラム内でtypespecの定義にアクセスする

このようなものは理想的でしょう。私は、このようなCode.get_type(MyMod, :t)としての機能を呼び出すことができますし、それが定義式のAST返す

defmodule MyMod do 
    @type t :: :ok | :error 
end 

{:::, [], [{:my_type, [], Elixir}, {:|, [], [:ok, :error]}]} 

または代わりのちょうどASTを

は、このモジュールとtypespecを考えますタイプ:

{:|, [], [:ok, :error]} 
+2

モジュールがコンパイルされた後、またはモジュール内からアクセスしますか? – Dogbert

答えて

1

これはハックです(cでのみ動作します)。 ompilation段階、)それはあなたが欲しいものを行います。

defmodule MyMod do          
    @type t1 :: :ok | :error 
    @type t2 :: :done 
    @type_defs Module.get_attribute(__MODULE__, :type, []) 
    def type_defs, 
    do: Enum.map(@type_defs, fn {:type, type, _} -> type end) 
end 

MyMod.type_defs 
#⇒ [{:::, [line: 9], [{:t2, [line: 9], nil}, :done]}, 
# {:::, [line: 8], [{:t1, [line: 8], nil}, {:|, [line: 8], [:ok, :error]}]}] 

一つは必要な時はいつでもこの機能とuse TypeExtractorを実装し、defmacro __using__でモジュールを宣言する可能性があります。

関連する問題