@@ -213,6 +213,15 @@ compile({'call_with', {identifier, SrcPos, Name}, Expr}, CState, Ws) ->
213213 {context , erl_syntax :variable (CState # cs .context_var )}
214214 ]),
215215 {Ws1 , Ast };
216+ compile ({'compose' , {TagPos , Template , Args }, Blocks }, CState , Ws ) ->
217+ {Ws1 , ArgsList } = with_args (Args , CState , Ws , false ),
218+ IsContextVar = is_context_vars_arg (Args , CState ),
219+ compose (TagPos , Template , ArgsList , IsContextVar , Blocks , CState , Ws1 );
220+ compile ({'catcompose' , {TagPos , Template , IdExpr , Args }, Blocks }, CState , Ws ) ->
221+ {Ws1 , ArgsList } = with_args (Args , CState , Ws , false ),
222+ {Ws2 , IdAst } = template_compiler_expr :compile (IdExpr , CState , Ws1 ),
223+ IsContextVar = is_context_vars_arg (Args , CState ),
224+ catcompose (TagPos , Template , IdAst , ArgsList , IsContextVar , Blocks , CState , Ws2 );
216225compile ({custom_tag , {identifier , SrcPos , Name }, Args }, # cs {runtime = Runtime } = CState , Ws ) ->
217226 {Ws1 , ArgsList } = with_args (Args , CState , Ws , true ),
218227 TagName = template_compiler_utils :to_atom (Name ),
@@ -722,6 +731,89 @@ maybe_add_include({string_literal, SrcPos, Text}, Method, IsCatinclude, Ws) ->
722731maybe_add_include (_Token , _Method , _IsCatinclude , Ws ) ->
723732 Ws .
724733
734+
735+ compose ({_ , SrcPos , _ }, Template , ArgsList , IsContextVars , Blocks , # cs {runtime = Runtime } = CState , Ws ) ->
736+ {Ws1 , TemplateAst } = template_compiler_expr :compile (Template , CState , Ws ),
737+ ArgsListAst = erl_syntax :list ([ erl_syntax :tuple ([A ,B ]) || {A ,B } <- ArgsList ]),
738+ {_BlocksWs , BlocksAsts } = template_compiler :compile_blocks (Blocks , CState ),
739+ BlockClauses = [
740+ ? Q (" (_@BlockName@, Vars, Blocks, Context) -> _@BlockAst" )
741+ || {BlockName , BlockAst , _BlockWs } <- BlocksAsts
742+ ] ++ [
743+ ? Q (" (_BlockName, _Vars, _Blocks, _Context) -> <<>>" )
744+ ],
745+ BlockFunAst = erl_syntax :fun_expr (BlockClauses ),
746+ BlockListAst = erl_syntax :abstract ([ BlockName || {BlockName , _ , _ } <- BlocksAsts ]),
747+ Ast = ? Q ([
748+ " template_compiler_runtime_internal:compose("
749+ " _@srcpos,"
750+ " _@template,"
751+ " _@args,"
752+ " _@runtime,"
753+ " _@context_vars,"
754+ " _@is_context_vars,"
755+ " _@vars,"
756+ " _@block_list," ,
757+ " _@block_fun," ,
758+ " _@context)"
759+ ],
760+ [
761+ {srcpos , erl_syntax :abstract (SrcPos )},
762+ {template , TemplateAst },
763+ {args , ArgsListAst },
764+ {vars , erl_syntax :variable (CState # cs .vars_var )},
765+ {runtime , erl_syntax :atom (Runtime )},
766+ {context , erl_syntax :variable (CState # cs .context_var )},
767+ {context_vars , erl_syntax :abstract (CState # cs .context_vars )},
768+ {block_list , BlockListAst },
769+ {block_fun , BlockFunAst },
770+ {is_context_vars , erl_syntax :abstract (IsContextVars )}
771+ ]),
772+ Ws2 = maybe_add_include (Template , undefined , false , Ws1 ),
773+ {Ws2 , Ast }.
774+
775+ catcompose ({_ , SrcPos , _ }, Template , IdAst , ArgsList , IsContextVars , Blocks , # cs {runtime = Runtime } = CState , Ws ) ->
776+ {Ws1 , TemplateAst } = template_compiler_expr :compile (Template , CState , Ws ),
777+ ArgsList1 = [ {erl_syntax :atom ('$cat' ), IdAst } | ArgsList ],
778+ ArgsListAst = erl_syntax :list ([ erl_syntax :tuple ([A ,B ]) || {A ,B } <- ArgsList1 ]),
779+ {_BlocksWs , BlocksAsts } = template_compiler :compile_blocks (Blocks , CState ),
780+ BlockClauses = [
781+ ? Q (" (_@BlockName@, Vars, Blocks, Context) -> _@BlockAst" )
782+ || {BlockName , BlockAst , _BlockWs } <- BlocksAsts
783+ ] ++ [
784+ ? Q (" (_BlockName, _Vars, _Blocks, _Context) -> <<>>" )
785+ ],
786+ BlockFunAst = erl_syntax :fun_expr (BlockClauses ),
787+ BlockListAst = erl_syntax :abstract ([ BlockName || {BlockName , _ , _ } <- BlocksAsts ]),
788+ Ast = ? Q ([
789+ " template_compiler_runtime_internal:compose("
790+ " _@srcpos,"
791+ " {cat, _@template},"
792+ " _@args,"
793+ " _@runtime,"
794+ " _@context_vars,"
795+ " _@is_context_vars,"
796+ " _@vars,"
797+ " _@block_list," ,
798+ " _@block_fun," ,
799+ " _@context)"
800+ ],
801+ [
802+ {srcpos , erl_syntax :abstract (SrcPos )},
803+ {template , TemplateAst },
804+ {args , ArgsListAst },
805+ {vars , erl_syntax :variable (CState # cs .vars_var )},
806+ {runtime , erl_syntax :atom (Runtime )},
807+ {context , erl_syntax :variable (CState # cs .context_var )},
808+ {context_vars , erl_syntax :abstract (CState # cs .context_vars )},
809+ {block_list , BlockListAst },
810+ {block_fun , BlockFunAst },
811+ {is_context_vars , erl_syntax :abstract (IsContextVars )}
812+ ]),
813+ Ws2 = maybe_add_include (Template , undefined , false , Ws1 ),
814+ {Ws2 , Ast }.
815+
816+
725817expr_list (ExprList , CState , Ws ) ->
726818 lists :foldr (
727819 fun (E , {WsAcc , ExprAcc }) ->
0 commit comments