Current section

Files

Jump to
zig_parser lib zig.parser assign_expr.ex
Raw

lib/zig.parser/assign_expr.ex

defmodule Zig.Parser.AssignExpr do
# alias Zig.Parser.OperatorOptions
def post_traverse(
rest,
[{:AssignExpr, args} | args_rest],
context,
_,
_
) do
{rest, [parse_assign(args) | args_rest], context}
end
@assign_operators ~w[*= /= %= += -= <<= >>= &= ^= |= *%= +%= -%= *|= +|= -|= <<|= =]a
defp parse_assign([left, operator, right]) when operator in @assign_operators do
{operator, left, right}
end
defp parse_assign([left, :"-|", right]) do
{:"-|=", left, right}
end
# Multi-value destructuring: a, b = value
defp parse_assign([first | rest]) do
case parse_multi_assign(rest, [first]) do
{:multi, targets, value} -> {:=, targets, value}
:not_multi -> first
end
end
defp parse_multi_assign([:COMMA, expr | rest], targets) do
parse_multi_assign(rest, [expr | targets])
end
defp parse_multi_assign([:=, value], targets) do
{:multi, Enum.reverse(targets), value}
end
defp parse_multi_assign([], [_single]) do
:not_multi
end
end