A macro, as written: l.all(x, p), l.exists(x, p), l.exists_one(x, p),
l.map(x, f), l.map(x, p, f), l.filter(x, p), the two-variable forms
such as m.all(k, v, p), cel.bind(v, init, body), o.optMap(v, f) and
o.optFlatMap(v, f).
function is the macro's name and target its receiver, or nil for
cel.bind. args start with the variables the macro binds, as
CEL.Expr.Ident nodes with scope: :local and their types, followed
by the other arguments.
For a comprehension macro, expansion is the CEL.Expr.Comprehension
it expands to, which evaluation runs; its subexpressions include the
nodes in args. It is nil for cel.bind, optMap and optFlatMap.
has(m.f) is not a MacroCall but a CEL.Expr.Select with
test_only: true.
Summary
Types
@type t() :: %CEL.Expr.MacroCall{ args: [CEL.Expr.t()], expansion: CEL.Expr.Comprehension.t() | nil, function: String.t(), id: CEL.Checked.expr_id(), target: CEL.Expr.t() | nil, type: CEL.Expr.type() }