Я узнал, как это сделать. Я искал не в том месте API. В Crystal::Macros::TypeNode
есть макрос methods
, который возвращает массив метода Def
(именно так вы можете получить к ним доступ). Похоже, класс TypeNode
является точкой входа для множества хороших макросов.
Пример использования
class Person
def name(a)
"John"
end
def test
{{@type.methods.map(&.name).join(', ')}}
end
end
Или
{{@type.methods.first.args.first.name}}
Простой возврат имени аргумента представляет интересную проблему, поскольку после того, как интерпретатор макросов вставит его в программу, компилятор интерпретирует имя как переменную (что имеет смысл).
Но значение real происходит в том случае, если он может видеть ограничения типов аргументов метода
class Public < Person
def name(a : String)
a
end
def max
{{@type.methods.first.args.first.restriction}}
end
end
Person.new.max # => String