Current section
Files
Jump to
Current section
Files
lib/zig.parser/statement.ex
defmodule Zig.Parser.Statement do
alias Zig.Parser.Block
alias Zig.Parser.If
alias Zig.Parser.Switch
# BlockStatement: wraps Statement, defer, errdefer, VarAssignStatement
def post_traverse(rest, [{:BlockStatement, args} | rest_args], context, _, _) do
{rest, [parse_block_statement(args) | rest_args], context}
end
# ExprStatement: if, labeled statements, nosuspend, comptime block
def post_traverse(rest, [{:ExprStatement, args} | rest_args], context, _, _) do
{rest, [parse_expr_statement(args) | rest_args], context}
end
# Statement: ExprStatement, suspend, or simple assignment
def post_traverse(rest, [{:Statement, args} | rest_args], context, _, _) do
{rest, [parse_statement(args) | rest_args], context}
end
# BlockStatement parsing
defp parse_block_statement([:defer | rest_args]) do
{:defer, parse_block_expr_statement(rest_args)}
end
defp parse_block_statement([:errdefer, :|, capture, :| | rest_args]) do
{:errdefer, capture, parse_block_expr_statement(rest_args)}
end
defp parse_block_statement([:errdefer | rest_args]) do
{:errdefer, parse_block_expr_statement(rest_args)}
end
defp parse_block_statement([:comptime | rest_args]) do
case parse_block_statement(rest_args) do
%{comptime: _} = parsed -> %{parsed | comptime: true}
parsed -> {:comptime, parsed}
end
end
defp parse_block_statement([content]), do: content
# BlockExprStatement parsing (shared helper)
defp parse_block_expr_statement([%Block{} = block]), do: block
defp parse_block_expr_statement([statement, :SEMICOLON]), do: statement
defp parse_block_expr_statement([content]), do: content
# ExprStatement parsing
defp parse_expr_statement([:nosuspend | rest_args]) do
case parse_block_expr_statement(rest_args) do
%Block{} = block -> %{block | nosuspend: true}
other -> {:nosuspend, other}
end
end
defp parse_expr_statement([:comptime | rest_args]) do
case parse_expr_statement(rest_args) do
%Block{} = block -> %{block | comptime: true}
other -> {:comptime, other}
end
end
defp parse_expr_statement([:if | rest_args]) do
If.parse(rest_args)
end
defp parse_expr_statement([label, :COLON, :switch | rest]) do
%{Switch.parse(rest) | label: label}
end
defp parse_expr_statement([label, :COLON, statement]) do
%{statement | label: label}
end
# Unlabeled switch expression
defp parse_expr_statement([:switch | rest]) do
Switch.parse(rest)
end
defp parse_expr_statement([content]), do: content
# Statement parsing
defp parse_statement([:suspend | rest_args]) do
case parse_block_expr_statement(rest_args) do
%Block{} = block -> %{block | suspend: true}
other -> {:suspend, other}
end
end
defp parse_statement([:comptime | rest_args]) do
case parse_statement(rest_args) do
%{comptime: _} = parsed -> %{parsed | comptime: true}
parsed -> {:comptime, parsed}
end
end
defp parse_statement([statement, :SEMICOLON]), do: statement
defp parse_statement([content]), do: content
end