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) {
