Repository: incubator-freemarker Updated Branches: refs/heads/3 557ee7c8c -> 80e4c3424
Inside a #switch, #case can't be after #default anymore (this is actually a bug in FM2) Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/80e4c342 Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/80e4c342 Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/80e4c342 Branch: refs/heads/3 Commit: 80e4c342423f2eee3b9ba2df875fec09bb2fe84f Parents: 557ee7c Author: ddekany <[email protected]> Authored: Sun Jul 9 18:50:51 2017 +0200 Committer: ddekany <[email protected]> Committed: Sun Jul 9 18:50:51 2017 +0200 ---------------------------------------------------------------------- FM3-CHANGE-LOG.txt | 1 + .../core/FM2ASTToFM3SourceConverter.java | 17 ++++++++++++++++- .../converter/FM2ToFM3ConverterTest.java | 7 +++++++ .../core/templatesuite/expected/switch.txt | 6 ------ .../core/templatesuite/templates/switch.ftl | 8 ++------ freemarker-core/src/main/javacc/FTL.jj | 14 +++++++++----- 6 files changed, 35 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/80e4c342/FM3-CHANGE-LOG.txt ---------------------------------------------------------------------- diff --git a/FM3-CHANGE-LOG.txt b/FM3-CHANGE-LOG.txt index 93a8669..058459b 100644 --- a/FM3-CHANGE-LOG.txt +++ b/FM3-CHANGE-LOG.txt @@ -297,3 +297,4 @@ the FreeMarer 3 changelog here: - 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 tool does this conversion.) +- Inside a #switch, #case can't be after #default anymore (this is actually a bug in FM2) \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/80e4c342/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 0e0ed11..4f7ffef 100644 --- a/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java +++ b/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java @@ -109,7 +109,7 @@ public class FM2ASTToFM3SourceConverter { String outAsString = out.toString(); try { - //!!T new org.apache.freemarker.core.Template(null, s, fm3Config); + new org.apache.freemarker.core.Template(null, outAsString, fm3Config); } catch (Exception e) { throw new ConverterException( "The result of the conversion wasn't valid FreeMarker 3 template; see cause exception", e); @@ -523,6 +523,21 @@ public class FM2ASTToFM3SourceConverter { printStartTagEnd(node, param, false); + // FM2 have allowed #case after #default, FM3 doesn't: + boolean pastDefault = false; + for (int i = 0; i < node.getChildCount(); i++) { + TemplateElement child = node.getChild(i); + if (child instanceof Case) { + if (((Case) child).condition == null) { + pastDefault = true; + } else if (pastDefault) { + throw new UnconvertableLegacyFeatureException("The \"case\" directive can't be after " + + "the \"default\" directive since FreeMarker 3. You need to rearrange this \"switch\".", + child.getBeginLine(), child.getBeginColumn()); + } + } + } + printChildElements(node); printDirEndTag(node, "switch"); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/80e4c342/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 980d833..7d691c9 100644 --- a/freemarker-converter/src/test/java/org/freemarker/converter/FM2ToFM3ConverterTest.java +++ b/freemarker-converter/src/test/java/org/freemarker/converter/FM2ToFM3ConverterTest.java @@ -344,6 +344,13 @@ public class FM2ToFM3ConverterTest extends ConverterTest { assertConvertedSame("<#switch x> </#switch>"); assertConvertedSame("<#switch x><#-- Empty --></#switch>"); assertConverted("<#switch x> <#case 2> </#switch>", "<#switch x> <#case 2> </#switch>"); + try { + convert("<#switch x><#default><#case 1></#switch>"); + fail(); + } catch (UnconvertableLegacyFeatureException e) { + assertEquals(1, (Object) e.getRow()); + assertEquals(22, (Object) e.getColumn()); + } assertConvertedSame("<#visit node>"); assertConvertedSame("<#visit <#--1--> node <#--2-->>"); http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/80e4c342/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/switch.txt ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/switch.txt b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/switch.txt index d0dbd27..440f65b 100644 --- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/switch.txt +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/switch.txt @@ -71,12 +71,6 @@ "34" "4" - "12default45" - "2default45" - "default" - "45" - "5" - </body> </html> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/80e4c342/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/switch.ftl ---------------------------------------------------------------------- diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/switch.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/switch.ftl index c1b4cb7..6c147b9 100644 --- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/switch.ftl +++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/switch.ftl @@ -130,13 +130,9 @@ "<#switch x><#case 1>1<#case 2>2<#case 3>3<#case 4>4</#switch>" </#list> -<#-- Legacy parser bug: #default might not be the last, but it doesn't fall through if called directly --> -<#list [1, 2, 3, 4, 5] as x> - "<#switch x><#case 1>1<#case 2>2<#default>default<#case 4>4<#case 5>5</#switch>" -</#list> - -<#-- two #default-s are parsing error --> +<#-- Parsing errors --> <@assertFails message="can only have one default"><@"<#switch 1><#case 1><#default><#default></#switch>"?interpret /></@> +<@assertFails message="after the \"default\""><@"<#switch 1><#default><#case 1></#switch>"?interpret /></@> </body> </html> http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/80e4c342/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 7968e1e..5f70a8c 100644 --- a/freemarker-core/src/main/javacc/FTL.jj +++ b/freemarker-core/src/main/javacc/FTL.jj @@ -3199,7 +3199,7 @@ ASTDirSwitch Switch() : { ASTDirSwitch switchBlock; ASTImplicitParent ignoredSectionBeforeFirstCase = null; - ASTDirCase caseIns; + ASTDirCase caseOrDefault; ASTExpression switchExp; Token start, end; boolean defaultFound = false; @@ -3217,16 +3217,20 @@ ASTDirSwitch Switch() : } ( LOOKAHEAD(2) - caseIns = ASTDirCase() + caseOrDefault = ASTDirCase() { - if (caseIns.condition == null) { + if (caseOrDefault.condition == null) { if (defaultFound) { throw new ParseException( - "You can only have one default case in a switch statement", template, start); + "You can only have one default case in a switch statement", template, start); } defaultFound = true; + } else if (defaultFound) { + throw new ParseException( + "You can't have a \"case\" directive after the \"default\" directive", + caseOrDefault); } - switchBlock.addCase(caseIns); + switchBlock.addCase(caseOrDefault); } )* [<STATIC_TEXT_WS>]
