Parameters passed by position (as opposed to by name) must be separated by 
comma. Also, items in sequence literals must be separated by comma. In FM2, 
comma could be omitted on these places.


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

Branch: refs/heads/3
Commit: 23341885ae5837608490944abc80ab4eb8e7f615
Parents: 5a46ad3
Author: ddekany <[email protected]>
Authored: Mon Jul 17 21:05:19 2017 +0200
Committer: ddekany <[email protected]>
Committed: Mon Jul 17 21:05:19 2017 +0200

----------------------------------------------------------------------
 FM3-CHANGE-LOG.txt                              |  6 ++
 .../core/FM2ASTToFM3SourceConverter.java        | 90 +++++++++++++++-----
 .../freemarker/converter/FM2ToFM3Converter.java | 31 ++++---
 .../converter/FM2ToFM3ConverterTest.java        | 23 +++--
 .../freemarker/core/RemovedFM2SyntaxTest.java   | 25 +++++-
 .../org/apache/freemarker/core/ast-1.ftl        |  4 +-
 .../org/apache/freemarker/core/ast-range.ftl    |  2 +-
 .../core/templatesuite/templates/macros.ftl     |  6 +-
 .../templatesuite/templates/numerical-cast.ftl  |  2 +-
 freemarker-core/src/main/javacc/FTL.jj          |  2 +-
 .../apache/freemarker/test/TemplateTest.java    |  2 +-
 11 files changed, 145 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/FM3-CHANGE-LOG.txt
----------------------------------------------------------------------
diff --git a/FM3-CHANGE-LOG.txt b/FM3-CHANGE-LOG.txt
index 70300ce..de8fc83 100644
--- a/FM3-CHANGE-LOG.txt
+++ b/FM3-CHANGE-LOG.txt
@@ -42,6 +42,10 @@ Major changes / features
   then `template_loader` becomes to `templateLoader`, and if you use the XML 
features, then `node.@@nested_markup`
   becomes to `node.@@nestedMarkup`.
   Note that the template converter tool takes care of this conversion.
+- Parameters passed by position (as opposed to by name) must be separated by 
comma. Earlier the comma was optional
+  Examples:
+  `<@x x + 1 2 3 />` now must be written as `<@x x + 1, 2, 3 />`
+  `<#nested x y>` now must be written as `<#nested x, y>`
 
 Smaller changes
 ---------------
@@ -65,6 +69,8 @@ Node: Changes already mentioned above aren't repeated here!
   translated to `${b}`, while `#{x; m1M3}` is translated to 
`${x?string('0.0##')}`). The output should remain the same.
 - Removed some long deprecated built-ins:
   - `webSafe` (converted to `html`)
+- Comma is now required between sequence literal items (such as `[a, b, c]`). 
It's not well known, but in FM2 the comma
+  could be omitted.
 - #include has no "encoding" parameter anymore (as now only the Configuration 
is responsible ofr deciding the encoding)
 - You can't close #attempt/#recover with `</#recover>` anymore, only with 
`<#attempt>`. This was the
   standard form in FM2 as well, and is consistent with how #if/#else works. 
(The template converter

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
----------------------------------------------------------------------
diff --git 
a/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
 
b/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
index 04166e8..4b62179 100644
--- 
a/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
+++ 
b/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
@@ -38,6 +38,7 @@ import 
org.apache.freemarker.converter.UnconvertableLegacyFeatureException;
 import org.apache.freemarker.core.util.FTLUtil;
 import org.apache.freemarker.core.util._ClassUtil;
 import org.apache.freemarker.core.util._NullArgumentException;
+import org.apache.freemarker.core.util._ObjectHolder;
 import org.apache.freemarker.core.util._StringUtil;
 
 import com.google.common.collect.ImmutableMap;
@@ -648,7 +649,12 @@ public class FM2ASTToFM3SourceConverter {
             printExp(passedValue);
             pos = getEndPositionExclusive(passedValue);
             if (paramIdx < paramCnt - 1) {
-                printOptionalSeparatorAndWSAndExpComments(pos, ",");
+                _ObjectHolder<Boolean> hadSeparatorSymbol = new 
_ObjectHolder<>(null);
+                int spacingStartPos = out.length();
+                pos = printOptionalSeparatorAndWSAndExpComments(pos, ",", 
hadSeparatorSymbol);
+                if (!hadSeparatorSymbol.get()) {
+                    insertOmittedSeparatorComma(spacingStartPos);
+                }
             }
         }
         printDirStartTagEnd(node, pos, false);
@@ -1208,7 +1214,20 @@ public class FM2ASTToFM3SourceConverter {
                 print(' ');
                 legacyCallDirNeedsSeparatorSpace = false;
             }
-            printSeparatorAndWSAndExpComments(lastParamEnd, ",", true);
+
+            int spacingEndPos;
+            if (paramIdx > 1) {
+                _ObjectHolder<Boolean> hadSeparatorSymbol = new 
_ObjectHolder<>(null);
+                int spacingStartPos = out.length();
+                spacingEndPos = 
printOptionalSeparatorAndWSAndExpComments(lastParamEnd, ",", 
hadSeparatorSymbol);
+                if (!hadSeparatorSymbol.get()) {
+                    insertOmittedSeparatorComma(spacingStartPos);
+                }
+            } else {
+                spacingEndPos = printWSAndExpComments(lastParamEnd);
+            }
+            assertNodeContent(spacingEndPos == getStartPosition(argValue), 
node,
+                    "Preceding spacing end position and positional parameter 
value start position differs.");
             printExp(argValue);
 
             lastParamEnd = getEndPositionExclusive(argValue);
@@ -1297,6 +1316,15 @@ public class FM2ASTToFM3SourceConverter {
         }
     }
 
+    private void insertOmittedSeparatorComma(int spacingStartPos) {
+        // "x  y" -> "x y" (-> "x, y")
+        if (out.length() > spacingStartPos + 1
+                && out.charAt(spacingStartPos) == ' ' && 
out.charAt(spacingStartPos + 1) == ' ') {
+            out.deleteCharAt(spacingStartPos + 1);
+        }
+        out.insert(spacingStartPos, ',');
+    }
+
     private void printDirIfOrElseOrElseIf(ConditionalBlock node) throws 
ConverterException {
         assertParamCount(node, 2);
         Expression conditionExp = getParam(node, 0, ParameterRole.CONDITION, 
Expression.class);
@@ -1635,26 +1663,32 @@ public class FM2ASTToFM3SourceConverter {
         assertNodeContent(src.charAt(closeCharPos) == ']', node,
                 "Expected ']'");
 
+        print('[');
         int paramCnt = node.getParameterCount();
         if (paramCnt == 0) {
-            print('[');
             printWithConvertedExpComments(src.substring(openCharPos + 1, 
closeCharPos));
-            print(']');
         } else {
-            printWithParamsLeadingSkippedTokens("[", node);
+            int pos = openCharPos + 1;
+            pos = printWSAndExpComments(pos);
             Expression prevItem = null;
             for (int paramIdx = 0; paramIdx < paramCnt; paramIdx++) {
                 Expression item = getParam(node, paramIdx, 
ParameterRole.ITEM_VALUE, Expression.class);
 
-                if (prevItem != null) {
-                    printParameterSeparatorSource(prevItem, item);
+                if (paramIdx != 0) {
+                    _ObjectHolder<Boolean> hadSeparatorSymbol = new 
_ObjectHolder<>(null);
+                    int spacingStartPos = out.length();
+                    printOptionalSeparatorAndWSAndExpComments(pos, ",", 
hadSeparatorSymbol);
+                    if (!hadSeparatorSymbol.get()) {
+                        insertOmittedSeparatorComma(spacingStartPos);
+                    }
                 }
                 printExp(item);
-
-                prevItem = item;
+                pos = getEndPositionExclusive(item);
             }
-            printWithParamsTrailingSkippedTokens("]", node, 
node.getParameterCount() - 1);
+            pos = printWSAndExpComments(pos);
+            assertNodeContent(pos == closeCharPos, node, "Couldn't reach the 
']'");
         }
+        print(']');
     }
 
     private void printExpParenthetical(ParentheticalExpression node) throws 
ConverterException {
@@ -2281,18 +2315,25 @@ public class FM2ASTToFM3SourceConverter {
         return src.substring(startPos, 
getPositionAfterWSAndExpComments(startPos));
     }
 
-    private String readSeparatorAndWSAndExpComments(int startPos, String 
separator, boolean separatorOptional)
+    private String readSeparatorAndWSAndExpComments(int startPos, String 
separatorSymbol, boolean separatorOptional,
+            _ObjectHolder<Boolean> hadSeparatorSymbol)
             throws ConverterException {
         int pos = getPositionAfterWSAndExpComments(startPos);
 
-        if (pos == src.length() || !src.startsWith(separator, pos)) {
+        if (pos == src.length() || !src.startsWith(separatorSymbol, pos)) {
             if (!separatorOptional) {
                 throw new ConverterException(
-                        "Expected separator " + _StringUtil.jQuote(separator) 
+ " at position " + pos + ".");
+                        "Expected separator " + 
_StringUtil.jQuote(separatorSymbol) + " at position " + pos + ".");
+            }
+            if (hadSeparatorSymbol != null) {
+                hadSeparatorSymbol.set(false);
             }
             return src.substring(startPos, pos);
         }
-        pos += separator.length();
+        pos += separatorSymbol.length();
+        if (hadSeparatorSymbol != null) {
+            hadSeparatorSymbol.set(true);
+        }
 
         pos = getPositionAfterWSAndExpComments(pos);
 
@@ -2307,16 +2348,25 @@ public class FM2ASTToFM3SourceConverter {
     }
 
     private int printSeparatorAndWSAndExpComments(int pos, String separator) 
throws ConverterException {
-        return printSeparatorAndWSAndExpComments(pos, separator, false);
+        return printSeparatorAndWSAndExpComments(pos, separator, false, null);
+    }
+
+    private int printOptionalSeparatorAndWSAndExpComments(
+            int pos, String separator)
+            throws ConverterException {
+        return printOptionalSeparatorAndWSAndExpComments(pos, separator, null);
     }
 
-    private int printOptionalSeparatorAndWSAndExpComments(int pos, String 
separator) throws ConverterException {
-        return printSeparatorAndWSAndExpComments(pos, separator, true);
+    private int printOptionalSeparatorAndWSAndExpComments(
+            int pos, String separator, _ObjectHolder<Boolean> 
hadSeparatorSymbol)
+            throws ConverterException {
+        return printSeparatorAndWSAndExpComments(pos, separator, true, 
hadSeparatorSymbol);
     }
 
-    private int printSeparatorAndWSAndExpComments(int pos, String separator, 
boolean sepOptional)
+    private int printSeparatorAndWSAndExpComments(int pos, String separator, 
boolean sepOptional,
+            _ObjectHolder<Boolean> hadSeparatorSymbol)
             throws ConverterException {
-        String sep = readSeparatorAndWSAndExpComments(pos, separator, 
sepOptional);
+        String sep = readSeparatorAndWSAndExpComments(pos, separator, 
sepOptional, hadSeparatorSymbol);
         printWithConvertedExpComments(sep);
         pos += sep.length();
         return pos;
@@ -2458,4 +2508,6 @@ public class FM2ASTToFM3SourceConverter {
         }
     }
 
+
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-converter/src/main/java/org/apache/freemarker/converter/FM2ToFM3Converter.java
----------------------------------------------------------------------
diff --git 
a/freemarker-converter/src/main/java/org/apache/freemarker/converter/FM2ToFM3Converter.java
 
b/freemarker-converter/src/main/java/org/apache/freemarker/converter/FM2ToFM3Converter.java
index e9d7df3..ea9d9c2 100644
--- 
a/freemarker-converter/src/main/java/org/apache/freemarker/converter/FM2ToFM3Converter.java
+++ 
b/freemarker-converter/src/main/java/org/apache/freemarker/converter/FM2ToFM3Converter.java
@@ -84,6 +84,7 @@ public class FM2ToFM3Converter extends Converter {
     private Properties freeMarker2Settings;
     private Configuration fm2Cfg;
     private StringTemplateLoader stringTemplateLoader;
+    private boolean validateOutput = true;
 
     @Override
     protected Pattern getDefaultInclude() {
@@ -169,16 +170,18 @@ public class FM2ToFM3Converter extends Converter {
         fileTransCtx.getDestinationStream().write(
                 
result.getFM3Content().getBytes(getTemplateEncoding(result.getFM2Template())));
 
-        try {
-            org.apache.freemarker.core.Configuration fm3Config = new 
org.apache.freemarker.core.Configuration
-                    
.Builder(org.apache.freemarker.core.Configuration.getVersion() /* highest 
possible by design */)
-                    
.outputFormat(converOutputFormat(result.getFM2Template().getOutputFormat()))
-                    .build();
-            new org.apache.freemarker.core.Template(null, 
result.getFM3Content(), fm3Config);
-        } catch (Exception e) {
-            throw new ConverterException(
-                    "The result of the conversion wasn't valid FreeMarker 3 
template; see cause exception and "
-                    + fileTransCtx.getDestinationFile(), e);
+        if (validateOutput) {
+            try {
+                org.apache.freemarker.core.Configuration fm3Config = new 
org.apache.freemarker.core.Configuration
+                        
.Builder(org.apache.freemarker.core.Configuration.getVersion() /* highest 
possible by design */)
+                        
.outputFormat(converOutputFormat(result.getFM2Template().getOutputFormat()))
+                        .build();
+                new org.apache.freemarker.core.Template(null, 
result.getFM3Content(), fm3Config);
+            } catch (Exception e) {
+                throw new ConverterException(
+                        "The result of the conversion wasn't valid FreeMarker 
3 template; see cause exception and "
+                                + fileTransCtx.getDestinationFile(), e);
+            }
         }
     }
 
@@ -235,4 +238,12 @@ public class FM2ToFM3Converter extends Converter {
         this.freeMarker2Settings = freeMarker2Settings;
     }
 
+    public boolean getValidateOutput() {
+        return validateOutput;
+    }
+
+    public void setValidateOutput(boolean validateOutput) {
+        this.validateOutput = validateOutput;
+    }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-converter/src/test/java/org/freemarker/converter/FM2ToFM3ConverterTest.java
----------------------------------------------------------------------
diff --git 
a/freemarker-converter/src/test/java/org/freemarker/converter/FM2ToFM3ConverterTest.java
 
b/freemarker-converter/src/test/java/org/freemarker/converter/FM2ToFM3ConverterTest.java
index 3660262..cd70303 100644
--- 
a/freemarker-converter/src/test/java/org/freemarker/converter/FM2ToFM3ConverterTest.java
+++ 
b/freemarker-converter/src/test/java/org/freemarker/converter/FM2ToFM3ConverterTest.java
@@ -82,6 +82,10 @@ public class FM2ToFM3ConverterTest extends ConverterTest {
         assertConvertedSame("${f([1])}");
         assertConvertedSame("${f([1, [x,y], 3])}");
         assertConvertedSame("${f([<#--1--> 1, <#--2--> 2, <#--3--> 3 
<#--4-->])}");
+        assertConverted("${f([1, 2, 3])}", "${f([1 2 3])}");
+        assertConverted(
+                "${f([<#--1--> 1, <#--2--> 2, <#--3--> 3 <#--4-->])}",
+                "${f([<#--1--> 1 <#--2--> 2 <#--3--> 3 <#--4-->])}");
 
         assertConvertedSame("${f({})}");
         assertConvertedSame("${f({k: v})}");
@@ -208,9 +212,12 @@ public class FM2ToFM3ConverterTest extends ConverterTest {
         assertConvertedSame("<#macro \"m 1\"></#macro>");
         assertConvertedSame("<#macro m><#nested x + 1, 2, 3></#macro>");
         assertConvertedSame("<#macro m><#nested <#--1--> x + 1 <#--2-->, 
<#--3--> 2 <#--4-->></#macro>");
-        // [FM3] Will be different (comma)
-        assertConvertedSame("<#macro m><#nested x + 1 2 3></#macro>");
-        assertConvertedSame("<#macro m><#nested <#--1--> x + 1 <#--2--> 2 
<#--3-->></#macro>");
+        assertConverted(
+                "<#macro m><#nested x + 1, 2, 3></#macro>",
+                "<#macro m><#nested x + 1  2 3></#macro>");
+        assertConverted(
+                "<#macro m><#nested <#--1--> x + 1, <#--2--> 2 
<#--3-->></#macro>",
+                "<#macro m><#nested <#--1--> x + 1 <#--2--> 2 
<#--3-->></#macro>");
         assertConvertedSame("<#macro m><#nested x /></#macro>");
         assertConvertedSame("<#macro m><#return><#return ></#macro>");
 
@@ -419,15 +426,18 @@ public class FM2ToFM3ConverterTest extends ConverterTest {
         assertConvertedSame("<@foo x=1 y=2 />");
         assertConvertedSame("<@foo x\\-y=1 />");
         assertConvertedSame("<@foo\n\tx = 1\n\ty = 2\n/>");
-        assertConvertedSame("<@foo 1 2 />");
-        assertConvertedSame("<@foo <#--1--> 1 <#--2--> 2 <#--3--> />");
+        assertConverted("<@foo 1, 2 />", "<@foo 1 2 />");
+        assertConverted("<@foo <#--1--> 1, <#--2--> 2 <#--3--> />", "<@foo 
<#--1--> 1 <#--2--> 2 <#--3--> />");
         assertConvertedSame("<@foo 1, 2 />");
         assertConvertedSame("<@foo <#--1--> 1 <#--2-->, <#--3--> 2 <#--4--> 
/>");
         assertConvertedSame("<@foo x=1; i, j></@>");
         assertConvertedSame("<@foo 1; i, j></@>");
-        assertConvertedSame("<@foo 1 2; i\\-2, j></@>");
+        assertConverted("<@foo 1, 2; i\\-2, j></@>", "<@foo 1 2; i\\-2, 
j></@>");
         assertConvertedSame("<@foo x=1 y=2; i></@>");
         assertConvertedSame("<@foo x=1 ;\n    i <#-- C0 --> , <#--1-->\n\t<!-- 
C2 --> j <#--3-->\n></@>");
+        assertConverted("<@m 0, 1 .. n - 1, 2 />", "<@m 0 1 .. n - 1 2 />");
+        assertConverted("<@m 0, 1 .. n - 1, 2 />", "<@m 0  1 .. n - 1  2 />");
+        assertConverted("<@recurse dummy, a - 1 />", "<@recurse dummy  a - 1 
/>");
     }
 
     @Test
@@ -619,6 +629,7 @@ public class FM2ToFM3ConverterTest extends ConverterTest {
         converter.setSource(srcFile);
         converter.setDestinationDirectory(dstDir);
         converter.setInclude(null);
+        // converter.setValidateOutput(false);
         Properties properties = new Properties();
         properties.setProperty(Configuration.DEFAULT_ENCODING_KEY, 
UTF_8.name());
         if (squareBracketTagSyntax) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-core-test/src/test/java/org/apache/freemarker/core/RemovedFM2SyntaxTest.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core-test/src/test/java/org/apache/freemarker/core/RemovedFM2SyntaxTest.java
 
b/freemarker-core-test/src/test/java/org/apache/freemarker/core/RemovedFM2SyntaxTest.java
index 89b981c..cd9923d 100644
--- 
a/freemarker-core-test/src/test/java/org/apache/freemarker/core/RemovedFM2SyntaxTest.java
+++ 
b/freemarker-core-test/src/test/java/org/apache/freemarker/core/RemovedFM2SyntaxTest.java
@@ -19,16 +19,33 @@
 
 package org.apache.freemarker.core;
 
+import java.io.IOException;
+
 import org.apache.freemarker.test.TemplateTest;
 import org.junit.Test;
 
+@SuppressWarnings("ThrowableNotThrown")
 public class RemovedFM2SyntaxTest extends TemplateTest {
 
     @Test
-    public void testRemovedOperators() {
-       assertErrorContains("<#if a & b></#if>", ParseException.class);
-       assertErrorContains("<#if a | b></#if>", ParseException.class);
-       assertErrorContains("<#if a = b></#if>", ParseException.class);
+    public void testRemovedOperators() throws IOException, TemplateException {
+        assertErrorContains("<#if true & true>x</#if>", ParseException.class);
+        assertOutput("<#if true && true>x</#if>", "x");
+
+        assertErrorContains("<#if false | true>x</#if>", ParseException.class);
+        assertOutput("<#if false || true>x</#if>", "x");
+
+        assertErrorContains("<#if 'a' = 'a'>x</#if>", ParseException.class);
+        assertOutput("<#if 'a' == 'a'>x</#if>", "x");
+    }
+
+    @Test
+    public void testCallSyntax() throws IOException, TemplateException {
+        assertErrorContains("<@m 1 2 />", ParseException.class);
+        assertErrorContains("<@m 1, 2 />", InvalidReferenceException.class);
+
+        assertErrorContains("\"<#macro m><#nested 1 2></#macro>\"", 
ParseException.class);
+        assertOutput("<#macro m><#nested 1, 2></#macro>", "");
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-1.ftl
----------------------------------------------------------------------
diff --git 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-1.ftl 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-1.ftl
index 8c8953a..f57e65e 100644
--- 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-1.ftl
+++ 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-1.ftl
@@ -17,11 +17,11 @@
   under the License.
 -->
 1 <@foo x=1 y=2; b1, b2>x</@foo>
-2 <@ns.bar 1 2; b1, b2>y</@>
+2 <@ns.bar 1, 2; b1, b2>y</@>
 3 <#assign x = 123><#assign x = 123 in ns><#global x = 123>
 4 <#if x + 1 == 0>foo${y}bar<#else>${"static"}${'x${baaz * 10}y'}</#if>
 5 <#switch x><#case 1>one<#case 2>two<#default>more</#switch>
-6 <#macro foo x y=2 z=y+1 q...><#nested x y></#macro>
+6 <#macro foo x y=2 z=y+1 q...><#nested x, y></#macro>
 7 <#function foo x y><#local x = 123><#return 1></#function>
 8 <#list xs as x></#list>
 9 <#list xs>[<#items as x>${x}<#sep>, </#items>]<#else>None</#list>

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-range.ftl
----------------------------------------------------------------------
diff --git 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-range.ftl
 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-range.ftl
index d11dc84..a942763 100644
--- 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-range.ftl
+++ 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/ast-range.ftl
@@ -44,4 +44,4 @@
 
 ${f(m.., m-1.., m+1..n-1)}
 
-<@m 1 * m .. m - 1 m + 1 .. n - 1 m .. />
+<@m 1 * m .. m - 1, m + 1 .. n - 1, m .. />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/macros.ftl
----------------------------------------------------------------------
diff --git 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/macros.ftl
 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/macros.ftl
index 3c8811a..9ceaa43 100644
--- 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/macros.ftl
+++ 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/macros.ftl
@@ -45,7 +45,7 @@
 
 <p>Function is defined, now let's call it:</p>
 
-   <@español urls.home images.home "Home" /><#t>
+   <@español urls.home, images.home, "Home" /><#t>
 
 <p>Again, but with different parameters:</p>
 
@@ -65,7 +65,7 @@
 
 <#macro recurse(dummy, a=3)>
     <#if (a > 0)>
-        <@recurse dummy  a - 1 />
+        <@recurse dummy, a - 1 />
     </#if>
     ${a}
 </#macro>
@@ -93,7 +93,7 @@ foo=${foo} baz=[<#list bar?keys?sort as 
key>${key}=${bar[key]}<#if key_has_next>
 <#macro m a=1 b=2>
 </#macro>
 <@assertFails message='"c"'><@m c=3 /></@>
-<@assertFails message='3'><@m 9 8 7 /></@>
+<@assertFails message='3'><@m 9, 8, 7 /></@>
 
 <@fmt "Hello {0}! Today is {1}.", "World", "Monday" />
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/numerical-cast.ftl
----------------------------------------------------------------------
diff --git 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/numerical-cast.ftl
 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/numerical-cast.ftl
index 67e09ad..37ae7e1 100644
--- 
a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/numerical-cast.ftl
+++ 
b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/numerical-cast.ftl
@@ -28,7 +28,7 @@
         2147483647, 2147483648, -2147483647, -2147483648,
         4294967295, 4294967296, -4294967295, -4294967296,
         2147483647.1, 2147483648.1, -2147483647.1, -2147483648.1,
-        4294967295.1, 4294967296.1, -4294967295.1, -4294967296.1
+        4294967295.1, 4294967296.1, -4294967295.1, -4294967296.1,
         2147483647.5, 2147483648.5, -2147483647.5, -2147483648.5,
         4294967295.5, 4294967296.5, -4294967295.5, -4294967296.5
   ] />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-core/src/main/javacc/FTL.jj
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/javacc/FTL.jj 
b/freemarker-core/src/main/javacc/FTL.jj
index 22aaf2a..cedc199 100644
--- a/freemarker-core/src/main/javacc/FTL.jj
+++ b/freemarker-core/src/main/javacc/FTL.jj
@@ -3074,7 +3074,7 @@ ArrayList PositionalArgs() :
     [
         arg = ASTExpression() { result.add(arg); }
         (
-            [<COMMA>]
+            <COMMA>
             arg = ASTExpression() { result.add(arg); }
         )*
     ]

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/23341885/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TemplateTest.java
----------------------------------------------------------------------
diff --git 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TemplateTest.java
 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TemplateTest.java
index ca40b09..3ee5fb2 100644
--- 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TemplateTest.java
+++ 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/TemplateTest.java
@@ -271,7 +271,7 @@ public abstract class TemplateTest {
                 t = new Template("adhoc", ftl, getConfiguration());
             }
             t.process(getDataModel(), new StringWriter());
-            fail("The tempalte had to fail");
+            fail("The template had to fail");
             return null;
         } catch (TemplateException e) {
             if (exceptionClass != null) {

Reply via email to