Repository: incubator-freemarker
Updated Branches:
  refs/heads/3 59829da65 -> f48c81368


Renamed macro_caller_template_name to caller_template_name, as it actually 
works for #function as well. Updated and cleaned up related tests.


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: 
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/f48c8136
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/f48c8136
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/f48c8136

Branch: refs/heads/3
Commit: f48c81368ff3e0c4a38b76c03303ea48c7a5840a
Parents: 59829da
Author: ddekany <ddek...@apache.org>
Authored: Sat Mar 10 08:22:51 2018 +0100
Committer: ddekany <ddek...@apache.org>
Committed: Sat Mar 10 08:22:51 2018 +0100

----------------------------------------------------------------------
 .../freemarker/core/CallerTemplateNameTest.java | 148 +++++++++++++++++++
 .../core/MacroCallerTemplateNameTest.java       | 142 ------------------
 .../freemarker/core/ASTExpBuiltInVariable.java  |  11 +-
 3 files changed, 154 insertions(+), 147 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/f48c8136/freemarker-core-test/src/test/java/org/apache/freemarker/core/CallerTemplateNameTest.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core-test/src/test/java/org/apache/freemarker/core/CallerTemplateNameTest.java
 
b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CallerTemplateNameTest.java
new file mode 100644
index 0000000..73363ae
--- /dev/null
+++ 
b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CallerTemplateNameTest.java
@@ -0,0 +1,148 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.freemarker.core;
+
+import org.apache.freemarker.test.TemplateTest;
+import org.apache.freemarker.test.TestConfigurationBuilder;
+import org.junit.Test;
+
+public class CallerTemplateNameTest  extends TemplateTest {
+
+    @Override
+    protected Configuration createDefaultConfiguration() throws Exception {
+        return new 
TestConfigurationBuilder().localizedTemplateLookup(true).build();
+    }
+
+    @Test
+    public void testBaics() throws Exception {
+        addTemplate("main.ftl", ""
+                + "<#macro m>${.callerTemplateName}</#macro>"
+                + "<#function f()><#return .callerTemplateName></#function>"
+                + "<@m /> ${f()} [<#include 'other.ftl'>] <@m /> ${f()}");
+        addTemplate("other.ftl", ""
+                + "<@m /> ${f()} [<#include 'yet-another.ftl'>] <@m /> 
${f()}");
+        addTemplate("yet-another.ftl", ""
+                + "<@m /> ${f()}");
+        
+        assertOutputForNamed("main.ftl", ""
+                + "main.ftl main.ftl "
+                + "[other.ftl other.ftl "
+                + "[yet-another.ftl yet-another.ftl] "
+                + "other.ftl other.ftl] "
+                + "main.ftl main.ftl");
+    }
+    
+    @Test
+    public void testNoCaller() throws Exception {
+        assertErrorContains("${.callerTemplateName}", "no macro or function");
+
+        assertErrorContains(""
+                + "<#macro m><#nested></#macro>"
+                + "<@m>${.callerTemplateName}</@>",
+                "no macro or function");
+
+        addTemplate("main.ftl", "${.callerTemplateName}");
+        assertErrorContainsForNamed("main.ftl", "no macro or function");
+    }
+
+    @Test
+    public void testNamelessCaller() throws Exception {
+        assertOutput(""
+                + "<#macro m2>${.callerTemplateName}</#macro>"
+                + "[<@m2/>]",
+                "[]");
+    }
+
+    @Test
+    public void testNested() throws Exception {
+        addTemplate("main.ftl", ""
+                + "<#include 'lib1.ftl'>"
+                + "<#include 'lib2.ftl'>"
+                + "<@m1 />");
+        addTemplate("lib1.ftl", ""
+                + "<#macro m1>"
+                + "${.callerTemplateName} [<@m2>${.callerTemplateName}</@m2>] 
${.callerTemplateName}"
+                + "</#macro>");
+        addTemplate("lib2.ftl", ""
+                + "<#macro m2>"
+                + "${.callerTemplateName} [<#nested>] ${.callerTemplateName}"
+                + "</#macro>");
+        assertOutputForNamed("main.ftl", ""
+                + "main.ftl [lib1.ftl [main.ftl] lib1.ftl] main.ftl");
+    }
+    
+    @Test
+    public void testSelfCaller() throws Exception {
+        addTemplate("main.ftl", ""
+                + "<#macro m>${.callerTemplateName}</#macro>"
+                + "<@m />");
+        assertOutputForNamed("main.ftl", "main.ftl");
+    }
+
+    @Test
+    public void testImportedTemplateCaller() throws Exception {
+        addTemplate("main.ftl", ""
+                + "<#import 'lib/foo.ftl' as foo>"
+                + "<@foo.m />, <@foo.m2 />");
+        addTemplate("lib/foo.ftl", ""
+                + "<#macro m>${.callerTemplateName}</#macro>"
+                + "<#macro m2><@m3/></#macro>"
+                + "<#macro m3>${.callerTemplateName}</#macro>");
+        assertOutputForNamed("main.ftl",
+                "main.ftl, lib/foo.ftl");
+    }
+    
+    @Test
+    public void testNestedIntoNonUserDirectives() throws Exception {
+        addTemplate("main.ftl", ""
+                + "<#macro m><#list 1..2 as _><#if 
true>${.callerTemplateName}</#if>;</#list></#macro>"
+                + "<@m/>");
+        assertOutputForNamed("main.ftl", "main.ftl;main.ftl;");
+    }
+
+    @Test
+    public void testUsedInArgument() throws Exception {
+        addTemplate("main.ftl", ""
+                + "<#include 'inc.ftl'>"
+                + "<#macro start>"
+                + "<@m .callerTemplateName />"
+                + "<@m2 />"
+                + "</#macro>"
+                + "<@start />");
+        addTemplate("inc.ftl", ""
+                + "<#macro m x{positional}, y{positional}=.callerTemplateName>"
+                + "x: ${x}; y: ${y}; caller: ${.callerTemplateName};"
+                + "</#macro>"
+                + "<#macro m2><@m .callerTemplateName /></#macro>");
+        
+        assertOutputForNamed("main.ftl", ""
+                + "x: main.ftl; y: main.ftl; caller: main.ftl;"
+                + "x: main.ftl; y: inc.ftl; caller: inc.ftl;");
+    }
+    
+    @Test
+    public void testReturnsLookupName() throws Exception {
+        addTemplate("main_en.ftl", ""
+                + "<#macro m>${.callerTemplateName}</#macro>"
+                + "<@m />");
+        assertOutputForNamed("main.ftl", "main.ftl"); // Not main_en.ftl
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/f48c8136/freemarker-core-test/src/test/java/org/apache/freemarker/core/MacroCallerTemplateNameTest.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core-test/src/test/java/org/apache/freemarker/core/MacroCallerTemplateNameTest.java
 
b/freemarker-core-test/src/test/java/org/apache/freemarker/core/MacroCallerTemplateNameTest.java
deleted file mode 100644
index d02a6dd..0000000
--- 
a/freemarker-core-test/src/test/java/org/apache/freemarker/core/MacroCallerTemplateNameTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core;
-
-import org.apache.freemarker.test.TemplateTest;
-import org.apache.freemarker.test.TestConfigurationBuilder;
-import org.junit.Test;
-
-public class MacroCallerTemplateNameTest  extends TemplateTest {
-
-    @Override
-    protected Configuration createDefaultConfiguration() throws Exception {
-        return new 
TestConfigurationBuilder().localizedTemplateLookup(true).build();
-    }
-
-    @Test
-    public void testNoCaller() throws Exception {
-        assertErrorContains("${.macroCallerTemplateName}", "no macro call");
-
-        assertErrorContains(""
-                + "<#macro m><#nested></#macro>"
-                + "<@m>${.macroCallerTemplateName}</@>",
-                "no macro call");
-
-        addTemplate("main.ftl", "${.macroCallerTemplateName}");
-        assertErrorContainsForNamed("main.ftl", "no macro call");
-    }
-
-    @Test
-    public void testNested() throws Exception {
-        assertOutput(""
-                + "<#macro m><#nested></#macro>"
-                + "<#macro m2><@m>${.macroCallerTemplateName}</@></#macro>"
-                + "[<@m2/>]",
-                "[]");
-        assertOutput(""
-                + "<#macro m2>${.macroCallerTemplateName}</#macro>"
-                + "[<@m2/>]",
-                "[]");
-    }
-    
-    @Test
-    public void testSameTemplateCaller() throws Exception {
-        addTemplate("main.ftl", ""
-                + "<#macro m>${.macroCallerTemplateName}</#macro>"
-                + "<@m />, 
<#attempt>${.macroCallerTemplateName}<#recover>-</#attempt>");
-        assertOutputForNamed("main.ftl", "main.ftl, -");
-    }
-
-    @Test
-    public void testIncludedTemplateCaller() throws Exception {
-        addTemplate("main.ftl", ""
-                + "<#include 'lib/foo.ftl'>"
-                + "<@m />, <@m2 />");
-        addTemplate("lib/foo.ftl", ""
-                + "<#macro m>${.macroCallerTemplateName}</#macro>"
-                + "<#macro m2><@m3/></#macro>"
-                + "<#macro m3>${.macroCallerTemplateName}</#macro>");
-        assertOutputForNamed("main.ftl",
-                "main.ftl, lib/foo.ftl");
-    }
-
-    @Test
-    public void testImportedTemplateCaller() throws Exception {
-        addTemplate("main.ftl", ""
-                + "<#import 'lib/foo.ftl' as foo>"
-                + "<@foo.m />, <@foo.m2 />");
-        addTemplate("lib/foo.ftl", ""
-                + "<#macro m>${.macroCallerTemplateName}</#macro>"
-                + "<#macro m2><@m3/></#macro>"
-                + "<#macro m3>${.macroCallerTemplateName}</#macro>");
-        assertOutputForNamed("main.ftl",
-                "main.ftl, lib/foo.ftl");
-    }
-    
-    @Test
-    public void testNestedIntoNonUserDirectives() throws Exception {
-        addTemplate("main.ftl", ""
-                + "<#macro m><#list 1..2 as _><#if 
true>${.macroCallerTemplateName}</#if>;</#list></#macro>"
-                + "<@m/>");
-        assertOutputForNamed("main.ftl", "main.ftl;main.ftl;");
-    }
-
-    @Test
-    public void testMulitpleLevels() throws Exception {
-        addTemplate("main.ftl", ""
-                + "<#include 'inc1.ftl'>"
-                + "<@m1 />");
-        addTemplate("inc1.ftl", ""
-                + "<#include 'inc2.ftl'>"
-                + "<#macro m1>m1: ${.macroCallerTemplateName}; <@m2 
/></#macro>");
-        addTemplate("inc2.ftl", ""
-                + "<#macro m2>m2: ${.macroCallerTemplateName};</#macro>");
-        assertOutputForNamed("main.ftl", "m1: main.ftl; m2: inc1.ftl;");
-    }
-
-    @Test
-    public void testUsedInArgument() throws Exception {
-        addTemplate("main.ftl", ""
-                + "<#include 'inc.ftl'>"
-                + "<#macro start>"
-                + "<@m .macroCallerTemplateName />"
-                + "<@m2 />"
-                + "</#macro>"
-                + "<@start />");
-        addTemplate("inc.ftl", ""
-                + "<#macro m x{positional}, 
y{positional}=.macroCallerTemplateName>"
-                + "x: ${x}; y: ${y}; caller: ${.macroCallerTemplateName};"
-                + "</#macro>"
-                + "<#macro m2><@m .macroCallerTemplateName /></#macro>");
-        
-        assertOutputForNamed("main.ftl", ""
-                + "x: main.ftl; y: main.ftl; caller: main.ftl;"
-                + "x: main.ftl; y: inc.ftl; caller: inc.ftl;");
-    }
-    
-    @Test
-    public void testReturnsLookupName() throws Exception {
-        addTemplate("main_en.ftl", ""
-                + "<#macro m>${.macroCallerTemplateName}</#macro>"
-                + "<@m />");
-        assertOutputForNamed("main.ftl", "main.ftl"); // Not main_en.ftl
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/f48c8136/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
index d55883d..08b9218 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
@@ -60,11 +60,12 @@ final class ASTExpBuiltInVariable extends ASTExpression {
     static final String URL_ESCAPING_CHARSET = "urlEscapingCharset";
     static final String NOW = "now";
     static final String GET_OPTIONAL_TEMPLATE = "getOptionalTemplate";
-    static final String MACRO_CALLER_TEMPLATE_NAME = 
"macroCallerTemplateName";    
+    static final String CALLER_TEMPLATE_NAME = "callerTemplateName";    
     
     static final Set<String> BUILT_IN_VARIABLE_NAMES = new _SortedArraySet<>(
-        // Must be sorted alphabetically!
+        // IMPORTANT! Keep this sorted alphabetically!
         AUTO_ESC,
+        CALLER_TEMPLATE_NAME,
         CURRENT_TEMPLATE_NAME,
         DATA_MODEL,
         ERROR,
@@ -75,7 +76,6 @@ final class ASTExpBuiltInVariable extends ASTExpression {
         LOCALE,
         LOCALE_OBJECT,
         LOCALS,
-        MACRO_CALLER_TEMPLATE_NAME,
         MAIN,
         MAIN_TEMPLATE_NAME,
         NAMESPACE,
@@ -203,12 +203,13 @@ final class ASTExpBuiltInVariable extends ASTExpression {
         if (name == GET_OPTIONAL_TEMPLATE) {
             return GetOptionalTemplateFunction.INSTANCE;
         }        
-        if (name == MACRO_CALLER_TEMPLATE_NAME) {
+        if (name == CALLER_TEMPLATE_NAME) {
             Context ctx = env.getCurrentMacroContext();
             if (ctx == null) {
                 // TODO [FM3] Adjust error message if the special variable 
syntax is not `.someName` anymore.
                 throw new TemplateException(
-                        "Can't get ." + MACRO_CALLER_TEMPLATE_NAME + " here, 
as there's no macro call in context.");
+                        "Can't get ." + CALLER_TEMPLATE_NAME + " here, as 
there's no macro or function (that's "
+                        + "implemented in the template) call in context.");
             }
             String name = ctx.callPlace.getTemplate().getLookupName();
             return name != null ? new SimpleString(name) : 
TemplateStringModel.EMPTY_STRING;

Reply via email to