Some internal AST oversight fixes, and a new internal parser setting, 
preventStrippings. These are needed for the FM2 to FM3 converter.


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

Branch: refs/heads/2.3
Commit: 9b879885406d687595fb7dafd772087dd83541cb
Parents: a36ea52
Author: ddekany <ddek...@apache.org>
Authored: Sat Jul 8 00:53:30 2017 +0200
Committer: ddekany <ddek...@apache.org>
Committed: Sat Jul 8 00:53:30 2017 +0200

----------------------------------------------------------------------
 .../java/freemarker/core/NumericalOutput.java   |  4 ++--
 src/main/java/freemarker/core/TextBlock.java    |  4 ++--
 .../java/freemarker/core/TrimInstruction.java   |  8 +++----
 src/main/java/freemarker/core/_CoreAPI.java     |  4 ++++
 .../java/freemarker/template/Configuration.java | 22 +++++++++++++++++++-
 src/main/java/freemarker/template/Template.java |  9 +++++---
 .../java/freemarker/template/_TemplateAPI.java  |  4 ++++
 src/main/javacc/FTL.jj                          | 15 ++++++++++---
 .../freemarker/core/ast-strlitinterpolation.ast |  4 ++--
 9 files changed, 57 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/java/freemarker/core/NumericalOutput.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/NumericalOutput.java 
b/src/main/java/freemarker/core/NumericalOutput.java
index bd1ed11..08e8301 100644
--- a/src/main/java/freemarker/core/NumericalOutput.java
+++ b/src/main/java/freemarker/core/NumericalOutput.java
@@ -150,8 +150,8 @@ final class NumericalOutput extends Interpolation {
     Object getParameterValue(int idx) {
         switch (idx) {
         case 0: return expression;
-        case 1: return Integer.valueOf(minFracDigits);
-        case 2: return Integer.valueOf(maxFracDigits);
+        case 1: return hasFormat ? Integer.valueOf(minFracDigits) : null;
+        case 2: return hasFormat ? Integer.valueOf(maxFracDigits) : null;
         default: throw new IndexOutOfBoundsException();
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/java/freemarker/core/TextBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/TextBlock.java 
b/src/main/java/freemarker/core/TextBlock.java
index fb343fa..8be305b 100644
--- a/src/main/java/freemarker/core/TextBlock.java
+++ b/src/main/java/freemarker/core/TextBlock.java
@@ -143,8 +143,8 @@ public final class TextBlock extends TemplateElement {
     private boolean deliberateLeftTrim() {
         boolean result = false;
         for (TemplateElement elem = this.nextTerminalNode(); 
-             elem != null && elem.beginLine == this.endLine;
-             elem = elem.nextTerminalNode()) {
+            elem != null && elem.beginLine == this.endLine;
+            elem = elem.nextTerminalNode()) {
             if (elem instanceof TrimInstruction) {
                 TrimInstruction ti = (TrimInstruction) elem;
                 if (!ti.left && !ti.right) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/java/freemarker/core/TrimInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/TrimInstruction.java 
b/src/main/java/freemarker/core/TrimInstruction.java
index 1279b99..a563a8a 100644
--- a/src/main/java/freemarker/core/TrimInstruction.java
+++ b/src/main/java/freemarker/core/TrimInstruction.java
@@ -25,10 +25,10 @@ package freemarker.core;
  */
 final class TrimInstruction extends TemplateElement {
     
-    private static final int TYPE_T = 0;  
-    private static final int TYPE_LT = 1;  
-    private static final int TYPE_RT = 2;  
-    private static final int TYPE_NT = 3;  
+    static final int TYPE_T = 0;  
+    static final int TYPE_LT = 1;  
+    static final int TYPE_RT = 2;  
+    static final int TYPE_NT = 3;  
 
     final boolean left, right;
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/java/freemarker/core/_CoreAPI.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/core/_CoreAPI.java 
b/src/main/java/freemarker/core/_CoreAPI.java
index 66442da..1f10f81 100644
--- a/src/main/java/freemarker/core/_CoreAPI.java
+++ b/src/main/java/freemarker/core/_CoreAPI.java
@@ -213,5 +213,9 @@ public class _CoreAPI {
     public static TemplateElement getChildElement(TemplateElement te, int 
index) {
         return te.getChild(index);
     }
+
+    public static void setPreventStrippings(FMParser parser, boolean 
preventStrippings) {
+        parser.setPreventStrippings(preventStrippings);
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/java/freemarker/template/Configuration.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/Configuration.java 
b/src/main/java/freemarker/template/Configuration.java
index 57b0121..5956a39 100644
--- a/src/main/java/freemarker/template/Configuration.java
+++ b/src/main/java/freemarker/template/Configuration.java
@@ -499,7 +499,8 @@ public class Configuration extends Configurable implements 
Cloneable, ParserConf
     private Version incompatibleImprovements;
     private int tagSyntax = ANGLE_BRACKET_TAG_SYNTAX;
     private int namingConvention = AUTO_DETECT_NAMING_CONVENTION;
-    private int tabSize = 8;  // Default from JavaCC 3.x 
+    private int tabSize = 8;  // Default from JavaCC 3.x
+    private boolean preventStrippings;
 
     private TemplateCache cache;
     
@@ -2399,6 +2400,25 @@ public class Configuration extends Configurable 
implements Cloneable, ParserConf
     }
     
     /**
+     * Getter pair of {@link #setPreventStrippings(boolean)}.
+     * 
+     * @since 2.3.27
+     */
+    boolean getPreventStrippings() {
+        return preventStrippings;
+    }
+
+    /**
+     * Used internally; added for the FreeMarker 2 to FreeMarker 3 converter, 
prevents the stripping/removal of AST
+     * nodes so that the source code can be fully reproduced from the AST.
+     * 
+     * @since 2.3.27
+     */
+    void setPreventStrippings(boolean preventStrippings) {
+        this.preventStrippings = preventStrippings;
+    }
+
+    /**
      * Retrieves the template with the given name from the template cache, 
loading it into the cache first if it's
      * missing/staled.
      * 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/java/freemarker/template/Template.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/Template.java 
b/src/main/java/freemarker/template/Template.java
index 6c2aa4e..240e527 100644
--- a/src/main/java/freemarker/template/Template.java
+++ b/src/main/java/freemarker/template/Template.java
@@ -225,9 +225,9 @@ public class Template extends Configurable {
      * @since 2.3.24
      */
     public Template(
-            String name, String sourceName, Reader reader,
-            Configuration cfg, ParserConfiguration customParserConfiguration,
-            String encoding) throws IOException {
+           String name, String sourceName, Reader reader,
+           Configuration cfg, ParserConfiguration customParserConfiguration,
+           String encoding) throws IOException {
         this(name, sourceName, cfg, customParserConfiguration);
         
         this.setEncoding(encoding);
@@ -243,6 +243,9 @@ public class Template extends Configurable {
             
             try {
                 FMParser parser = new FMParser(this, reader, 
actualParserConfiguration);
+                if (cfg != null) {
+                    _CoreAPI.setPreventStrippings(parser, 
cfg.getPreventStrippings());
+                }
                 try {
                     this.rootElement = parser.Root();
                 } catch (IndexOutOfBoundsException exc) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/java/freemarker/template/_TemplateAPI.java
----------------------------------------------------------------------
diff --git a/src/main/java/freemarker/template/_TemplateAPI.java 
b/src/main/java/freemarker/template/_TemplateAPI.java
index 373e0e6..22cbc21 100644
--- a/src/main/java/freemarker/template/_TemplateAPI.java
+++ b/src/main/java/freemarker/template/_TemplateAPI.java
@@ -164,5 +164,9 @@ public class _TemplateAPI {
     public static TimeZone getDefaultTimeZone() {
         return Configuration.getDefaultTimeZone();
     }
+
+    public static void setPreventStrippings(Configuration conf, boolean 
preventStrippings) {
+        conf.setPreventStrippings(preventStrippings);
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/main/javacc/FTL.jj
----------------------------------------------------------------------
diff --git a/src/main/javacc/FTL.jj b/src/main/javacc/FTL.jj
index 75c7784..94338af 100644
--- a/src/main/javacc/FTL.jj
+++ b/src/main/javacc/FTL.jj
@@ -70,7 +70,7 @@ public class FMParser {
 
     private Template template;
 
-    private boolean stripWhitespace, stripText;
+    private boolean stripWhitespace, stripText, preventStrippings;
     private int incompatibleImprovements;
     private OutputFormat outputFormat;
     private int autoEscapingPolicy;
@@ -291,6 +291,13 @@ public class FMParser {
         parentTokenSource.namingConvention = token_source.namingConvention;
         parentTokenSource.namingConventionEstabilisher = 
token_source.namingConventionEstabilisher;
     }
+    
+    /**
+     * Used when we need to recreate the source code from the AST (such as for 
the FM2 to FM3 converter).
+     */
+    void setPreventStrippings(boolean preventStrippings) {
+        this.preventStrippings = preventStrippings;
+    }
 
     private OutputFormat getFormatFromStdFileExt() {
         String sourceName = template.getSourceName();
@@ -3975,7 +3982,7 @@ TextBlock PCData() :
         }
     )+
     {
-        if (stripText && mixedContentNesting == 1) return null;
+        if (stripText && mixedContentNesting == 1 && !preventStrippings) 
return null;
 
         TextBlock result = new TextBlock(buf.toString(), false);
         result.setLocation(template, start, t);
@@ -4383,7 +4390,9 @@ TemplateElement Root() :
     {
         TemplateElement root = children.asSingleElement(); 
         root.setFieldsForRootElement();
-        root = root.postParseCleanup(stripWhitespace);
+        if (!preventStrippings) {
+            root = root.postParseCleanup(stripWhitespace);
+        }
         // The cleanup result is possibly an element from deeper:
         root.setFieldsForRootElement();
         return root;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/9b879885/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
----------------------------------------------------------------------
diff --git a/src/test/resources/freemarker/core/ast-strlitinterpolation.ast 
b/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
index 7d14e80..e8130bb 100644
--- a/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
+++ b/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
@@ -60,8 +60,8 @@
                 - content: x  // f.c.Identifier
             - value part: #{...}  // f.c.NumericalOutput
                 - content: y  // f.c.Identifier
-                - minimum decimals: "0"  // Integer
-                - maximum decimals: "0"  // Integer
+                - minimum decimals: null  // Null
+                - maximum decimals: null  // Null
     #text  // f.c.TextBlock
         - content: "\n6. "  // String
     ${...}  // f.c.DollarVariable

Reply via email to