簡體   English   中英

以編程方式訪問 typespec 的定義

[英]Programatically accessing the definition of typespec

如何在我的代碼中訪問類型規范的定義? 我希望在宏中使用它來執行一些代碼生成。

這樣的事情將是理想的。

鑒於此模塊和類型規范:

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

我可以調用諸如Code.get_type(MyMod, :t)類的函數,它會返回定義表達式的 AST:

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

或者只是類型的 AST:

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

這是一個 hack(並且僅適用於編譯階段),但它可以滿足您的需求:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM