Packages
surface
0.3.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha.0
A component based library for Phoenix LiveView
Current section
Files
Jump to
Current section
Files
lib/surface/directive/for.ex
defmodule Surface.Directive.For do
use Surface.Directive
def extract({":for", {:attribute_expr, value, expr_meta}, attr_meta}, meta) do
%AST.Directive{
module: __MODULE__,
name: :for,
value: directive_value(value, Helpers.to_meta(expr_meta, meta), attr_meta),
meta: Helpers.to_meta(attr_meta, meta)
}
end
def extract(_, _), do: []
def process(%AST.Directive{value: %AST.AttributeExpr{} = expr, meta: meta}, node),
do: %AST.For{generator: expr, children: [node], meta: meta}
defp directive_value(value, meta, attr_meta) do
quoted_value =
value
|> Surface.TypeHandler.expr_to_quoted!(":for", :generator, meta)
|> handle_modifiers(attr_meta.modifiers, %{line: attr_meta.line, file: meta.file})
%AST.AttributeExpr{
original: value,
value: quoted_value,
meta: meta
}
end
defp handle_modifiers([{:<-, clause_meta, [var, list]}], ["with_index" | modifiers], meta) do
udpated_list =
quote generated: true do
Enum.with_index(unquote(list))
end
handle_modifiers([{:<-, clause_meta, [var, udpated_list]}], modifiers, meta)
end
defp handle_modifiers([{:<-, clause_meta, [var, list]}], ["index" | modifiers], meta) do
udpated_list =
quote generated: true do
Enum.scan(unquote(list), -1, fn _, a -> a + 1 end)
end
handle_modifiers([{:<-, clause_meta, [var, udpated_list]}], modifiers, meta)
end
defp handle_modifiers([{_, clause_meta, _} = list], ["index" | modifiers], meta) do
var =
quote generated: true do
var!(index)
end
udpated_list =
quote generated: true do
Enum.scan(unquote(list), -1, fn _, a -> a + 1 end)
end
handle_modifiers([{:<-, clause_meta, [var, udpated_list]}], modifiers, meta)
end
defp handle_modifiers(clauses, [modifier | _modifiers], meta) when length(clauses) > 1 do
message = "cannot apply modifier \"#{modifier}\" on generators with multiple clauses"
IOHelper.compile_error(message, meta.file, meta.line)
end
defp handle_modifiers(_clauses, [modifier | _modifiers], meta) do
message = "unknown modifier \"#{modifier}\" for directive :for"
IOHelper.compile_error(message, meta.file, meta.line)
end
defp handle_modifiers(clauses, [], _meta) do
clauses
end
end