This is an automated email from the ASF dual-hosted git repository.

ddekany pushed a commit to branch 2.3-gae
in repository https://gitbox.apache.org/repos/asf/freemarker.git

commit 36e33ae73e640cc7309a7858bb5c3bd37f3773d5
Author: ddekany <[email protected]>
AuthorDate: Sun Oct 27 16:21:28 2019 +0100

    (HashLiteral code cleanup)
---
 src/main/java/freemarker/core/HashLiteral.java | 58 +++++++++++++-------------
 src/main/javacc/FTL.jj                         |  6 ++-
 2 files changed, 33 insertions(+), 31 deletions(-)

diff --git a/src/main/java/freemarker/core/HashLiteral.java 
b/src/main/java/freemarker/core/HashLiteral.java
index 34c42e1..113b94d 100644
--- a/src/main/java/freemarker/core/HashLiteral.java
+++ b/src/main/java/freemarker/core/HashLiteral.java
@@ -22,7 +22,7 @@ package freemarker.core;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
-import java.util.ListIterator;
+import java.util.List;
 
 import freemarker.template.SimpleSequence;
 import freemarker.template.TemplateCollectionModel;
@@ -33,17 +33,16 @@ import freemarker.template.TemplateModelException;
 import freemarker.template.TemplateModelIterator;
 import freemarker.template._TemplateAPI;
 
+@SuppressWarnings("deprecation")
 final class HashLiteral extends Expression {
 
-    private final ArrayList keys, values;
+    private final List<? extends Expression> keys, values;
     private final int size;
 
-    HashLiteral(ArrayList/*<Expression>*/ keys, ArrayList/*<Expression>*/ 
values) {
+    HashLiteral(List<? extends Expression> keys, List<? extends Expression> 
values) {
         this.keys = keys;
         this.values = values;
         this.size = keys.size();
-        keys.trimToSize();
-        values.trimToSize();
     }
 
     @Override
@@ -55,8 +54,8 @@ final class HashLiteral extends Expression {
     public String getCanonicalForm() {
         StringBuilder buf = new StringBuilder("{");
         for (int i = 0; i < size; i++) {
-            Expression key = (Expression) keys.get(i);
-            Expression value = (Expression) values.get(i);
+            Expression key = keys.get(i);
+            Expression value = values.get(i);
             buf.append(key.getCanonicalForm());
             buf.append(": ");
             buf.append(value.getCanonicalForm());
@@ -79,8 +78,8 @@ final class HashLiteral extends Expression {
             return true;
         }
         for (int i = 0; i < size; i++) {
-            Expression key = (Expression) keys.get(i);
-            Expression value = (Expression) values.get(i);
+            Expression key = keys.get(i);
+            Expression value = values.get(i);
             if (!key.isLiteral() || !value.isLiteral()) {
                 return false;
             }
@@ -92,30 +91,31 @@ final class HashLiteral extends Expression {
     @Override
     protected Expression deepCloneWithIdentifierReplaced_inner(
             String replacedIdentifier, Expression replacement, 
ReplacemenetState replacementState) {
-               ArrayList clonedKeys = (ArrayList) keys.clone();
-               for (ListIterator iter = clonedKeys.listIterator(); 
iter.hasNext(); ) {
-            iter.set(((Expression) 
iter.next()).deepCloneWithIdentifierReplaced(
-                    replacedIdentifier, replacement, replacementState));
+               List<Expression> clonedKeys = new 
ArrayList<Expression>(keys.size());
+        for (Expression key : keys) {
+            
clonedKeys.add(key.deepCloneWithIdentifierReplaced(replacedIdentifier, 
replacement, replacementState));
         }
-               ArrayList clonedValues = (ArrayList) values.clone();
-               for (ListIterator iter = clonedValues.listIterator(); 
iter.hasNext(); ) {
-            iter.set(((Expression) 
iter.next()).deepCloneWithIdentifierReplaced(
-                    replacedIdentifier, replacement, replacementState));
+
+        List<Expression> clonedValues = new 
ArrayList<Expression>(values.size());
+        for (Expression value : values) {
+            
clonedValues.add(value.deepCloneWithIdentifierReplaced(replacedIdentifier, 
replacement, replacementState));
         }
+        
        return new HashLiteral(clonedKeys, clonedValues);
     }
 
+    @SuppressWarnings("deprecation")
     private class SequenceHash implements TemplateHashModelEx2 {
 
-        private HashMap map; // maps keys to integer offset
+        private HashMap<String, TemplateModel> map; // maps keys to integer 
offset
         private TemplateCollectionModel keyCollection, valueCollection; // 
ordered lists of keys and values
 
         SequenceHash(Environment env) throws TemplateException {
             if (_TemplateAPI.getTemplateLanguageVersionAsInt(HashLiteral.this) 
>= _TemplateAPI.VERSION_INT_2_3_21) {
-                map = new LinkedHashMap();
+                map = new LinkedHashMap<String, TemplateModel>();
                 for (int i = 0; i < size; i++) {
-                    Expression keyExp = (Expression) keys.get(i);
-                    Expression valExp = (Expression) values.get(i);
+                    Expression keyExp = keys.get(i);
+                    Expression valExp = values.get(i);
                     String key = keyExp.evalAndCoerceToPlainText(env);
                     TemplateModel value = valExp.eval(env);
                     if (env == null || !env.isClassicCompatible()) {
@@ -126,12 +126,12 @@ final class HashLiteral extends Expression {
             } else {
                 // Legacy hash literal, where repeated keys were kept when 
doing ?values or ?keys, yet overwritten when
                 // doing hash[key].
-                map = new HashMap();
-                ArrayList keyList = new ArrayList(size);
-                ArrayList valueList = new ArrayList(size);
+                map = new HashMap<String, TemplateModel>();
+                List<String> keyList = new ArrayList<String>(size);
+                List<TemplateModel> valueList = new 
ArrayList<TemplateModel>(size);
                 for (int i = 0; i < size; i++) {
-                    Expression keyExp = (Expression) keys.get(i);
-                    Expression valExp = (Expression) values.get(i);
+                    Expression keyExp = keys.get(i);
+                    Expression valExp = values.get(i);
                     String key = keyExp.evalAndCoerceToPlainText(env);
                     TemplateModel value = valExp.eval(env);
                     if (env == null || !env.isClassicCompatible()) {
@@ -167,7 +167,7 @@ final class HashLiteral extends Expression {
         }
 
         public TemplateModel get(String key) {
-            return (TemplateModel) map.get(key);
+            return map.get(key);
         }
 
         public boolean isEmpty() {
@@ -193,11 +193,11 @@ final class HashLiteral extends Expression {
                         private final TemplateModel key = keyIterator.next();
                         private final TemplateModel value = 
valueIterator.next();
 
-                        public TemplateModel getKey() throws 
TemplateModelException {
+                        public TemplateModel getKey() {
                             return key;
                         }
 
-                        public TemplateModel getValue() throws 
TemplateModelException {
+                        public TemplateModel getValue() {
                             return value;
                         }
                         
diff --git a/src/main/javacc/FTL.jj b/src/main/javacc/FTL.jj
index f69042f..dc01ce6 100644
--- a/src/main/javacc/FTL.jj
+++ b/src/main/javacc/FTL.jj
@@ -2522,8 +2522,8 @@ HashLiteral HashLiteral() :
 {
     Token begin, end;
     Expression key, value;
-    ArrayList keys = new ArrayList();
-    ArrayList values = new ArrayList();
+    ArrayList<Expression> keys = new ArrayList<Expression>();
+    ArrayList<Expression> values = new ArrayList<Expression>();
 }
 {
     begin = <OPENING_CURLY_BRACKET>
@@ -2550,6 +2550,8 @@ HashLiteral HashLiteral() :
     ]
     end = <CLOSING_CURLY_BRACKET>
     {
+        keys.trimToSize();
+        values.trimToSize();
         HashLiteral result = new HashLiteral(keys, values);
         result.setLocation(template, begin, end);
         return result;

Reply via email to