Просмотр исходного кода

erlydtl_beam_compiler: refactor custom_forms for readability..

Andreas Stenius 11 лет назад
Родитель
Сommit
82e3aa1d55
1 измененных файлов с 51 добавлено и 69 удалено
  1. 51 69
      src/erlydtl_beam_compiler.erl

+ 51 - 69
src/erlydtl_beam_compiler.erl

@@ -417,52 +417,36 @@ custom_tags_clauses_ast1([Tag|CustomTags], ExcludeTags, ClauseAcc, InfoAcc, Tree
             end
     end.
 
-dependencies_function(Dependencies) ->
-    ?Q("dependencies() -> _@Dependencies@.").
-
-translatable_strings_function(TranslatableStrings) ->
-    ?Q("translatable_strings() -> _@TranslatableStrings@.").
-
 custom_forms(Dir, Module, Functions, AstInfo) ->
-    Exported = [erl_syntax:arity_qualifier(erl_syntax:atom(source_dir), erl_syntax:integer(0)),
-                erl_syntax:arity_qualifier(erl_syntax:atom(dependencies), erl_syntax:integer(0)),
-                erl_syntax:arity_qualifier(erl_syntax:atom(translatable_strings), erl_syntax:integer(0)),
-                erl_syntax:arity_qualifier(erl_syntax:atom(render), erl_syntax:integer(1)),
-                erl_syntax:arity_qualifier(erl_syntax:atom(render), erl_syntax:integer(2)),
-                erl_syntax:arity_qualifier(erl_syntax:atom(render), erl_syntax:integer(3))
-                | lists:foldl(
-                    fun({FunctionName, _}, Acc) ->
-                            [erl_syntax:arity_qualifier(erl_syntax:atom(FunctionName), erl_syntax:integer(1)),
-                             erl_syntax:arity_qualifier(erl_syntax:atom(FunctionName), erl_syntax:integer(2))
-                             |Acc]
-                    end, [], Functions)
-               ],
-    ModuleAst = ?Q("-module('@Module@')."),
-    ExportAst = ?Q("-export(['@_Exported'/1])."),
-
-    SourceFunctionAst = ?Q("source_dir() -> _@Dir@."),
-
-    RenderAsts = ?Q(["render(Tag) -> render(Tag, [], []).",
-                     "render(Tag, Vars) -> render(Tag, Vars, []).",
-                     "render(Tag, Vars, Opts) ->",
-                     "    try '@Module@':Tag(Vars, Opts) of",
-                     "      Val -> {ok, Val}",
-                     "    catch",
-                     "      Err -> {error, Err}",
-                     "    end."]),
-
-    DependenciesFunctionAst = dependencies_function(AstInfo#ast_info.dependencies),
-    TranslatableStringsFunctionAst = translatable_strings_function(AstInfo#ast_info.translatable_strings),
-    FunctionAsts = lists:foldl(
-                     fun({_, FunctionDefs}, Acc) ->
-                             FunctionDefs ++ Acc
-                     end,
-                     RenderAsts, Functions),
-
-    [erl_syntax:revert(X)
-     || X <- [ModuleAst, ExportAst, SourceFunctionAst, DependenciesFunctionAst,
-              TranslatableStringsFunctionAst | FunctionAsts]
-    ].
+    Dependencies = AstInfo#ast_info.dependencies,
+    TranslatableStrings = AstInfo#ast_info.translatable_strings,
+
+    erl_syntax:revert_forms(
+      lists:flatten(
+        ?Q(["-module('@Module@').",
+            "-export([source_dir/0, dependencies/0, translatable_strings/0,",
+            "         render/1, render/2, render/3]).",
+            "-export(['@__export_functions'/0]).",
+            "source_dir() -> _@Dir@.",
+            "dependencies() -> _@Dependencies@.",
+            "translatable_strings() -> _@TranslatableStrings@.",
+            "render(Tag) -> render(Tag, [], []).",
+            "render(Tag, Vars) -> render(Tag, Vars, []).",
+            "render(Tag, Vars, Opts) ->",
+            "  try '@Module@':Tag(Vars, Opts) of",
+            "    Val -> {ok, Val}",
+            "  catch",
+            "    Err -> {error, Err}",
+            "  end.",
+            "'@_functions'() -> _."
+           ],
+           [{export_functions,
+             erl_syntax:list(
+               [erl_syntax:arity_qualifier(erl_syntax:atom(FName), erl_syntax:integer(Arity))
+                || {FName, _} <- Functions, Arity <- [1, 2]])},
+            {functions, [Ast || {_, Ast} <- Functions]}
+           ]))
+     ).
 
 stringify(BodyAst, #dtl_context{ binary_strings=BinaryStrings }) ->
     [?Q("erlydtl_runtime:stringify_final(_@BodyAst, '@BinaryStrings@')")].
@@ -485,30 +469,28 @@ forms({BodyAst, BodyInfo}, {CustomTagsFunctionAst, CustomTagsInfo}, CheckSum,
     FinalBodyAst = options_match_ast(TreeWalker) ++ stringify(BodyAst, Context),
 
     erl_syntax:revert_forms(
-      erl_syntax:form_list(
-        ?Q(["-module('@Module@').",
-            "-export([render/0, render/1, render/2, source/0, dependencies/0,",
-            "         translatable_strings/0, translated_blocks/0, variables/0,",
-            "         default_variables/0, constants/0]).",
-            "source() -> {_@File@, _@CheckSum@}.",
-            "dependencies() -> _@Dependencies@.",
-            "variables() -> _@Variables@.",
-            "default_variables() -> _@DefaultVariables@.",
-            "constants() -> _@Constants@.",
-            "translatable_strings() -> _@TranslatableStrings@.",
-            "translated_blocks() -> _@TranslatedBlocks@.",
-            "'@_CustomTagsFunctionAst'() -> _.",
-            "render() -> render([], []).",
-            "render(Variables) -> render(Variables, []).",
-            "render(Variables, RenderOptions) ->",
-            "  try render_internal(Variables, RenderOptions) of",
-            "    Val -> {ok, Val}",
-            "  catch",
-            "    Err -> {error, Err}",
-            "  end.",
-            "render_internal(_Variables, RenderOptions) -> _@FinalBodyAst."
-           ])
-       )).
+      ?Q(["-module('@Module@').",
+          "-export([render/0, render/1, render/2, source/0, dependencies/0,",
+          "         translatable_strings/0, translated_blocks/0, variables/0,",
+          "         default_variables/0, constants/0]).",
+          "source() -> {_@File@, _@CheckSum@}.",
+          "dependencies() -> _@Dependencies@.",
+          "variables() -> _@Variables@.",
+          "default_variables() -> _@DefaultVariables@.",
+          "constants() -> _@Constants@.",
+          "translatable_strings() -> _@TranslatableStrings@.",
+          "translated_blocks() -> _@TranslatedBlocks@.",
+          "'@_CustomTagsFunctionAst'() -> _.",
+          "render() -> render([], []).",
+          "render(Variables) -> render(Variables, []).",
+          "render(Variables, RenderOptions) ->",
+          "  try render_internal(Variables, RenderOptions) of",
+          "    Val -> {ok, Val}",
+          "  catch",
+          "    Err -> {error, Err}",
+          "  end.",
+          "render_internal(_Variables, RenderOptions) -> _@FinalBodyAst."
+         ])).
 
 options_match_ast(#treewalker{ context=Context }=TreeWalker) ->
     options_match_ast(Context, TreeWalker);