2017-01-19 44 views
1

如何在我的代碼中訪問類型規範的定義?我希望在宏中使用它來執行一些代碼生成。以編程方式訪問typespec的定義

像這樣的東西將是理想的。

鑑於此模塊和類型指定:

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

我可以打電話給這樣的功能Code.get_type(MyMod, :t),它會返回定義表達式的AST:

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

或可替代只是其中的AST類型:

{:|, [], [: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]}]}] 

有人可能會宣佈一個模塊defmacro __using__,實現該功能和use TypeExtractor