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>]

Reply via email to