diff --git a/src/main/java/com/hubspot/jinjava/lib/tag/CallTag.java b/src/main/java/com/hubspot/jinjava/lib/tag/CallTag.java index fa4294e87..37f7ac749 100644 --- a/src/main/java/com/hubspot/jinjava/lib/tag/CallTag.java +++ b/src/main/java/com/hubspot/jinjava/lib/tag/CallTag.java @@ -65,20 +65,40 @@ public String getName() { @Override public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) { - String macroExpr = "{{" + tagNode.getHelpers().trim() + "}}"; + String macroCallExpr = tagNode.getHelpers().trim(); + + LinkedHashMap argNamesWithDefaults = new LinkedHashMap<>(); + + if (macroCallExpr.startsWith("(")) { + int closeIdx = macroCallExpr.indexOf(')'); + if (closeIdx != -1) { + String params = macroCallExpr.substring(1, closeIdx).trim(); + if (!params.isEmpty()) { + MacroTag.populateArgNames( + tagNode.getLineNumber(), + interpreter, + params, + argNamesWithDefaults + ); + } + macroCallExpr = macroCallExpr.substring(closeIdx + 1).trim(); + } + } + + String macroExpr = "{{" + macroCallExpr + "}}"; try (InterpreterScopeClosable c = interpreter.enterNonStackingScope()) { - LinkedHashMap args = new LinkedHashMap<>(); MacroFunction caller = new MacroFunction( tagNode.getChildren(), "caller", - args, + argNamesWithDefaults, true, interpreter.getContext(), interpreter.getLineNumber(), interpreter.getPosition() ); interpreter.getContext().addGlobalMacro(caller); + interpreter.getContext().put(caller.getName(), caller); return interpreter.render(macroExpr); } diff --git a/src/test/java/com/hubspot/jinjava/lib/tag/CallTagTest.java b/src/test/java/com/hubspot/jinjava/lib/tag/CallTagTest.java index b3b152d02..358bc6620 100644 --- a/src/test/java/com/hubspot/jinjava/lib/tag/CallTagTest.java +++ b/src/test/java/com/hubspot/jinjava/lib/tag/CallTagTest.java @@ -45,6 +45,13 @@ public void itDoesNotDoubleCountCallTagTowardsDepth() throws IOException { } } + @Test + public void testCallerArgsFn() { + String result = interpreter.render(fixture("caller_args")); + System.out.println(result); + assertThat(result).isEqualTo(fixture("caller_args.expected")); + } + private String fixture(String name) { try { return Resources.toString( diff --git a/src/test/resources/tags/calltag/caller_args.expected.jinja b/src/test/resources/tags/calltag/caller_args.expected.jinja new file mode 100644 index 000000000..650e9addd --- /dev/null +++ b/src/test/resources/tags/calltag/caller_args.expected.jinja @@ -0,0 +1,9 @@ +start +before + #a b c# +after + +before + caller is undefined => #a b# +after +stop \ No newline at end of file diff --git a/src/test/resources/tags/calltag/caller_args.jinja b/src/test/resources/tags/calltag/caller_args.jinja new file mode 100644 index 000000000..42bb0a5aa --- /dev/null +++ b/src/test/resources/tags/calltag/caller_args.jinja @@ -0,0 +1,17 @@ +start +{% macro test(arg1, arg2) -%} +before +{%- if caller is undefined %} + caller is undefined => #{{ arg1 }} {{ arg2 }}# +{%- else %} + {{ caller(arg1, arg2) }} +{%- endif %} +after +{%- endmacro -%} + +{% call(arg1, arg2, arg3 = "c") test({"a_key": "a"}, "b") -%} +#{{ arg1.a_key }} {{ arg2 }} {{ arg3 }}# +{%- endcall %} + +{{ test("a", "b") }} +stop \ No newline at end of file