Мы сделали это для проекта только для записей, но для этого требуется пара вещей:
- У вас должен быть загружен модуль во время выполнения, в котором есть необходимые .hrl-файлы (луч для этого модуля также должен быть доступен в пути).
- Модуль должен быть скомпилирован с отладочной информацией (
+debug_info
для компилятора или с [debug_info]
в качестве аргумента опции для c/2
).
- Вы должны вставить определения .hrl-record в свои формы самостоятельно.
Вот как это сделать:
Сначала создайте модуль, который включает .hrl-файл:
-module(my_hrl).
-include("my_hrl.hrl").
-export([records/0]).
records() ->
{_Module, _Beam, FilePath} = code:get_object_code(?MODULE),
{ok, {_, [{abstract_code, {_, AC}}]}} =
beam_lib:chunks(FilePath, [abstract_code]),
[R || {attribute, _, record, _} = R <- AC].
Это даст вам модуль, функция которого include/0
даст вам список абстрактного кода для всех записей в этом модуле (исходя из .hrl-файлов, которые там включены).
Этот способ может, конечно, использоваться и для других атрибутов, кроме атрибута записи (или даже для функций в .hrl-файлах).
Получив список атрибутов записи, вы просто добавляете их в свои формы:
Forms = [{attribute,1,module,zed},
{attribute,1,export,[{f,1}]}]
++ my_hrl:records() ++
[{function,1,f,1,
[{clause,1,
[{var,1,'User'}], [],
[{record_field,1,
{var,1,'User'},
user,
{atom,1,name}}]}]}].