changeset 1593:8faab9cd4b95

8143896: java.lang.Long is implicitly converted to double Reviewed-by: mhaupt, jlaskey
author hannesw
date Tue, 12 Jan 2016 16:30:10 +0100
parents bb63b699c060
children 9ab6b645c428
files src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExpExecResult.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeString.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornGuards.java src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java test/script/basic/JDK-8030200.js test/script/basic/JDK-8079145.js.EXPECTED test/script/basic/JDK-8143896.js test/script/nosecurity/parserapi.js test/script/nosecurity/parserapi.js.EXPECTED
diffstat 17 files changed, 1260 insertions(+), 1030 deletions(-) [+]
line wrap: on
line diff
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeArray.java	Tue Jan 12 16:30:10 2016 +0100
@@ -284,8 +284,8 @@
         // Step 3c and 3d - get new length and convert to long
         final long newLen = NativeArray.validLength(newLenDesc.getValue());
 
-        // Step 3e
-        newLenDesc.setValue(newLen);
+        // Step 3e - note that we need to convert to int or double as long is not considered a JS number type anymore
+        newLenDesc.setValue(JSType.isRepresentableAsInt(newLen) ? Integer.valueOf((int) newLen) : Double.valueOf((double) newLen));
 
         // Step 3f
         // increasing array length - just need to set new length value (and attributes if any) and return
@@ -918,21 +918,6 @@
      * @throws ClassCastException if array is empty, facilitating Undefined return value
      */
     @SpecializedFunction(name="pop", linkLogic=PopLinkLogic.class)
-    public static long popLong(final Object self) {
-        //must be non empty Int or LongArrayData
-        return getContinuousNonEmptyArrayDataCCE(self, IntOrLongElements.class).fastPopLong();
-    }
-
-    /**
-     * Specialization of pop for ContinuousArrayData
-     *
-     * Primitive specialization, {@link LinkLogic}
-     *
-     * @param self self reference
-     * @return element popped
-     * @throws ClassCastException if array is empty, facilitating Undefined return value
-     */
-    @SpecializedFunction(name="pop", linkLogic=PopLinkLogic.class)
     public static double popDouble(final Object self) {
         //must be non empty int long or double array data
         return getContinuousNonEmptyArrayDataCCE(self, NumericElements.class).fastPopDouble();
@@ -997,7 +982,7 @@
      * @return array length after push
      */
     @SpecializedFunction(linkLogic=PushLinkLogic.class)
-    public static long push(final Object self, final int arg) {
+    public static double push(final Object self, final int arg) {
         return getContinuousArrayDataCCE(self, Integer.class).fastPush(arg);
     }
 
@@ -1011,7 +996,7 @@
      * @return array length after push
      */
     @SpecializedFunction(linkLogic=PushLinkLogic.class)
-    public static long push(final Object self, final long arg) {
+    public static double push(final Object self, final long arg) {
         return getContinuousArrayDataCCE(self, Long.class).fastPush(arg);
     }
 
@@ -1025,7 +1010,7 @@
      * @return array length after push
      */
     @SpecializedFunction(linkLogic=PushLinkLogic.class)
-    public static long push(final Object self, final double arg) {
+    public static double push(final Object self, final double arg) {
         return getContinuousArrayDataCCE(self, Double.class).fastPush(arg);
     }
 
@@ -1039,7 +1024,7 @@
      * @return array length after push
      */
     @SpecializedFunction(name="push", linkLogic=PushLinkLogic.class)
-    public static long pushObject(final Object self, final Object arg) {
+    public static double pushObject(final Object self, final Object arg) {
         return getContinuousArrayDataCCE(self, Object.class).fastPush(arg);
     }
 
@@ -1081,7 +1066,7 @@
      * @return array after pushes
      */
     @SpecializedFunction
-    public static long push(final Object self, final Object arg) {
+    public static double push(final Object self, final Object arg) {
         try {
             final ScriptObject sobj = (ScriptObject)self;
             final ArrayData arrayData = sobj.getArray();
@@ -1498,7 +1483,7 @@
      * @return index of element, or -1 if not found
      */
     @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
-    public static long indexOf(final Object self, final Object searchElement, final Object fromIndex) {
+    public static double indexOf(final Object self, final Object searchElement, final Object fromIndex) {
         try {
             final ScriptObject sobj = (ScriptObject)Global.toObject(self);
             final long         len  = JSType.toUint32(sobj.getLength());
@@ -1534,7 +1519,7 @@
      * @return index of element, or -1 if not found
      */
     @Function(attributes = Attribute.NOT_ENUMERABLE, arity = 1)
-    public static long lastIndexOf(final Object self, final Object... args) {
+    public static double lastIndexOf(final Object self, final Object... args) {
         try {
             final ScriptObject sobj = (ScriptObject)Global.toObject(self);
             final long         len  = JSType.toUint32(sobj.getLength());
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeDate.java	Tue Jan 12 16:30:10 2016 +0100
@@ -256,8 +256,9 @@
      * @return a Date that points to the current moment in time
      */
     @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR)
-    public static long now(final Object self) {
-        return System.currentTimeMillis();
+    public static double now(final Object self) {
+        // convert to double as long does not represent the primitive JS number type
+        return (double) System.currentTimeMillis();
     }
 
     /**
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeNumber.java	Tue Jan 12 16:30:10 2016 +0100
@@ -48,6 +48,7 @@
 import jdk.nashorn.internal.runtime.ScriptObject;
 import jdk.nashorn.internal.runtime.ScriptRuntime;
 import jdk.nashorn.internal.runtime.doubleconv.DoubleConversion;
+import jdk.nashorn.internal.runtime.linker.NashornGuards;
 import jdk.nashorn.internal.runtime.linker.PrimitiveLookup;
 
 /**
@@ -315,7 +316,7 @@
      * @return Link to be invoked at call site.
      */
     public static GuardedInvocation lookupPrimitive(final LinkRequest request, final Object receiver) {
-        return PrimitiveLookup.lookupPrimitive(request, Number.class, new NativeNumber(((Number)receiver).doubleValue()), WRAPFILTER, PROTOFILTER);
+        return PrimitiveLookup.lookupPrimitive(request, NashornGuards.getNumberGuard(), new NativeNumber(((Number)receiver).doubleValue()), WRAPFILTER, PROTOFILTER);
     }
 
     @SuppressWarnings("unused")
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExpExecResult.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeRegExpExecResult.java	Tue Jan 12 16:30:10 2016 +0100
@@ -74,7 +74,7 @@
     @Getter(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
     public static Object length(final Object self) {
         if (self instanceof ScriptObject) {
-            return JSType.toUint32(((ScriptObject)self).getArray().length());
+            return (double) JSType.toUint32(((ScriptObject)self).getArray().length());
         }
 
         return 0;
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeString.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/NativeString.java	Tue Jan 12 16:30:10 2016 +0100
@@ -146,7 +146,7 @@
 
         if (returnType == Object.class && JSType.isString(self)) {
             try {
-                return new GuardedInvocation(MH.findStatic(MethodHandles.lookup(), NativeString.class, "get", desc.getMethodType()), NashornGuards.getInstanceOf2Guard(String.class, ConsString.class));
+                return new GuardedInvocation(MH.findStatic(MethodHandles.lookup(), NativeString.class, "get", desc.getMethodType()), NashornGuards.getStringGuard());
             } catch (final LookupException e) {
                 //empty. Shouldn't happen. Fall back to super
             }
@@ -1235,8 +1235,8 @@
      * @return Link to be invoked at call site.
      */
     public static GuardedInvocation lookupPrimitive(final LinkRequest request, final Object receiver) {
-        final MethodHandle guard = NashornGuards.getInstanceOf2Guard(String.class, ConsString.class);
-        return PrimitiveLookup.lookupPrimitive(request, guard, new NativeString((CharSequence)receiver), WRAPFILTER, PROTOFILTER);
+        return PrimitiveLookup.lookupPrimitive(request, NashornGuards.getStringGuard(),
+                new NativeString((CharSequence)receiver), WRAPFILTER, PROTOFILTER);
     }
 
     @SuppressWarnings("unused")
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/JSType.java	Tue Jan 12 16:30:10 2016 +0100
@@ -178,6 +178,12 @@
     /** Method handle for void returns. */
     public static final Call VOID_RETURN = staticCall(JSTYPE_LOOKUP, JSType.class, "voidReturn", void.class);
 
+    /** Method handle for isString method */
+    public static final Call IS_STRING = staticCall(JSTYPE_LOOKUP, JSType.class, "isString", boolean.class, Object.class);
+
+    /** Method handle for isNumber method */
+    public static final Call IS_NUMBER = staticCall(JSTYPE_LOOKUP, JSType.class, "isNumber", boolean.class, Object.class);
+
     /**
      * The list of available accessor types in width order. This order is used for type guesses narrow{@literal ->} wide
      *  in the dual--fields world
@@ -280,7 +286,7 @@
             return JSType.STRING;
         }
 
-        if (obj instanceof Number) {
+        if (isNumber(obj)) {
             return JSType.NUMBER;
         }
 
@@ -322,7 +328,7 @@
             return JSType.STRING;
         }
 
-        if (obj instanceof Number) {
+        if (isNumber(obj)) {
             return JSType.NUMBER;
         }
 
@@ -434,7 +440,7 @@
         return obj == null ||
                obj == ScriptRuntime.UNDEFINED ||
                isString(obj) ||
-               obj instanceof Number ||
+               isNumber(obj) ||
                obj instanceof Boolean ||
                obj instanceof Symbol;
     }
@@ -610,6 +616,24 @@
     }
 
     /**
+     * Returns true if object represents a primitive JavaScript number value. Note that we only
+     * treat wrapper objects of Java primitive number types as objects that can be fully represented
+     * as JavaScript numbers (doubles). This means we exclude {@code long} and special purpose Number
+     * instances such as {@link java.util.concurrent.atomic.AtomicInteger}, as well as arbitrary precision
+     * numbers such as {@link java.math.BigInteger}.
+     *
+     * @param obj the object
+     * @return true if the object represents a primitive JavaScript number value.
+     */
+    public static boolean isNumber(final Object obj) {
+        if (obj != null) {
+            final Class<?> c = obj.getClass();
+            return c == Integer.class || c == Double.class || c == Float.class || c == Short.class || c == Byte.class;
+        }
+        return false;
+    }
+
+    /**
      * JavaScript compliant conversion of integer to String
      *
      * @param num an integer
@@ -761,7 +785,7 @@
         if (obj instanceof Double) {
             return (Double)obj;
         }
-        if (obj instanceof Number) {
+        if (isNumber(obj)) {
             return ((Number)obj).doubleValue();
         }
         return Double.NaN;
@@ -1337,7 +1361,7 @@
             return obj.toString();
         }
 
-        if (obj instanceof Number) {
+        if (isNumber(obj)) {
             return toString(((Number)obj).doubleValue());
         }
 
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ContinuousArrayData.java	Tue Jan 12 16:30:10 2016 +0100
@@ -287,7 +287,7 @@
      * @param arg argument
      * @return new array length
      */
-    public long fastPush(final int arg) {
+    public double fastPush(final int arg) {
         throw new ClassCastException(String.valueOf(getClass())); //type is wrong, relink
     }
 
@@ -296,7 +296,7 @@
      * @param arg argument
      * @return new array length
      */
-    public long fastPush(final long arg) {
+    public double fastPush(final long arg) {
         throw new ClassCastException(String.valueOf(getClass())); //type is wrong, relink
     }
 
@@ -305,7 +305,7 @@
      * @param arg argument
      * @return new array length
      */
-    public long fastPush(final double arg) {
+    public double fastPush(final double arg) {
         throw new ClassCastException(String.valueOf(getClass())); //type is wrong, relink
     }
 
@@ -314,7 +314,7 @@
      * @param arg argument
      * @return new array length
      */
-    public long fastPush(final Object arg) {
+    public double fastPush(final Object arg) {
         throw new ClassCastException(String.valueOf(getClass())); //type is wrong, relink
     }
 
@@ -330,14 +330,6 @@
      * Specialization - fast pop implementation
      * @return element value
      */
-    public long fastPopLong() {
-        throw new ClassCastException(String.valueOf(getClass())); //type is wrong, relink
-    }
-
-    /**
-     * Specialization - fast pop implementation
-     * @return element value
-     */
     public double fastPopDouble() {
        throw new ClassCastException(String.valueOf(getClass())); //type is wrong, relink
     }
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/IntArrayData.java	Tue Jan 12 16:30:10 2016 +0100
@@ -340,7 +340,7 @@
     }
 
     @Override
-    public long fastPush(final int arg) {
+    public double fastPush(final int arg) {
         final int len = (int)length();
         if (len == array.length) {
             array = Arrays.copyOf(array, nextSize(len));
@@ -362,11 +362,6 @@
     }
 
     @Override
-    public long fastPopLong() {
-        return fastPopInt();
-    }
-
-    @Override
     public double fastPopDouble() {
         return fastPopInt();
     }
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/NumberArrayData.java	Tue Jan 12 16:30:10 2016 +0100
@@ -303,17 +303,17 @@
     }
 
     @Override
-    public long fastPush(final int arg) {
+    public double fastPush(final int arg) {
         return fastPush((double)arg);
     }
 
     @Override
-    public long fastPush(final long arg) {
+    public double fastPush(final long arg) {
         return fastPush((double)arg);
     }
 
     @Override
-    public long fastPush(final double arg) {
+    public double fastPush(final double arg) {
         final int len = (int)length();
         if (len == array.length) {
            //note that fastpush never creates spares arrays, there is nothing to gain by that - it will just use even more memory
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/arrays/ObjectArrayData.java	Tue Jan 12 16:30:10 2016 +0100
@@ -236,22 +236,22 @@
     }
 
     @Override
-    public long fastPush(final int arg) {
+    public double fastPush(final int arg) {
         return fastPush((Object)arg);
     }
 
     @Override
-    public long fastPush(final long arg) {
+    public double fastPush(final long arg) {
         return fastPush((Object)arg);
     }
 
     @Override
-    public long fastPush(final double arg) {
+    public double fastPush(final double arg) {
         return fastPush((Object)arg);
     }
 
     @Override
-    public long fastPush(final Object arg) {
+    public double fastPush(final Object arg) {
         final int len = (int)length();
         if (len == array.length) {
             array = Arrays.copyOf(array, nextSize(len));
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornGuards.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornGuards.java	Tue Jan 12 16:30:10 2016 +0100
@@ -34,6 +34,7 @@
 import jdk.dynalink.linker.LinkRequest;
 import jdk.nashorn.api.scripting.JSObject;
 import jdk.nashorn.internal.objects.Global;
+import jdk.nashorn.internal.runtime.JSType;
 import jdk.nashorn.internal.runtime.Property;
 import jdk.nashorn.internal.runtime.PropertyMap;
 import jdk.nashorn.internal.runtime.ScriptFunction;
@@ -46,10 +47,9 @@
 public final class NashornGuards {
     private static final MethodHandle IS_MAP              = findOwnMH("isMap", boolean.class, ScriptObject.class, PropertyMap.class);
     private static final MethodHandle IS_MAP_SCRIPTOBJECT = findOwnMH("isMap", boolean.class, Object.class, PropertyMap.class);
-    private static final MethodHandle IS_INSTANCEOF_2     = findOwnMH("isInstanceOf2", boolean.class, Object.class, Class.class, Class.class);
     private static final MethodHandle IS_SCRIPTOBJECT     = findOwnMH("isScriptObject", boolean.class, Object.class);
     private static final MethodHandle IS_NOT_JSOBJECT     = findOwnMH("isNotJSObject", boolean.class, Object.class);
-    private static final MethodHandle SAME_OBJECT       = findOwnMH("sameObject", boolean.class, Object.class, WeakReference.class);
+    private static final MethodHandle SAME_OBJECT         = findOwnMH("sameObject", boolean.class, Object.class, WeakReference.class);
     //TODO - maybe put this back in ScriptFunction instead of the ClassCastException.class relinkage
     //private static final MethodHandle IS_SCRIPTFUNCTION = findOwnMH("isScriptFunction", boolean.class, Object.class);
 
@@ -165,14 +165,21 @@
     }
 
     /**
-     * Get a guard that checks if in item is an instance of either of two classes.
+     * Get a guard that checks if in item is a JS string.
      *
-     * @param class1 the first class
-     * @param class2 the second class
      * @return method handle for guard
      */
-    public static MethodHandle getInstanceOf2Guard(final Class<?> class1, final Class<?> class2) {
-        return MH.insertArguments(IS_INSTANCEOF_2, 1, class1, class2);
+    public static MethodHandle getStringGuard() {
+        return JSType.IS_STRING.methodHandle();
+    }
+
+    /**
+     * Get a guard that checks if in item is a JS number.
+     *
+     * @return method handle for guard
+     */
+    public static MethodHandle getNumberGuard() {
+        return JSType.IS_NUMBER.methodHandle();
     }
 
     /**
@@ -224,11 +231,6 @@
     }
 
     @SuppressWarnings("unused")
-    private static boolean isInstanceOf2(final Object self, final Class<?> class1, final Class<?> class2) {
-        return class1.isInstance(self) || class2.isInstance(self);
-    }
-
-    @SuppressWarnings("unused")
     private static boolean isScriptFunction(final Object self) {
         return self instanceof ScriptFunction;
     }
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java	Tue Jan 12 15:38:07 2016 +0100
+++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornPrimitiveLinker.java	Tue Jan 12 16:30:10 2016 +0100
@@ -57,7 +57,8 @@
     }
 
     private static boolean canLinkTypeStatic(final Class<?> type) {
-        return type == String.class || type == Boolean.class || type == ConsString.class || Number.class.isAssignableFrom(type);
+        return type == String.class || type == Boolean.class || type == ConsString.class || type == Integer.class
+                || type == Double.class || type == Float.class || type == Short.class || type == Byte.class;
     }
 
     @Override
@@ -167,7 +168,7 @@
 
     @SuppressWarnings("unused")
     private static boolean isJavaScriptPrimitive(final Object o) {
-        return JSType.isString(o) || o instanceof Boolean || o instanceof Number || o == null;
+        return JSType.isString(o) || o instanceof Boolean || JSType.isNumber(o) || o == null;
     }
 
     private static final MethodHandle GUARD_PRIMITIVE = findOwnMH("isJavaScriptPrimitive", boolean.class, Object.class);
--- a/test/script/basic/JDK-8030200.js	Tue Jan 12 15:38:07 2016 +0100
+++ b/test/script/basic/JDK-8030200.js	Tue Jan 12 16:30:10 2016 +0100
@@ -33,4 +33,4 @@
 var s = n.toString(5);
 var m = parseInt(s, 5);
 print(m === n);
-print(n);
+print(m);
--- a/test/script/basic/JDK-8079145.js.EXPECTED	Tue Jan 12 15:38:07 2016 +0100
+++ b/test/script/basic/JDK-8079145.js.EXPECTED	Tue Jan 12 16:30:10 2016 +0100
@@ -5,8 +5,8 @@
 int array: check widen for true [class java.lang.Boolean]
 int array: check widen for 34 [class java.lang.Byte]
 int array: check widen for 344454 [class java.lang.Integer]
-int array: check widen for 454545 [class java.lang.Long]
-int array: check widen for 2147483648 [class java.lang.Long]
+int array: check widen for 454545
+int array: check widen for 2147483648
 int array: check widen for 34.29999923706055 [class java.lang.Float]
 int array: check widen for 3.141592653589793 [class java.lang.Double]
 int array: check widen for s
@@ -17,8 +17,8 @@
 long array: check widen for true [class java.lang.Boolean]
 long array: check widen for 34 [class java.lang.Byte]
 long array: check widen for 344454 [class java.lang.Integer]
-long array: check widen for 454545 [class java.lang.Long]
-long array: check widen for 2147483648 [class java.lang.Long]
+long array: check widen for 454545
+long array: check widen for 2147483648
 long array: check widen for 34.29999923706055 [class java.lang.Float]
 long array: check widen for 3.141592653589793 [class java.lang.Double]
 long array: check widen for s
@@ -29,8 +29,8 @@
 number array: check widen for true [class java.lang.Boolean]
 number array: check widen for 34 [class java.lang.Byte]
 number array: check widen for 344454 [class java.lang.Integer]
-number array: check widen for 454545 [class java.lang.Long]
-number array: check widen for 2147483648 [class java.lang.Long]
+number array: check widen for 454545
+number array: check widen for 2147483648
 number array: check widen for 34.29999923706055 [class java.lang.Float]
 number array: check widen for 3.141592653589793 [class java.lang.Double]
 number array: check widen for s
@@ -41,8 +41,8 @@
 object array: check widen for true [class java.lang.Boolean]
 object array: check widen for 34 [class java.lang.Byte]
 object array: check widen for 344454 [class java.lang.Integer]
-object array: check widen for 454545 [class java.lang.Long]
-object array: check widen for 2147483648 [class java.lang.Long]
+object array: check widen for 454545
+object array: check widen for 2147483648
 object array: check widen for 34.29999923706055 [class java.lang.Float]
 object array: check widen for 3.141592653589793 [class java.lang.Double]
 object array: check widen for s
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/script/basic/JDK-8143896.js	Tue Jan 12 16:30:10 2016 +0100
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ * 
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ * 
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ * 
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * JDK-8143896: java.lang.Long is implicitly converted to double
+ *
+ * @test
+ * @run
+ */
+
+Assert.assertTrue(java.lang.Long.valueOf("301077366599181567").toString() === "301077366599181567");
+Assert.assertTrue(java.lang.Long.valueOf("-301077366599181567").toString() === "-301077366599181567");
+Assert.assertTrue(java.lang.Long.valueOf("301077366599181567") == 301077366599181567);
+Assert.assertFalse(java.lang.Long.valueOf("301077366599181567") === 301077366599181567);
+
+Assert.assertTrue(new java.math.BigInteger("301077366599181567").toString() === "301077366599181567");
+Assert.assertTrue(new java.math.BigInteger("-301077366599181567").toString() === "-301077366599181567");
+Assert.assertTrue(new java.math.BigInteger("301077366599181567") == 301077366599181567);
+Assert.assertFalse(new java.math.BigInteger("301077366599181567") === 301077366599181567);
+
+
+var n = new java.lang.Byte("123");
+Assert.assertTrue(typeof n === "number");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertTrue(n === 123);
+
+n = new java.lang.Short("123");
+Assert.assertTrue(typeof n === "number");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertTrue(n === 123);
+
+n = new java.lang.Integer("123");
+Assert.assertTrue(typeof n === "number");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertTrue(n === 123);
+
+n = new java.lang.Float("123");
+Assert.assertTrue(typeof n === "number");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertTrue(n === 123);
+
+n = new java.lang.Double("123");
+Assert.assertTrue(typeof n === "number");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertTrue(n === 123);
+
+n = new java.lang.Long("123");
+Assert.assertTrue(typeof n === "object");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertFalse(n === 123);
+
+n = new java.util.concurrent.atomic.DoubleAdder();
+n.add("123");
+Assert.assertTrue(typeof n === "object");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertFalse(n === 123);
+
+n = new java.util.concurrent.atomic.AtomicInteger(123);
+Assert.assertTrue(typeof n === "object");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertFalse(n === 123);
+
+n = new java.util.concurrent.atomic.AtomicLong(123);
+Assert.assertTrue(typeof n === "object");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertFalse(n === 123);
+
+n = new java.math.BigInteger("123");
+Assert.assertTrue(typeof n === "object");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertFalse(n === 123);
+
+n = new java.math.BigDecimal("123");
+Assert.assertTrue(typeof n === "object");
+Assert.assertTrue(n + 1 === 124);
+Assert.assertTrue(n == 123);
+Assert.assertFalse(n === 123);
--- a/test/script/nosecurity/parserapi.js	Tue Jan 12 15:38:07 2016 +0100
+++ b/test/script/nosecurity/parserapi.js	Tue Jan 12 16:30:10 2016 +0100
@@ -30,8 +30,8 @@
  */
 
 function Parser() {
-   // create nashorn parser
-   this._parser = Parser.create();
+    // create nashorn parser
+    this._parser = Parser.create();
 }
 
 // Java types used
@@ -54,59 +54,60 @@
 
 // convert Nashorn parser Tree, Diagnostic as a script friendly object
 Parser.prototype.convert = function(tree) {
-    if (!tree || typeof tree != 'object') {
+    if (!tree || typeof tree != 'object' || tree instanceof java.lang.Long) {
         return tree;
     }
 
     var obj = Object.bindProperties({}, tree);
     var result = {};
     for (var i in obj) {
-       var val = obj[i];
-       if (val instanceof Parser.Tree) {
-          result[i] = this.convert(val);
-       } else if (val instanceof Parser.List) {
-          var arr = new Array(val.size());
-          for (var j in val) {
-              arr[j] = this.convert(val[j]);
-          }
-      
-          result[i] = arr;
-      } else {
-          switch (typeof val) {
-              case 'number':
-              case 'string':
-              case 'boolean':
-                  result[i] = String(val);
-              default:
-                  if (val instanceof Parser.Enum) {
-                      result[i] = String(val);
-                  }
-          }
-      }
-   }
-   return result;
+        var val = obj[i];
+        if (val instanceof Parser.Tree) {
+            result[i] = this.convert(val);
+        } else if (val instanceof Parser.List) {
+            var arr = new Array(val.size());
+            for (var j in val) {
+                arr[j] = this.convert(val[j]);
+            }
+
+            result[i] = arr;
+        } else {
+            switch (typeof val) {
+                case 'number':
+                case 'string':
+                case 'boolean':
+                    result[i] = String(val);
+                    break;
+                default:
+                    if (val instanceof java.lang.Long || val instanceof Parser.Enum) {
+                        result[i] = String(val);
+                    }
+            }
+        }
+    }
+    return result;
 }
 
 function processFiles(subdir) {
-   var File = Java.type("java.io.File");
-   var files = new File(__DIR__ + subdir).listFiles();
-   java.util.Arrays.sort(files);
-   for each (var file in files) {
-       if (file.name.endsWith(".js")) {
-           var script = readFully(file);
-           var parser = new Parser();
-           var tree = parser.parse(subdir + "/" + file.name, script,
-               function(diagnostic) {
-                   print(JSON.stringify(parser.convert(diagnostic), null, 2).replace(/\\r/g, ''));
-                   print(",");
-               });
+    var File = Java.type("java.io.File");
+    var files = new File(__DIR__ + subdir).listFiles();
+    java.util.Arrays.sort(files);
+    for each (var file in files) {
+        if (file.name.endsWith(".js")) {
+            var script = readFully(file);
+            var parser = new Parser();
+            var tree = parser.parse(subdir + "/" + file.name, script,
+                function(diagnostic) {
+                    print(JSON.stringify(parser.convert(diagnostic), null, 2).replace(/\\r/g, ''));
+                    print(",");
+                });
 
-           if (tree != null) {
-               print(JSON.stringify(tree, null, 2));
-               print(",");
-           }
-       }
-   }
+            if (tree != null) {
+                print(JSON.stringify(tree, null, 2));
+                print(",");
+            }
+        }
+    }
 }
 
 // parse files in parsertests directory
--- a/test/script/nosecurity/parserapi.js.EXPECTED	Tue Jan 12 15:38:07 2016 +0100
+++ b/test/script/nosecurity/parserapi.js.EXPECTED	Tue Jan 12 16:30:10 2016 +0100
@@ -1,4 +1,4 @@
-[
+[
 {
   "endPosition": "1113",
   "kind": "COMPILATION_UNIT",
@@ -132,8 +132,8 @@
   "sourceName": "parsertests/array_literal.js",
   "strict": "false",
   "startPosition": "1113"
-}
-,
+}
+,
 {
   "endPosition": "1126",
   "kind": "COMPILATION_UNIT",
@@ -406,8 +406,8 @@
   "sourceName": "parsertests/assignmentExpr.js",
   "strict": "false",
   "startPosition": "1126"
-}
-,
+}
+,
 {
   "endPosition": "1116",
   "kind": "COMPILATION_UNIT",
@@ -912,8 +912,8 @@
   "sourceName": "parsertests/binaryExpr.js",
   "strict": "false",
   "startPosition": "1116"
-}
-,
+}
+,
 {
   "endPosition": "1117",
   "kind": "COMPILATION_UNIT",
@@ -959,8 +959,8 @@
   "sourceName": "parsertests/block.js",
   "strict": "false",
   "startPosition": "1117"
-}
-,
+}
+,
 {
   "endPosition": "1117",
   "kind": "COMPILATION_UNIT",
@@ -1060,8 +1060,8 @@
   "sourceName": "parsertests/breakStat.js",
   "strict": "false",
   "startPosition": "1117"
-}
-,
+}
+,
 {
   "endPosition": "1117",
   "kind": "COMPILATION_UNIT",
@@ -1098,8 +1098,8 @@
   "sourceName": "parsertests/condExpr.js",
   "strict": "false",
   "startPosition": "1117"
-}
-,
+}
+,
 {
   "endPosition": "1120",
   "kind": "COMPILATION_UNIT",
@@ -1199,8 +1199,8 @@
   "sourceName": "parsertests/continueStat.js",
   "strict": "false",
   "startPosition": "1120"
-}
-,
+}
+,
 {
   "endPosition": "1118",
   "kind": "COMPILATION_UNIT",
@@ -1214,8 +1214,8 @@
   "sourceName": "parsertests/debuggerStat.js",
   "strict": "false",
   "startPosition": "1118"
-}
-,
+}
+,
 {
   "endPosition": "1137",
   "kind": "COMPILATION_UNIT",
@@ -1500,8 +1500,8 @@
   "sourceName": "parsertests/functions.js",
   "strict": "false",
   "startPosition": "1137"
-}
-,
+}
+,
 {
   "endPosition": "1114",
   "kind": "COMPILATION_UNIT",
@@ -1604,8 +1604,8 @@
   "sourceName": "parsertests/ifStat.js",
   "strict": "false",
   "startPosition": "1114"
-}
-,
+}
+,
 {
   "endPosition": "1113",
   "kind": "COMPILATION_UNIT",
@@ -1668,8 +1668,8 @@
   "sourceName": "parsertests/labelledStat.js",
   "strict": "false",
   "startPosition": "1113"
-}
-,
+}
+,
 {
   "endPosition": "1125",
   "kind": "COMPILATION_UNIT",
@@ -2066,8 +2066,8 @@
   "sourceName": "parsertests/lhsExpr.js",
   "strict": "false",
   "startPosition": "1125"
-}
-,
+}
+,
 {
   "endPosition": "1110",
   "kind": "COMPILATION_UNIT",
@@ -2350,8 +2350,8 @@
   "sourceName": "parsertests/loopStat.js",
   "strict": "false",
   "startPosition": "1110"
-}
-,
+}
+,
 {
   "endPosition": "1125",
   "kind": "COMPILATION_UNIT",
@@ -2705,8 +2705,8 @@
   "sourceName": "parsertests/objectLitExpr.js",
   "strict": "false",
   "startPosition": "1125"
-}
-,
+}
+,
 {
   "endPosition": "1118",
   "kind": "COMPILATION_UNIT",
@@ -2781,8 +2781,8 @@
   "sourceName": "parsertests/parenExpr.js",
   "strict": "false",
   "startPosition": "1118"
-}
-,
+}
+,
 {
   "endPosition": "1119",
   "kind": "COMPILATION_UNIT",
@@ -2995,8 +2995,8 @@
   "sourceName": "parsertests/primaryExpr.js",
   "strict": "false",
   "startPosition": "1119"
-}
-,
+}
+,
 {
   "endPosition": "1114",
   "kind": "COMPILATION_UNIT",
@@ -3044,8 +3044,8 @@
   "sourceName": "parsertests/regexp_literal.js",
   "strict": "false",
   "startPosition": "1114"
-}
-,
+}
+,
 {
   "endPosition": "1118",
   "kind": "COMPILATION_UNIT",
@@ -3144,8 +3144,8 @@
   "sourceName": "parsertests/returnStat.js",
   "strict": "false",
   "startPosition": "1118"
-}
-,
+}
+,
 {
   "endPosition": "1111",
   "kind": "COMPILATION_UNIT",
@@ -3309,8 +3309,8 @@
   "sourceName": "parsertests/switchStat.js",
   "strict": "false",
   "startPosition": "1111"
-}
-,
+}
+,
 {
   "endPosition": "1110",
   "kind": "COMPILATION_UNIT",
@@ -3421,8 +3421,8 @@
   "sourceName": "parsertests/throwStat.js",
   "strict": "false",
   "startPosition": "1110"
-}
-,
+}
+,
 {
   "endPosition": "1121",
   "kind": "COMPILATION_UNIT",
@@ -3783,8 +3783,8 @@
   "sourceName": "parsertests/tryCatchStat.js",
   "strict": "false",
   "startPosition": "1121"
-}
-,
+}
+,
 {
   "endPosition": "1115",
   "kind": "COMPILATION_UNIT",
@@ -3969,8 +3969,8 @@
   "sourceName": "parsertests/unaryExpr.js",
   "strict": "false",
   "startPosition": "1115"
-}
-,
+}
+,
 {
   "endPosition": "1122",
   "kind": "COMPILATION_UNIT",
@@ -4016,8 +4016,8 @@
   "sourceName": "parsertests/useStrict.js",
   "strict": "true",
   "startPosition": "1122"
-}
-,
+}
+,
 {
   "endPosition": "1143",
   "kind": "COMPILATION_UNIT",
@@ -4092,8 +4092,8 @@
   "sourceName": "parsertests/varDecl.js",
   "strict": "false",
   "startPosition": "1143"
-}
-,
+}
+,
 {
   "endPosition": "1111",
   "kind": "COMPILATION_UNIT",
@@ -4142,8 +4142,8 @@
   "sourceName": "parsertests/withStat.js",
   "strict": "false",
   "startPosition": "1111"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/caseoutofswitch.js",
   "code": "case (1090, 4)",
@@ -4152,8 +4152,8 @@
   "position": "1090",
   "message": "parsernegativetests/caseoutofswitch.js:29:0 Expected an operand but found case\ncase 23:\n^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/caseoutofswitch.js",
   "code": "default (1112, 7)",
@@ -4162,8 +4162,8 @@
   "position": "1112",
   "message": "parsernegativetests/caseoutofswitch.js:31:0 Expected an operand but found default\ndefault:\n^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4240,8 +4240,8 @@
   "sourceName": "parsernegativetests/caseoutofswitch.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegalbreak.js",
   "code": "break (1090, 5)",
@@ -4250,8 +4250,8 @@
   "position": "1090",
   "message": "parsernegativetests/illegalbreak.js:29:0 Illegal break statement\nbreak;\n^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegalbreak.js",
   "code": "ident (1103, 3)",
@@ -4260,8 +4260,8 @@
   "position": "1103",
   "message": "parsernegativetests/illegalbreak.js:30:6 Undefined Label \"foo\"\nbreak foo;\n      ^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4290,8 +4290,8 @@
   "sourceName": "parsernegativetests/illegalbreak.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegalcontinue.js",
   "code": "continue (1090, 8)",
@@ -4300,8 +4300,8 @@
   "position": "1090",
   "message": "parsernegativetests/illegalcontinue.js:29:0 Illegal continue statement\ncontinue;\n^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegalcontinue.js",
   "code": "ident (1109, 3)",
@@ -4310,8 +4310,8 @@
   "position": "1109",
   "message": "parsernegativetests/illegalcontinue.js:30:9 Undefined Label \"foo\"\ncontinue foo;\n         ^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4340,8 +4340,8 @@
   "sourceName": "parsernegativetests/illegalcontinue.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegallvalue.js",
   "code": "decimal (1090, 2)",
@@ -4350,8 +4350,8 @@
   "position": "1090",
   "message": "parsernegativetests/illegallvalue.js:29:0 Invalid left hand side for assignment\n44 = 54;\n^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegallvalue.js",
   "code": "decimal (1099, 3)",
@@ -4360,8 +4360,8 @@
   "position": "1099",
   "message": "parsernegativetests/illegallvalue.js:30:0 Invalid left hand side for assignment\n233 += 33;\n^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegallvalue.js",
   "code": "decimal (1110, 4)",
@@ -4370,8 +4370,8 @@
   "position": "1110",
   "message": "parsernegativetests/illegallvalue.js:31:0 Invalid left hand side for assignment\n3423 -= 234;\n^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4410,8 +4410,8 @@
   "sourceName": "parsernegativetests/illegallvalue.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegaloperator.js",
   "code": "* (1093, 1)",
@@ -4420,8 +4420,8 @@
   "position": "1093",
   "message": "parsernegativetests/illegaloperator.js:29:3 Expected an operand but found *\nx ** y\n   ^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4440,8 +4440,8 @@
   "sourceName": "parsernegativetests/illegaloperator.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/keywordident.js",
   "code": "var (1094, 3)",
@@ -4450,8 +4450,8 @@
   "position": "1094",
   "message": "parsernegativetests/keywordident.js:29:4 Expected ident but found var\nvar var = 23;\n    ^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4482,8 +4482,8 @@
   "sourceName": "parsernegativetests/keywordident.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/parenmissing.js",
   "code": "; (1096, 1)",
@@ -4492,8 +4492,8 @@
   "position": "1096",
   "message": "parsernegativetests/parenmissing.js:29:6 Expected ) but found ;\n(1 + 2;\n      ^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/parenmissing.js",
   "code": ") (1103, 1)",
@@ -4502,8 +4502,8 @@
   "position": "1103",
   "message": "parsernegativetests/parenmissing.js:30:5 Expected ; but found )\nx * y);\n     ^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4554,8 +4554,8 @@
   "sourceName": "parsernegativetests/parenmissing.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/repeatedproperty.js",
   "code": "ident (1111, 3)",
@@ -4564,8 +4564,8 @@
   "position": "1111",
   "message": "parsernegativetests/repeatedproperty.js:29:21 Property \"foo\" already defined\nvar obj = { foo: 34, get foo() { return 'hello' } };\n                     ^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/repeatedproperty.js",
   "code": "ident (1165, 3)",
@@ -4574,8 +4574,8 @@
   "position": "1165",
   "message": "parsernegativetests/repeatedproperty.js:30:22 Property \"foo\" already defined\nvar obj1 = { foo: 34, set foo(x) { } };\n                      ^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/repeatedproperty.js",
   "code": "ident (1205, 3)",
@@ -4584,8 +4584,8 @@
   "position": "1205",
   "message": "parsernegativetests/repeatedproperty.js:31:22 Property \"foo\" already defined\nvar obj2 = { foo: 34, set foo(x) { } };\n                      ^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/repeatedproperty.js",
   "code": "ident (1251, 3)",
@@ -4594,8 +4594,8 @@
   "position": "1251",
   "message": "parsernegativetests/repeatedproperty.js:32:28 Property \"bar\" already defined\nvar obj3 = { get bar() { }, get bar() {} };\n                            ^",
   "lineNumber": "32"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/repeatedproperty.js",
   "code": "ident (1296, 3)",
@@ -4604,8 +4604,8 @@
   "position": "1296",
   "message": "parsernegativetests/repeatedproperty.js:33:29 Property \"bar\" already defined\nvar obj4 = { set bar(x) { }, set bar(x) {} };\n                             ^",
   "lineNumber": "33"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4664,8 +4664,8 @@
   "sourceName": "parsernegativetests/repeatedproperty.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/strict_repeatedproperty.js",
   "code": "ident (1126, 3)",
@@ -4674,8 +4674,8 @@
   "position": "1126",
   "message": "parsernegativetests/strict_repeatedproperty.js:31:21 Property \"foo\" already defined\nvar obj = { foo: 34, foo: 'hello' };\n                     ^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4705,8 +4705,8 @@
   "sourceName": "parsernegativetests/strict_repeatedproperty.js",
   "strict": "true",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/strict_repeatparam.js",
   "code": "ident (1119, 1)",
@@ -4715,8 +4715,8 @@
   "position": "1119",
   "message": "parsernegativetests/strict_repeatparam.js:31:14 strict mode function cannot have duplicate parameter name \"x\"\nfunction func(x, x) {}\n              ^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4746,8 +4746,8 @@
   "sourceName": "parsernegativetests/strict_repeatparam.js",
   "strict": "true",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/strict_with.js",
   "code": "with (1105, 4)",
@@ -4756,8 +4756,8 @@
   "position": "1105",
   "message": "parsernegativetests/strict_with.js:31:0 \"with\" statement cannot be used in strict mode\nwith({}) {}\n^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/strict_with.js",
   "code": ") (1112, 1)",
@@ -4766,8 +4766,8 @@
   "position": "1112",
   "message": "parsernegativetests/strict_with.js:31:7 Expected ; but found )\nwith({}) {}\n       ^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4807,8 +4807,8 @@
   "sourceName": "parsernegativetests/strict_with.js",
   "strict": "true",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/toplevelreturn.js",
   "code": "return (1090, 6)",
@@ -4817,8 +4817,8 @@
   "position": "1090",
   "message": "parsernegativetests/toplevelreturn.js:29:0 Invalid return statement\nreturn;\n^",
   "lineNumber": "29"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/toplevelreturn.js",
   "code": "return (1098, 6)",
@@ -4827,8 +4827,8 @@
   "position": "1098",
   "message": "parsernegativetests/toplevelreturn.js:30:0 Invalid return statement\nreturn 23;\n^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4857,59 +4857,59 @@
   "sourceName": "parsernegativetests/toplevelreturn.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "endPosition": "1136",
   "kind": "COMPILATION_UNIT",
   "sourceElements": [
     {
-      "endPosition": "1240",
+      "endPosition": "1242",
       "kind": "FUNCTION",
       "name": "Parser",
       "body": {
-        "endPosition": "1218",
+        "endPosition": "1220",
         "kind": "BLOCK",
         "statements": [
           {
             "expression": {
               "expression": {
-                "endPosition": "1217",
+                "endPosition": "1219",
                 "kind": "FUNCTION_INVOCATION",
                 "functionSelect": {
                   "identifier": "create",
                   "expression": {
-                    "endPosition": "1208",
+                    "endPosition": "1210",
                     "kind": "IDENTIFIER",
                     "name": "Parser",
-                    "startPosition": "1202"
+                    "startPosition": "1204"
                   },
-                  "endPosition": "1215",
+                  "endPosition": "1217",
                   "kind": "MEMBER_SELECT",
-                  "startPosition": "1202"
+                  "startPosition": "1204"
                 },
                 "arguments": [],
-                "startPosition": "1202"
+                "startPosition": "1204"
               },
-              "endPosition": "1217",
+              "endPosition": "1219",
               "kind": "ASSIGNMENT",
               "variable": {
                 "identifier": "_parser",
                 "expression": {
-                  "endPosition": "1191",
+                  "endPosition": "1193",
                   "kind": "IDENTIFIER",
                   "name": "this",
-                  "startPosition": "1187"
+                  "startPosition": "1189"
                 },
-                "endPosition": "1199",
+                "endPosition": "1201",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "1187"
+                "startPosition": "1189"
               },
-              "startPosition": "1187"
+              "startPosition": "1189"
             },
-            "endPosition": "1217",
+            "endPosition": "1219",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "1187"
+            "startPosition": "1189"
           }
         ],
         "startPosition": "1154"
@@ -4921,1368 +4921,1489 @@
     {
       "expression": {
         "expression": {
-          "endPosition": "1305",
+          "endPosition": "1307",
           "kind": "FUNCTION_INVOCATION",
           "functionSelect": {
             "identifier": "type",
             "expression": {
-              "endPosition": "1265",
+              "endPosition": "1267",
               "kind": "IDENTIFIER",
               "name": "Java",
-              "startPosition": "1261"
+              "startPosition": "1263"
             },
-            "endPosition": "1270",
+            "endPosition": "1272",
             "kind": "MEMBER_SELECT",
-            "startPosition": "1261"
+            "startPosition": "1263"
           },
           "arguments": [
             {
-              "endPosition": "1303",
+              "endPosition": "1305",
               "kind": "STRING_LITERAL",
               "value": "jdk.nashorn.api.tree.Diagnostic",
-              "startPosition": "1272"
+              "startPosition": "1274"
             }
           ],
-          "startPosition": "1261"
-        },
-        "endPosition": "1305",
+          "startPosition": "1263"
+        },
+        "endPosition": "1307",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "Diagnostic",
           "expression": {
-            "endPosition": "1247",
+            "endPosition": "1249",
             "kind": "IDENTIFIER",
             "name": "Parser",
-            "startPosition": "1241"
+            "startPosition": "1243"
           },
-          "endPosition": "1258",
+          "endPosition": "1260",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1241"
-        },
-        "startPosition": "1241"
-      },
-      "endPosition": "1305",
+          "startPosition": "1243"
+        },
+        "startPosition": "1243"
+      },
+      "endPosition": "1307",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1241"
+      "startPosition": "1243"
     },
     {
       "expression": {
         "expression": {
-          "endPosition": "1390",
+          "endPosition": "1392",
           "kind": "FUNCTION_INVOCATION",
           "functionSelect": {
             "identifier": "type",
             "expression": {
-              "endPosition": "1338",
+              "endPosition": "1340",
               "kind": "IDENTIFIER",
               "name": "Java",
-              "startPosition": "1334"
+              "startPosition": "1336"
             },
-            "endPosition": "1343",
+            "endPosition": "1345",
             "kind": "MEMBER_SELECT",
-            "startPosition": "1334"
+            "startPosition": "1336"
           },
           "arguments": [
             {
-              "endPosition": "1388",
+              "endPosition": "1390",
               "kind": "STRING_LITERAL",
               "value": "jdk.nashorn.api.tree.SimpleTreeVisitorES5_1",
-              "startPosition": "1345"
+              "startPosition": "1347"
             }
           ],
-          "startPosition": "1334"
-        },
-        "endPosition": "1390",
+          "startPosition": "1336"
+        },
+        "endPosition": "1392",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "SimpleTreeVisitor",
           "expression": {
-            "endPosition": "1313",
+            "endPosition": "1315",
             "kind": "IDENTIFIER",
             "name": "Parser",
-            "startPosition": "1307"
+            "startPosition": "1309"
           },
-          "endPosition": "1331",
+          "endPosition": "1333",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1307"
-        },
-        "startPosition": "1307"
-      },
-      "endPosition": "1390",
+          "startPosition": "1309"
+        },
+        "startPosition": "1309"
+      },
+      "endPosition": "1392",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1307"
+      "startPosition": "1309"
     },
     {
       "expression": {
         "expression": {
-          "endPosition": "1444",
+          "endPosition": "1446",
           "kind": "FUNCTION_INVOCATION",
           "functionSelect": {
             "identifier": "type",
             "expression": {
-              "endPosition": "1410",
+              "endPosition": "1412",
               "kind": "IDENTIFIER",
               "name": "Java",
-              "startPosition": "1406"
+              "startPosition": "1408"
             },
-            "endPosition": "1415",
+            "endPosition": "1417",
             "kind": "MEMBER_SELECT",
-            "startPosition": "1406"
+            "startPosition": "1408"
           },
           "arguments": [
             {
-              "endPosition": "1442",
+              "endPosition": "1444",
               "kind": "STRING_LITERAL",
               "value": "jdk.nashorn.api.tree.Tree",
-              "startPosition": "1417"
+              "startPosition": "1419"
             }
           ],
-          "startPosition": "1406"
-        },
-        "endPosition": "1444",
+          "startPosition": "1408"
+        },
+        "endPosition": "1446",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "Tree",
           "expression": {
-            "endPosition": "1398",
+            "endPosition": "1400",
             "kind": "IDENTIFIER",
             "name": "Parser",
-            "startPosition": "1392"
+            "startPosition": "1394"
           },
-          "endPosition": "1403",
+          "endPosition": "1405",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1392"
-        },
-        "startPosition": "1392"
-      },
-      "endPosition": "1444",
+          "startPosition": "1394"
+        },
+        "startPosition": "1394"
+      },
+      "endPosition": "1446",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1392"
+      "startPosition": "1394"
     },
     {
       "expression": {
         "expression": {
-          "endPosition": "1487",
+          "endPosition": "1489",
           "kind": "FUNCTION_INVOCATION",
           "functionSelect": {
             "identifier": "type",
             "expression": {
-              "endPosition": "1464",
+              "endPosition": "1466",
               "kind": "IDENTIFIER",
               "name": "Java",
-              "startPosition": "1460"
+              "startPosition": "1462"
             },
-            "endPosition": "1469",
+            "endPosition": "1471",
             "kind": "MEMBER_SELECT",
-            "startPosition": "1460"
+            "startPosition": "1462"
           },
           "arguments": [
             {
-              "endPosition": "1485",
+              "endPosition": "1487",
               "kind": "STRING_LITERAL",
               "value": "java.util.List",
-              "startPosition": "1471"
+              "startPosition": "1473"
             }
           ],
-          "startPosition": "1460"
-        },
-        "endPosition": "1487",
+          "startPosition": "1462"
+        },
+        "endPosition": "1489",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "List",
           "expression": {
-            "endPosition": "1452",
+            "endPosition": "1454",
             "kind": "IDENTIFIER",
             "name": "Parser",
-            "startPosition": "1446"
+            "startPosition": "1448"
           },
-          "endPosition": "1457",
+          "endPosition": "1459",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1446"
-        },
-        "startPosition": "1446"
-      },
-      "endPosition": "1487",
+          "startPosition": "1448"
+        },
+        "startPosition": "1448"
+      },
+      "endPosition": "1489",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1446"
+      "startPosition": "1448"
     },
     {
       "expression": {
         "expression": {
-          "endPosition": "1530",
+          "endPosition": "1532",
           "kind": "FUNCTION_INVOCATION",
           "functionSelect": {
             "identifier": "type",
             "expression": {
-              "endPosition": "1507",
+              "endPosition": "1509",
               "kind": "IDENTIFIER",
               "name": "Java",
-              "startPosition": "1503"
+              "startPosition": "1505"
             },
-            "endPosition": "1512",
+            "endPosition": "1514",
             "kind": "MEMBER_SELECT",
-            "startPosition": "1503"
+            "startPosition": "1505"
           },
           "arguments": [
             {
-              "endPosition": "1528",
+              "endPosition": "1530",
               "kind": "STRING_LITERAL",
               "value": "java.lang.Enum",
-              "startPosition": "1514"
+              "startPosition": "1516"
             }
           ],
-          "startPosition": "1503"
-        },
-        "endPosition": "1530",
+          "startPosition": "1505"
+        },
+        "endPosition": "1532",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "Enum",
           "expression": {
-            "endPosition": "1495",
+            "endPosition": "1497",
             "kind": "IDENTIFIER",
             "name": "Parser",
-            "startPosition": "1489"
+            "startPosition": "1491"
           },
-          "endPosition": "1500",
+          "endPosition": "1502",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1489"
-        },
-        "startPosition": "1489"
-      },
-      "endPosition": "1530",
+          "startPosition": "1491"
+        },
+        "startPosition": "1491"
+      },
+      "endPosition": "1532",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1489"
+      "startPosition": "1491"
     },
     {
       "expression": {
         "expression": {
-          "endPosition": "1657",
+          "endPosition": "1659",
           "kind": "FUNCTION_EXPRESSION",
           "body": {
-            "endPosition": "1803",
+            "endPosition": "1805",
             "kind": "BLOCK",
             "statements": [
               {
-                "endPosition": "1716",
+                "endPosition": "1718",
                 "kind": "VARIABLE",
                 "name": "tree",
-                "startPosition": "1667",
+                "startPosition": "1669",
                 "initializer": {
-                  "endPosition": "1716",
+                  "endPosition": "1718",
                   "kind": "FUNCTION_INVOCATION",
                   "functionSelect": {
                     "identifier": "parse",
                     "expression": {
                       "identifier": "_parser",
                       "expression": {
-                        "endPosition": "1678",
+                        "endPosition": "1680",
                         "kind": "IDENTIFIER",
                         "name": "this",
-                        "startPosition": "1674"
+                        "startPosition": "1676"
                       },
-                      "endPosition": "1686",
+                      "endPosition": "1688",
                       "kind": "MEMBER_SELECT",
-                      "startPosition": "1674"
+                      "startPosition": "1676"
                     },
-                    "endPosition": "1692",
+                    "endPosition": "1694",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "1674"
+                    "startPosition": "1676"
                   },
                   "arguments": [
                     {
-                      "endPosition": "1697",
+                      "endPosition": "1699",
                       "kind": "IDENTIFIER",
                       "name": "name",
-                      "startPosition": "1693"
+                      "startPosition": "1695"
                     },
                     {
-                      "endPosition": "1705",
+                      "endPosition": "1707",
                       "kind": "IDENTIFIER",
                       "name": "script",
-                      "startPosition": "1699"
+                      "startPosition": "1701"
                     },
                     {
-                      "endPosition": "1715",
+                      "endPosition": "1717",
                       "kind": "IDENTIFIER",
                       "name": "listener",
-                      "startPosition": "1707"
+                      "startPosition": "1709"
                     }
                   ],
-                  "startPosition": "1674"
+                  "startPosition": "1676"
                 }
               },
               {
                 "expression": {
-                  "endPosition": "1771",
+                  "endPosition": "1773",
                   "kind": "FUNCTION_INVOCATION",
                   "functionSelect": {
                     "identifier": "accept",
                     "expression": {
-                      "endPosition": "1726",
+                      "endPosition": "1728",
                       "kind": "IDENTIFIER",
                       "name": "tree",
-                      "startPosition": "1722"
+                      "startPosition": "1724"
                     },
-                    "endPosition": "1733",
+                    "endPosition": "1735",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "1722"
+                    "startPosition": "1724"
                   },
                   "arguments": [
                     {
                       "constructorExpression": {
-                        "endPosition": "1764",
+                        "endPosition": "1766",
                         "kind": "FUNCTION_INVOCATION",
                         "functionSelect": {
                           "identifier": "SimpleTreeVisitor",
                           "expression": {
-                            "endPosition": "1744",
+                            "endPosition": "1746",
                             "kind": "IDENTIFIER",
                             "name": "Parser",
-                            "startPosition": "1738"
+                            "startPosition": "1740"
                           },
-                          "endPosition": "1762",
+                          "endPosition": "1764",
                           "kind": "MEMBER_SELECT",
-                          "startPosition": "1738"
+                          "startPosition": "1740"
                         },
                         "arguments": [],
-                        "startPosition": "1744"
+                        "startPosition": "1746"
                       },
-                      "endPosition": "1764",
+                      "endPosition": "1766",
                       "kind": "NEW",
-                      "startPosition": "1734"
+                      "startPosition": "1736"
                     },
                     {
-                      "endPosition": "1770",
+                      "endPosition": "1772",
                       "kind": "NULL_LITERAL",
-                      "startPosition": "1766"
+                      "startPosition": "1768"
                     }
                   ],
-                  "startPosition": "1722"
+                  "startPosition": "1724"
                 },
-                "endPosition": "1771",
+                "endPosition": "1773",
                 "kind": "EXPRESSION_STATEMENT",
-                "startPosition": "1722"
+                "startPosition": "1724"
               },
               {
                 "expression": {
-                  "endPosition": "1802",
+                  "endPosition": "1804",
                   "kind": "FUNCTION_INVOCATION",
                   "functionSelect": {
                     "identifier": "convert",
                     "expression": {
-                      "endPosition": "1788",
+                      "endPosition": "1790",
                       "kind": "IDENTIFIER",
                       "name": "this",
-                      "startPosition": "1784"
+                      "startPosition": "1786"
                     },
-                    "endPosition": "1796",
+                    "endPosition": "1798",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "1784"
+                    "startPosition": "1786"
                   },
                   "arguments": [
                     {
-                      "endPosition": "1801",
+                      "endPosition": "1803",
                       "kind": "IDENTIFIER",
                       "name": "tree",
-                      "startPosition": "1797"
+                      "startPosition": "1799"
                     }
                   ],
-                  "startPosition": "1784"
+                  "startPosition": "1786"
                 },
-                "endPosition": "1803",
+                "endPosition": "1805",
                 "kind": "RETURN",
-                "startPosition": "1777"
+                "startPosition": "1779"
               }
             ],
-            "startPosition": "1657"
+            "startPosition": "1659"
           },
           "strict": "false",
-          "startPosition": "1657",
+          "startPosition": "1659",
           "parameters": [
             {
-              "endPosition": "1637",
+              "endPosition": "1639",
               "kind": "IDENTIFIER",
               "name": "name",
-              "startPosition": "1633"
+              "startPosition": "1635"
             },
             {
-              "endPosition": "1645",
+              "endPosition": "1647",
               "kind": "IDENTIFIER",
               "name": "script",
-              "startPosition": "1639"
+              "startPosition": "1641"
             },
             {
-              "endPosition": "1655",
+              "endPosition": "1657",
               "kind": "IDENTIFIER",
               "name": "listener",
-              "startPosition": "1647"
+              "startPosition": "1649"
             }
           ]
         },
-        "endPosition": "1657",
+        "endPosition": "1659",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "parse",
           "expression": {
             "identifier": "prototype",
             "expression": {
-              "endPosition": "1605",
+              "endPosition": "1607",
               "kind": "IDENTIFIER",
               "name": "Parser",
-              "startPosition": "1599"
+              "startPosition": "1601"
             },
-            "endPosition": "1615",
+            "endPosition": "1617",
             "kind": "MEMBER_SELECT",
-            "startPosition": "1599"
+            "startPosition": "1601"
           },
-          "endPosition": "1621",
+          "endPosition": "1623",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1599"
-        },
-        "startPosition": "1599"
-      },
-      "endPosition": "1805",
+          "startPosition": "1601"
+        },
+        "startPosition": "1601"
+      },
+      "endPosition": "1807",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1599"
+      "startPosition": "1601"
     },
     {
       "expression": {
         "expression": {
-          "endPosition": "1834",
+          "endPosition": "1836",
           "kind": "FUNCTION_EXPRESSION",
           "body": {
-            "endPosition": "1897",
+            "endPosition": "1899",
             "kind": "BLOCK",
             "statements": [
               {
                 "expression": {
-                  "endPosition": "1896",
+                  "endPosition": "1898",
                   "kind": "FUNCTION_INVOCATION",
                   "functionSelect": {
                     "identifier": "create",
                     "expression": {
-                      "endPosition": "1887",
+                      "endPosition": "1889",
                       "kind": "FUNCTION_INVOCATION",
                       "functionSelect": {
                         "identifier": "type",
                         "expression": {
-                          "endPosition": "1851",
+                          "endPosition": "1853",
                           "kind": "IDENTIFIER",
                           "name": "Java",
-                          "startPosition": "1847"
+                          "startPosition": "1849"
                         },
-                        "endPosition": "1856",
+                        "endPosition": "1858",
                         "kind": "MEMBER_SELECT",
-                        "startPosition": "1847"
+                        "startPosition": "1849"
                       },
                       "arguments": [
                         {
-                          "endPosition": "1885",
+                          "endPosition": "1887",
                           "kind": "STRING_LITERAL",
                           "value": "jdk.nashorn.api.tree.Parser",
-                          "startPosition": "1858"
+                          "startPosition": "1860"
                         }
                       ],
-                      "startPosition": "1847"
+                      "startPosition": "1849"
                     },
-                    "endPosition": "1894",
+                    "endPosition": "1896",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "1847"
+                    "startPosition": "1849"
                   },
                   "arguments": [],
-                  "startPosition": "1894"
+                  "startPosition": "1896"
                 },
-                "endPosition": "1897",
+                "endPosition": "1899",
                 "kind": "RETURN",
-                "startPosition": "1840"
+                "startPosition": "1842"
               }
             ],
-            "startPosition": "1834"
+            "startPosition": "1836"
           },
           "strict": "false",
-          "startPosition": "1834",
+          "startPosition": "1836",
           "parameters": []
         },
-        "endPosition": "1834",
+        "endPosition": "1836",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "create",
           "expression": {
-            "endPosition": "1813",
+            "endPosition": "1815",
             "kind": "IDENTIFIER",
             "name": "Parser",
-            "startPosition": "1807"
+            "startPosition": "1809"
           },
-          "endPosition": "1820",
+          "endPosition": "1822",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1807"
-        },
-        "startPosition": "1807"
-      },
-      "endPosition": "1971",
+          "startPosition": "1809"
+        },
+        "startPosition": "1809"
+      },
+      "endPosition": "1973",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1807"
+      "startPosition": "1809"
     },
     {
       "expression": {
         "expression": {
-          "endPosition": "2014",
+          "endPosition": "2016",
           "kind": "FUNCTION_EXPRESSION",
           "body": {
-            "endPosition": "2863",
+            "endPosition": "2994",
             "kind": "BLOCK",
             "statements": [
               {
                 "condition": {
                   "leftOperand": {
-                    "expression": {
-                      "endPosition": "2029",
-                      "kind": "IDENTIFIER",
-                      "name": "tree",
-                      "startPosition": "2025"
+                    "leftOperand": {
+                      "expression": {
+                        "endPosition": "2031",
+                        "kind": "IDENTIFIER",
+                        "name": "tree",
+                        "startPosition": "2027"
+                      },
+                      "endPosition": "2031",
+                      "kind": "LOGICAL_COMPLEMENT",
+                      "startPosition": "2026"
                     },
-                    "endPosition": "2029",
-                    "kind": "LOGICAL_COMPLEMENT",
-                    "startPosition": "2024"
+                    "endPosition": "2057",
+                    "kind": "CONDITIONAL_OR",
+                    "rightOperand": {
+                      "leftOperand": {
+                        "expression": {
+                          "endPosition": "2046",
+                          "kind": "IDENTIFIER",
+                          "name": "tree",
+                          "startPosition": "2042"
+                        },
+                        "endPosition": "2046",
+                        "kind": "TYPEOF",
+                        "startPosition": "2035"
+                      },
+                      "endPosition": "2057",
+                      "kind": "NOT_EQUAL_TO",
+                      "rightOperand": {
+                        "endPosition": "2057",
+                        "kind": "STRING_LITERAL",
+                        "value": "object",
+                        "startPosition": "2051"
+                      },
+                      "startPosition": "2035"
+                    },
+                    "startPosition": "2026"
                   },
-                  "endPosition": "2055",
+                  "endPosition": "2092",
                   "kind": "CONDITIONAL_OR",
                   "rightOperand": {
                     "leftOperand": {
-                      "expression": {
-                        "endPosition": "2044",
-                        "kind": "IDENTIFIER",
-                        "name": "tree",
-                        "startPosition": "2040"
-                      },
-                      "endPosition": "2044",
-                      "kind": "TYPEOF",
-                      "startPosition": "2033"
+                      "endPosition": "2066",
+                      "kind": "IDENTIFIER",
+                      "name": "tree",
+                      "startPosition": "2062"
                     },
-                    "endPosition": "2055",
-                    "kind": "NOT_EQUAL_TO",
+                    "expression": {
+                      "endPosition": "2066",
+                      "kind": "IDENTIFIER",
+                      "name": "tree",
+                      "startPosition": "2062"
+                    },
+                    "endPosition": "2092",
+                    "kind": "INSTANCE_OF",
                     "rightOperand": {
-                      "endPosition": "2055",
-                      "kind": "STRING_LITERAL",
-                      "value": "object",
-                      "startPosition": "2049"
+                      "identifier": "Long",
+                      "expression": {
+                        "identifier": "lang",
+                        "expression": {
+                          "endPosition": "2082",
+                          "kind": "IDENTIFIER",
+                          "name": "java",
+                          "startPosition": "2078"
+                        },
+                        "endPosition": "2087",
+                        "kind": "MEMBER_SELECT",
+                        "startPosition": "2078"
+                      },
+                      "endPosition": "2092",
+                      "kind": "MEMBER_SELECT",
+                      "startPosition": "2078"
                     },
-                    "startPosition": "2033"
+                    "type": {
+                      "identifier": "Long",
+                      "expression": {
+                        "identifier": "lang",
+                        "expression": {
+                          "endPosition": "2082",
+                          "kind": "IDENTIFIER",
+                          "name": "java",
+                          "startPosition": "2078"
+                        },
+                        "endPosition": "2087",
+                        "kind": "MEMBER_SELECT",
+                        "startPosition": "2078"
+                      },
+                      "endPosition": "2092",
+                      "kind": "MEMBER_SELECT",
+                      "startPosition": "2078"
+                    },
+                    "startPosition": "2062"
                   },
-                  "startPosition": "2024"
+                  "startPosition": "2026"
                 },
-                "endPosition": "2086",
+                "endPosition": "2122",
                 "kind": "IF",
-                "startPosition": "2020",
+                "startPosition": "2022",
                 "thenStatement": {
-                  "endPosition": "2086",
+                  "endPosition": "2122",
                   "kind": "BLOCK",
                   "statements": [
                     {
                       "expression": {
-                        "endPosition": "2079",
+                        "endPosition": "2115",
                         "kind": "IDENTIFIER",
                         "name": "tree",
-                        "startPosition": "2075"
+                        "startPosition": "2111"
                       },
-                      "endPosition": "2080",
+                      "endPosition": "2116",
                       "kind": "RETURN",
-                      "startPosition": "2068"
+                      "startPosition": "2104"
                     }
                   ],
-                  "startPosition": "2058"
+                  "startPosition": "2094"
                 }
               },
               {
-                "endPosition": "2133",
+                "endPosition": "2169",
                 "kind": "VARIABLE",
                 "name": "obj",
-                "startPosition": "2096",
+                "startPosition": "2132",
                 "initializer": {
-                  "endPosition": "2133",
+                  "endPosition": "2169",
                   "kind": "FUNCTION_INVOCATION",
                   "functionSelect": {
                     "identifier": "bindProperties",
                     "expression": {
-                      "endPosition": "2108",
+                      "endPosition": "2144",
                       "kind": "IDENTIFIER",
                       "name": "Object",
-                      "startPosition": "2102"
+                      "startPosition": "2138"
                     },
-                    "endPosition": "2123",
+                    "endPosition": "2159",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "2102"
+                    "startPosition": "2138"
                   },
                   "arguments": [
                     {
-                      "endPosition": "2126",
+                      "endPosition": "2162",
                       "kind": "OBJECT_LITERAL",
-                      "startPosition": "2124",
+                      "startPosition": "2160",
                       "properties": []
                     },
                     {
-                      "endPosition": "2132",
+                      "endPosition": "2168",
                       "kind": "IDENTIFIER",
                       "name": "tree",
-                      "startPosition": "2128"
+                      "startPosition": "2164"
                     }
                   ],
-                  "startPosition": "2102"
+                  "startPosition": "2138"
                 }
               },
               {
-                "endPosition": "2154",
+                "endPosition": "2190",
                 "kind": "VARIABLE",
                 "name": "result",
-                "startPosition": "2143",
+                "startPosition": "2179",
                 "initializer": {
-                  "endPosition": "2154",
+                  "endPosition": "2190",
                   "kind": "OBJECT_LITERAL",
-                  "startPosition": "2152",
+                  "startPosition": "2188",
                   "properties": []
                 }
               },
               {
-                "endPosition": "2170",
+                "endPosition": "2206",
                 "kind": "VARIABLE",
                 "name": "i",
-                "startPosition": "2169"
+                "startPosition": "2205"
               },
               {
                 "expression": {
-                  "endPosition": "2177",
+                  "endPosition": "2213",
                   "kind": "IDENTIFIER",
                   "name": "obj",
-                  "startPosition": "2174"
+                  "startPosition": "2210"
                 },
-                "endPosition": "2845",
+                "endPosition": "2975",
                 "kind": "FOR_IN_LOOP",
                 "forEach": "false",
                 "variable": {
-                  "endPosition": "2170",
+                  "endPosition": "2206",
                   "kind": "IDENTIFIER",
                   "name": "i",
-                  "startPosition": "2169"
+                  "startPosition": "2205"
                 },
                 "statement": {
-                  "endPosition": "2845",
+                  "endPosition": "2975",
                   "kind": "BLOCK",
                   "statements": [
                     {
-                      "endPosition": "2204",
+                      "endPosition": "2241",
                       "kind": "VARIABLE",
                       "name": "val",
-                      "startPosition": "2192",
+                      "startPosition": "2229",
                       "initializer": {
                         "expression": {
-                          "endPosition": "2201",
+                          "endPosition": "2238",
                           "kind": "IDENTIFIER",
                           "name": "obj",
-                          "startPosition": "2198"
+                          "startPosition": "2235"
                         },
-                        "endPosition": "2204",
+                        "endPosition": "2241",
                         "kind": "ARRAY_ACCESS",
                         "index": {
-                          "endPosition": "2203",
+                          "endPosition": "2240",
                           "kind": "IDENTIFIER",
                           "name": "i",
-                          "startPosition": "2202"
+                          "startPosition": "2239"
                         },
-                        "startPosition": "2198"
+                        "startPosition": "2235"
                       }
                     },
                     {
                       "condition": {
                         "leftOperand": {
-                          "endPosition": "2220",
+                          "endPosition": "2258",
                           "kind": "IDENTIFIER",
                           "name": "val",
-                          "startPosition": "2217"
+                          "startPosition": "2255"
                         },
                         "expression": {
-                          "endPosition": "2220",
+                          "endPosition": "2258",
                           "kind": "IDENTIFIER",
                           "name": "val",
-                          "startPosition": "2217"
+                          "startPosition": "2255"
                         },
-                        "endPosition": "2243",
+                        "endPosition": "2281",
                         "kind": "INSTANCE_OF",
                         "rightOperand": {
                           "identifier": "Tree",
                           "expression": {
-                            "endPosition": "2238",
+                            "endPosition": "2276",
                             "kind": "IDENTIFIER",
                             "name": "Parser",
-                            "startPosition": "2232"
+                            "startPosition": "2270"
                           },
-                          "endPosition": "2243",
+                          "endPosition": "2281",
                           "kind": "MEMBER_SELECT",
-                          "startPosition": "2232"
+                          "startPosition": "2270"
                         },
                         "type": {
                           "identifier": "Tree",
                           "expression": {
-                            "endPosition": "2238",
+                            "endPosition": "2276",
                             "kind": "IDENTIFIER",
                             "name": "Parser",
-                            "startPosition": "2232"
+                            "startPosition": "2270"
                           },
-                          "endPosition": "2243",
+                          "endPosition": "2281",
                           "kind": "MEMBER_SELECT",
-                          "startPosition": "2232"
+                          "startPosition": "2270"
                         },
-                        "startPosition": "2217"
+                        "startPosition": "2255"
                       },
                       "elseStatement": {
                         "condition": {
                           "leftOperand": {
-                            "endPosition": "2309",
+                            "endPosition": "2350",
                             "kind": "IDENTIFIER",
                             "name": "val",
-                            "startPosition": "2306"
+                            "startPosition": "2347"
                           },
                           "expression": {
-                            "endPosition": "2309",
+                            "endPosition": "2350",
                             "kind": "IDENTIFIER",
                             "name": "val",
-                            "startPosition": "2306"
+                            "startPosition": "2347"
                           },
-                          "endPosition": "2332",
+                          "endPosition": "2373",
                           "kind": "INSTANCE_OF",
                           "rightOperand": {
                             "identifier": "List",
                             "expression": {
-                              "endPosition": "2327",
+                              "endPosition": "2368",
                               "kind": "IDENTIFIER",
                               "name": "Parser",
-                              "startPosition": "2321"
+                              "startPosition": "2362"
                             },
-                            "endPosition": "2332",
+                            "endPosition": "2373",
                             "kind": "MEMBER_SELECT",
-                            "startPosition": "2321"
+                            "startPosition": "2362"
                           },
                           "type": {
                             "identifier": "List",
                             "expression": {
-                              "endPosition": "2327",
+                              "endPosition": "2368",
                               "kind": "IDENTIFIER",
                               "name": "Parser",
-                              "startPosition": "2321"
+                              "startPosition": "2362"
                             },
-                            "endPosition": "2332",
+                            "endPosition": "2373",
                             "kind": "MEMBER_SELECT",
-                            "startPosition": "2321"
+                            "startPosition": "2362"
                           },
-                          "startPosition": "2306"
+                          "startPosition": "2347"
                         },
                         "elseStatement": {
-                          "endPosition": "2840",
+                          "endPosition": "2969",
                           "kind": "BLOCK",
                           "statements": [
                             {
                               "cases": [
                                 {
                                   "expression": {
-                                    "endPosition": "2574",
+                                    "endPosition": "2625",
                                     "kind": "STRING_LITERAL",
                                     "value": "number",
-                                    "startPosition": "2568"
+                                    "startPosition": "2619"
                                   },
-                                  "endPosition": "2576",
+                                  "endPosition": "2627",
                                   "kind": "CASE",
                                   "statements": [],
-                                  "startPosition": "2562"
+                                  "startPosition": "2613"
                                 },
                                 {
                                   "expression": {
-                                    "endPosition": "2603",
+                                    "endPosition": "2656",
                                     "kind": "STRING_LITERAL",
                                     "value": "string",
-                                    "startPosition": "2597"
+                                    "startPosition": "2650"
                                   },
-                                  "endPosition": "2605",
+                                  "endPosition": "2658",
                                   "kind": "CASE",
                                   "statements": [],
-                                  "startPosition": "2591"
+                                  "startPosition": "2644"
                                 },
                                 {
                                   "expression": {
-                                    "endPosition": "2633",
+                                    "endPosition": "2688",
                                     "kind": "STRING_LITERAL",
                                     "value": "boolean",
-                                    "startPosition": "2626"
+                                    "startPosition": "2681"
                                   },
-                                  "endPosition": "2678",
+                                  "endPosition": "2762",
                                   "kind": "CASE",
                                   "statements": [
                                     {
                                       "expression": {
                                         "expression": {
-                                          "endPosition": "2677",
+                                          "endPosition": "2734",
                                           "kind": "FUNCTION_INVOCATION",
                                           "functionSelect": {
-                                            "endPosition": "2672",
+                                            "endPosition": "2729",
                                             "kind": "IDENTIFIER",
                                             "name": "String",
-                                            "startPosition": "2666"
+                                            "startPosition": "2723"
                                           },
                                           "arguments": [
                                             {
-                                              "endPosition": "2676",
+                                              "endPosition": "2733",
                                               "kind": "IDENTIFIER",
                                               "name": "val",
-                                              "startPosition": "2673"
+                                              "startPosition": "2730"
                                             }
                                           ],
-                                          "startPosition": "2666"
+                                          "startPosition": "2723"
                                         },
-                                        "endPosition": "2677",
+                                        "endPosition": "2734",
                                         "kind": "ASSIGNMENT",
                                         "variable": {
                                           "expression": {
-                                            "endPosition": "2660",
+                                            "endPosition": "2717",
                                             "kind": "IDENTIFIER",
                                             "name": "result",
-                                            "startPosition": "2654"
+                                            "startPosition": "2711"
                                           },
-                                          "endPosition": "2663",
+                                          "endPosition": "2720",
                                           "kind": "ARRAY_ACCESS",
                                           "index": {
-                                            "endPosition": "2662",
+                                            "endPosition": "2719",
                                             "kind": "IDENTIFIER",
                                             "name": "i",
-                                            "startPosition": "2661"
+                                            "startPosition": "2718"
                                           },
-                                          "startPosition": "2654"
+                                          "startPosition": "2711"
                                         },
-                                        "startPosition": "2654"
+                                        "startPosition": "2711"
                                       },
-                                      "endPosition": "2677",
+                                      "endPosition": "2734",
                                       "kind": "EXPRESSION_STATEMENT",
-                                      "startPosition": "2654"
+                                      "startPosition": "2711"
+                                    },
+                                    {
+                                      "endPosition": "2762",
+                                      "kind": "BREAK",
+                                      "startPosition": "2756"
                                     }
                                   ],
-                                  "startPosition": "2620"
+                                  "startPosition": "2675"
                                 },
                                 {
-                                  "endPosition": "2820",
+                                  "endPosition": "2945",
                                   "kind": "CASE",
                                   "statements": [
                                     {
                                       "condition": {
                                         "leftOperand": {
-                                          "endPosition": "2727",
-                                          "kind": "IDENTIFIER",
-                                          "name": "val",
-                                          "startPosition": "2724"
-                                        },
-                                        "expression": {
-                                          "endPosition": "2727",
-                                          "kind": "IDENTIFIER",
-                                          "name": "val",
-                                          "startPosition": "2724"
-                                        },
-                                        "endPosition": "2750",
-                                        "kind": "INSTANCE_OF",
-                                        "rightOperand": {
-                                          "identifier": "Enum",
+                                          "leftOperand": {
+                                            "endPosition": "2815",
+                                            "kind": "IDENTIFIER",
+                                            "name": "val",
+                                            "startPosition": "2812"
+                                          },
                                           "expression": {
-                                            "endPosition": "2745",
+                                            "endPosition": "2815",
                                             "kind": "IDENTIFIER",
-                                            "name": "Parser",
-                                            "startPosition": "2739"
+                                            "name": "val",
+                                            "startPosition": "2812"
+                                          },
+                                          "endPosition": "2841",
+                                          "kind": "INSTANCE_OF",
+                                          "rightOperand": {
+                                            "identifier": "Long",
+                                            "expression": {
+                                              "identifier": "lang",
+                                              "expression": {
+                                                "endPosition": "2831",
+                                                "kind": "IDENTIFIER",
+                                                "name": "java",
+                                                "startPosition": "2827"
+                                              },
+                                              "endPosition": "2836",
+                                              "kind": "MEMBER_SELECT",
+                                              "startPosition": "2827"
+                                            },
+                                            "endPosition": "2841",
+                                            "kind": "MEMBER_SELECT",
+                                            "startPosition": "2827"
+                                          },
+                                          "type": {
+                                            "identifier": "Long",
+                                            "expression": {
+                                              "identifier": "lang",
+                                              "expression": {
+                                                "endPosition": "2831",
+                                                "kind": "IDENTIFIER",
+                                                "name": "java",
+                                                "startPosition": "2827"
+                                              },
+                                              "endPosition": "2836",
+                                              "kind": "MEMBER_SELECT",
+                                              "startPosition": "2827"
+                                            },
+                                            "endPosition": "2841",
+                                            "kind": "MEMBER_SELECT",
+                                            "startPosition": "2827"
                                           },
-                                          "endPosition": "2750",
-                                          "kind": "MEMBER_SELECT",
-                                          "startPosition": "2739"
+                                          "startPosition": "2812"
                                         },
-                                        "type": {
-                                          "identifier": "Enum",
+                                        "endPosition": "2871",
+                                        "kind": "CONDITIONAL_OR",
+                                        "rightOperand": {
+                                          "leftOperand": {
+                                            "endPosition": "2848",
+                                            "kind": "IDENTIFIER",
+                                            "name": "val",
+                                            "startPosition": "2845"
+                                          },
                                           "expression": {
-                                            "endPosition": "2745",
+                                            "endPosition": "2848",
                                             "kind": "IDENTIFIER",
-                                            "name": "Parser",
-                                            "startPosition": "2739"
+                                            "name": "val",
+                                            "startPosition": "2845"
                                           },
-                                          "endPosition": "2750",
-                                          "kind": "MEMBER_SELECT",
-                                          "startPosition": "2739"
+                                          "endPosition": "2871",
+                                          "kind": "INSTANCE_OF",
+                                          "rightOperand": {
+                                            "identifier": "Enum",
+                                            "expression": {
+                                              "endPosition": "2866",
+                                              "kind": "IDENTIFIER",
+                                              "name": "Parser",
+                                              "startPosition": "2860"
+                                            },
+                                            "endPosition": "2871",
+                                            "kind": "MEMBER_SELECT",
+                                            "startPosition": "2860"
+                                          },
+                                          "type": {
+                                            "identifier": "Enum",
+                                            "expression": {
+                                              "endPosition": "2866",
+                                              "kind": "IDENTIFIER",
+                                              "name": "Parser",
+                                              "startPosition": "2860"
+                                            },
+                                            "endPosition": "2871",
+                                            "kind": "MEMBER_SELECT",
+                                            "startPosition": "2860"
+                                          },
+                                          "startPosition": "2845"
                                         },
-                                        "startPosition": "2724"
+                                        "startPosition": "2812"
                                       },
-                                      "endPosition": "2820",
+                                      "endPosition": "2945",
                                       "kind": "IF",
-                                      "startPosition": "2720",
+                                      "startPosition": "2808",
                                       "thenStatement": {
-                                        "endPosition": "2820",
+                                        "endPosition": "2945",
                                         "kind": "BLOCK",
                                         "statements": [
                                           {
                                             "expression": {
                                               "expression": {
-                                                "endPosition": "2799",
+                                                "endPosition": "2922",
                                                 "kind": "FUNCTION_INVOCATION",
                                                 "functionSelect": {
-                                                  "endPosition": "2794",
+                                                  "endPosition": "2917",
                                                   "kind": "IDENTIFIER",
                                                   "name": "String",
-                                                  "startPosition": "2788"
+                                                  "startPosition": "2911"
                                                 },
                                                 "arguments": [
                                                   {
-                                                    "endPosition": "2798",
+                                                    "endPosition": "2921",
                                                     "kind": "IDENTIFIER",
                                                     "name": "val",
-                                                    "startPosition": "2795"
+                                                    "startPosition": "2918"
                                                   }
                                                 ],
-                                                "startPosition": "2788"
+                                                "startPosition": "2911"
                                               },
-                                              "endPosition": "2799",
+                                              "endPosition": "2922",
                                               "kind": "ASSIGNMENT",
                                               "variable": {
                                                 "expression": {
-                                                  "endPosition": "2782",
+                                                  "endPosition": "2905",
                                                   "kind": "IDENTIFIER",
                                                   "name": "result",
-                                                  "startPosition": "2776"
+                                                  "startPosition": "2899"
                                                 },
-                                                "endPosition": "2785",
+                                                "endPosition": "2908",
                                                 "kind": "ARRAY_ACCESS",
                                                 "index": {
-                                                  "endPosition": "2784",
+                                                  "endPosition": "2907",
                                                   "kind": "IDENTIFIER",
                                                   "name": "i",
-                                                  "startPosition": "2783"
+                                                  "startPosition": "2906"
                                                 },
-                                                "startPosition": "2776"
+                                                "startPosition": "2899"
                                               },
-                                              "startPosition": "2776"
+                                              "startPosition": "2899"
                                             },
-                                            "endPosition": "2799",
+                                            "endPosition": "2922",
                                             "kind": "EXPRESSION_STATEMENT",
-                                            "startPosition": "2776"
+                                            "startPosition": "2899"
                                           }
                                         ],
-                                        "startPosition": "2752"
+                                        "startPosition": "2873"
                                       }
                                     }
                                   ],
-                                  "startPosition": "2693"
+                                  "startPosition": "2779"
                                 }
                               ],
                               "expression": {
                                 "expression": {
-                                  "endPosition": "2544",
+                                  "endPosition": "2593",
                                   "kind": "IDENTIFIER",
                                   "name": "val",
-                                  "startPosition": "2541"
+                                  "startPosition": "2590"
                                 },
-                                "endPosition": "2544",
+                                "endPosition": "2593",
                                 "kind": "TYPEOF",
-                                "startPosition": "2534"
+                                "startPosition": "2583"
                               },
-                              "endPosition": "2832",
+                              "endPosition": "2959",
                               "kind": "SWITCH",
-                              "startPosition": "2526"
+                              "startPosition": "2575"
                             }
                           ],
-                          "startPosition": "2514"
+                          "startPosition": "2561"
                         },
-                        "endPosition": "2840",
+                        "endPosition": "2969",
                         "kind": "IF",
-                        "startPosition": "2302",
+                        "startPosition": "2343",
                         "thenStatement": {
-                          "endPosition": "2508",
+                          "endPosition": "2555",
                           "kind": "BLOCK",
                           "statements": [
                             {
-                              "endPosition": "2377",
+                              "endPosition": "2420",
                               "kind": "VARIABLE",
                               "name": "arr",
-                              "startPosition": "2350",
+                              "startPosition": "2393",
                               "initializer": {
                                 "constructorExpression": {
-                                  "endPosition": "2377",
+                                  "endPosition": "2420",
                                   "kind": "FUNCTION_INVOCATION",
                                   "functionSelect": {
-                                    "endPosition": "2365",
+                                    "endPosition": "2408",
                                     "kind": "IDENTIFIER",
                                     "name": "Array",
-                                    "startPosition": "2360"
+                                    "startPosition": "2403"
                                   },
                                   "arguments": [
                                     {
-                                      "endPosition": "2376",
+                                      "endPosition": "2419",
                                       "kind": "FUNCTION_INVOCATION",
                                       "functionSelect": {
                                         "identifier": "size",
                                         "expression": {
-                                          "endPosition": "2369",
+                                          "endPosition": "2412",
                                           "kind": "IDENTIFIER",
                                           "name": "val",
-                                          "startPosition": "2366"
+                                          "startPosition": "2409"
                                         },
-                                        "endPosition": "2374",
+                                        "endPosition": "2417",
                                         "kind": "MEMBER_SELECT",
-                                        "startPosition": "2366"
+                                        "startPosition": "2409"
                                       },
                                       "arguments": [],
-                                      "startPosition": "2366"
+                                      "startPosition": "2409"
                                     }
                                   ],
-                                  "startPosition": "2360"
+                                  "startPosition": "2403"
                                 },
-                                "endPosition": "2377",
+                                "endPosition": "2420",
                                 "kind": "NEW",
-                                "startPosition": "2356"
+                                "startPosition": "2399"
                               }
                             },
                             {
-                              "endPosition": "2399",
+                              "endPosition": "2444",
                               "kind": "VARIABLE",
                               "name": "j",
-                              "startPosition": "2398"
+                              "startPosition": "2443"
                             },
                             {
                               "expression": {
-                                "endPosition": "2406",
+                                "endPosition": "2451",
                                 "kind": "IDENTIFIER",
                                 "name": "val",
-                                "startPosition": "2403"
+                                "startPosition": "2448"
                               },
-                              "endPosition": "2466",
+                              "endPosition": "2515",
                               "kind": "FOR_IN_LOOP",
                               "forEach": "false",
                               "variable": {
-                                "endPosition": "2399",
+                                "endPosition": "2444",
                                 "kind": "IDENTIFIER",
                                 "name": "j",
-                                "startPosition": "2398"
+                                "startPosition": "2443"
                               },
                               "statement": {
-                                "endPosition": "2466",
+                                "endPosition": "2515",
                                 "kind": "BLOCK",
                                 "statements": [
                                   {
                                     "expression": {
                                       "expression": {
-                                        "endPosition": "2453",
+                                        "endPosition": "2500",
                                         "kind": "FUNCTION_INVOCATION",
                                         "functionSelect": {
                                           "identifier": "convert",
                                           "expression": {
-                                            "endPosition": "2437",
+                                            "endPosition": "2484",
                                             "kind": "IDENTIFIER",
                                             "name": "this",
-                                            "startPosition": "2433"
+                                            "startPosition": "2480"
                                           },
-                                          "endPosition": "2445",
+                                          "endPosition": "2492",
                                           "kind": "MEMBER_SELECT",
-                                          "startPosition": "2433"
+                                          "startPosition": "2480"
                                         },
                                         "arguments": [
                                           {
                                             "expression": {
-                                              "endPosition": "2449",
+                                              "endPosition": "2496",
                                               "kind": "IDENTIFIER",
                                               "name": "val",
-                                              "startPosition": "2446"
+                                              "startPosition": "2493"
                                             },
-                                            "endPosition": "2452",
+                                            "endPosition": "2499",
                                             "kind": "ARRAY_ACCESS",
                                             "index": {
-                                              "endPosition": "2451",
+                                              "endPosition": "2498",
                                               "kind": "IDENTIFIER",
                                               "name": "j",
-                                              "startPosition": "2450"
+                                              "startPosition": "2497"
                                             },
-                                            "startPosition": "2446"
+                                            "startPosition": "2493"
                                           }
                                         ],
-                                        "startPosition": "2433"
+                                        "startPosition": "2480"
                                       },
-                                      "endPosition": "2453",
+                                      "endPosition": "2500",
                                       "kind": "ASSIGNMENT",
                                       "variable": {
                                         "expression": {
-                                          "endPosition": "2427",
+                                          "endPosition": "2474",
                                           "kind": "IDENTIFIER",
                                           "name": "arr",
-                                          "startPosition": "2424"
+                                          "startPosition": "2471"
                                         },
-                                        "endPosition": "2430",
+                                        "endPosition": "2477",
                                         "kind": "ARRAY_ACCESS",
                                         "index": {
-                                          "endPosition": "2429",
+                                          "endPosition": "2476",
                                           "kind": "IDENTIFIER",
                                           "name": "j",
-                                          "startPosition": "2428"
+                                          "startPosition": "2475"
                                         },
-                                        "startPosition": "2424"
+                                        "startPosition": "2471"
                                       },
-                                      "startPosition": "2424"
+                                      "startPosition": "2471"
                                     },
-                                    "endPosition": "2453",
+                                    "endPosition": "2500",
                                     "kind": "EXPRESSION_STATEMENT",
-                                    "startPosition": "2424"
+                                    "startPosition": "2471"
                                   }
                                 ],
-                                "startPosition": "2408"
+                                "startPosition": "2453"
                               },
-                              "startPosition": "2389"
+                              "startPosition": "2434"
                             },
                             {
                               "expression": {
                                 "expression": {
-                                  "endPosition": "2499",
+                                  "endPosition": "2544",
                                   "kind": "IDENTIFIER",
                                   "name": "arr",
-                                  "startPosition": "2496"
+                                  "startPosition": "2541"
                                 },
-                                "endPosition": "2499",
+                                "endPosition": "2544",
                                 "kind": "ASSIGNMENT",
                                 "variable": {
                                   "expression": {
-                                    "endPosition": "2490",
+                                    "endPosition": "2535",
                                     "kind": "IDENTIFIER",
                                     "name": "result",
-                                    "startPosition": "2484"
+                                    "startPosition": "2529"
                                   },
-                                  "endPosition": "2493",
+                                  "endPosition": "2538",
                                   "kind": "ARRAY_ACCESS",
                                   "index": {
-                                    "endPosition": "2492",
+                                    "endPosition": "2537",
                                     "kind": "IDENTIFIER",
                                     "name": "i",
-                                    "startPosition": "2491"
+                                    "startPosition": "2536"
                                   },
-                                  "startPosition": "2484"
+                                  "startPosition": "2529"
                                 },
-                                "startPosition": "2484"
+                                "startPosition": "2529"
                               },
-                              "endPosition": "2499",
+                              "endPosition": "2544",
                               "kind": "EXPRESSION_STATEMENT",
-                              "startPosition": "2484"
+                              "startPosition": "2529"
                             }
                           ],
-                          "startPosition": "2334"
+                          "startPosition": "2375"
                         }
                       },
-                      "endPosition": "2840",
+                      "endPosition": "2969",
                       "kind": "IF",
-                      "startPosition": "2213",
+                      "startPosition": "2251",
                       "thenStatement": {
-                        "endPosition": "2296",
+                        "endPosition": "2337",
                         "kind": "BLOCK",
                         "statements": [
                           {
                             "expression": {
                               "expression": {
-                                "endPosition": "2286",
+                                "endPosition": "2326",
                                 "kind": "FUNCTION_INVOCATION",
                                 "functionSelect": {
                                   "identifier": "convert",
                                   "expression": {
-                                    "endPosition": "2273",
+                                    "endPosition": "2313",
                                     "kind": "IDENTIFIER",
                                     "name": "this",
-                                    "startPosition": "2269"
+                                    "startPosition": "2309"
                                   },
-                                  "endPosition": "2281",
+                                  "endPosition": "2321",
                                   "kind": "MEMBER_SELECT",
-                                  "startPosition": "2269"
+                                  "startPosition": "2309"
                                 },
                                 "arguments": [
                                   {
-                                    "endPosition": "2285",
+                                    "endPosition": "2325",
                                     "kind": "IDENTIFIER",
                                     "name": "val",
-                                    "startPosition": "2282"
+                                    "startPosition": "2322"
                                   }
                                 ],
-                                "startPosition": "2269"
+                                "startPosition": "2309"
                               },
-                              "endPosition": "2286",
+                              "endPosition": "2326",
                               "kind": "ASSIGNMENT",
                               "variable": {
                                 "expression": {
-                                  "endPosition": "2263",
+                                  "endPosition": "2303",
                                   "kind": "IDENTIFIER",
                                   "name": "result",
-                                  "startPosition": "2257"
+                                  "startPosition": "2297"
                                 },
-                                "endPosition": "2266",
+                                "endPosition": "2306",
                                 "kind": "ARRAY_ACCESS",
                                 "index": {
-                                  "endPosition": "2265",
+                                  "endPosition": "2305",
                                   "kind": "IDENTIFIER",
                                   "name": "i",
-                                  "startPosition": "2264"
+                                  "startPosition": "2304"
                                 },
-                                "startPosition": "2257"
+                                "startPosition": "2297"
                               },
-                              "startPosition": "2257"
+                              "startPosition": "2297"
                             },
-                            "endPosition": "2286",
+                            "endPosition": "2326",
                             "kind": "EXPRESSION_STATEMENT",
-                            "startPosition": "2257"
+                            "startPosition": "2297"
                           }
                         ],
-                        "startPosition": "2245"
+                        "startPosition": "2283"
                       }
                     }
                   ],
-                  "startPosition": "2179"
+                  "startPosition": "2215"
                 },
-                "startPosition": "2160"
+                "startPosition": "2196"
               },
               {
                 "expression": {
-                  "endPosition": "2862",
+                  "endPosition": "2993",
                   "kind": "IDENTIFIER",
                   "name": "result",
-                  "startPosition": "2856"
+                  "startPosition": "2987"
                 },
-                "endPosition": "2863",
+                "endPosition": "2994",
                 "kind": "RETURN",
-                "startPosition": "2849"
+                "startPosition": "2980"
               }
             ],
-            "startPosition": "2014"
+            "startPosition": "2016"
           },
           "strict": "false",
-          "startPosition": "2014",
+          "startPosition": "2016",
           "parameters": [
             {
-              "endPosition": "2012",
+              "endPosition": "2014",
               "kind": "IDENTIFIER",
               "name": "tree",
-              "startPosition": "2008"
+              "startPosition": "2010"
             }
           ]
         },
-        "endPosition": "2014",
+        "endPosition": "2016",
         "kind": "ASSIGNMENT",
         "variable": {
           "identifier": "convert",
           "expression": {
             "identifier": "prototype",
             "expression": {
-              "endPosition": "1978",
+              "endPosition": "1980",
               "kind": "IDENTIFIER",
               "name": "Parser",
-              "startPosition": "1972"
+              "startPosition": "1974"
             },
-            "endPosition": "1988",
+            "endPosition": "1990",
             "kind": "MEMBER_SELECT",
-            "startPosition": "1972"
+            "startPosition": "1974"
           },
-          "endPosition": "1996",
+          "endPosition": "1998",
           "kind": "MEMBER_SELECT",
-          "startPosition": "1972"
-        },
-        "startPosition": "1972"
-      },
-      "endPosition": "2865",
+          "startPosition": "1974"
+        },
+        "startPosition": "1974"
+      },
+      "endPosition": "2996",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "1972"
-    },
-    {
-      "endPosition": "3618",
+      "startPosition": "1974"
+    },
+    {
+      "endPosition": "3767",
       "kind": "FUNCTION",
       "name": "processFiles",
       "body": {
-        "endPosition": "3575",
+        "endPosition": "3724",
         "kind": "BLOCK",
         "statements": [
           {
-            "endPosition": "2938",
+            "endPosition": "3070",
             "kind": "VARIABLE",
             "name": "File",
-            "startPosition": "2906",
+            "startPosition": "3038",
             "initializer": {
-              "endPosition": "2938",
+              "endPosition": "3070",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "type",
                 "expression": {
-                  "endPosition": "2917",
+                  "endPosition": "3049",
                   "kind": "IDENTIFIER",
                   "name": "Java",
-                  "startPosition": "2913"
+                  "startPosition": "3045"
                 },
-                "endPosition": "2922",
+                "endPosition": "3054",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "2913"
+                "startPosition": "3045"
               },
               "arguments": [
                 {
-                  "endPosition": "2936",
+                  "endPosition": "3068",
                   "kind": "STRING_LITERAL",
                   "value": "java.io.File",
-                  "startPosition": "2924"
+                  "startPosition": "3056"
                 }
               ],
-              "startPosition": "2913"
+              "startPosition": "3045"
             }
           },
           {
-            "endPosition": "2993",
+            "endPosition": "3126",
             "kind": "VARIABLE",
             "name": "files",
-            "startPosition": "2947",
+            "startPosition": "3080",
             "initializer": {
-              "endPosition": "2993",
+              "endPosition": "3126",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "listFiles",
                 "expression": {
                   "constructorExpression": {
-                    "endPosition": "2981",
+                    "endPosition": "3114",
                     "kind": "FUNCTION_INVOCATION",
                     "functionSelect": {
-                      "endPosition": "2963",
+                      "endPosition": "3096",
                       "kind": "IDENTIFIER",
                       "name": "File",
-                      "startPosition": "2959"
+                      "startPosition": "3092"
                     },
                     "arguments": [
                       {
                         "leftOperand": {
-                          "endPosition": "2971",
+                          "endPosition": "3104",
                           "kind": "IDENTIFIER",
                           "name": "__DIR__",
-                          "startPosition": "2964"
+                          "startPosition": "3097"
                         },
-                        "endPosition": "2980",
+                        "endPosition": "3113",
                         "kind": "PLUS",
                         "rightOperand": {
-                          "endPosition": "2980",
+                          "endPosition": "3113",
                           "kind": "IDENTIFIER",
                           "name": "subdir",
-                          "startPosition": "2974"
+                          "startPosition": "3107"
                         },
-                        "startPosition": "2964"
+                        "startPosition": "3097"
                       }
                     ],
-                    "startPosition": "2959"
+                    "startPosition": "3092"
                   },
-                  "endPosition": "2981",
+                  "endPosition": "3114",
                   "kind": "NEW",
-                  "startPosition": "2955"
+                  "startPosition": "3088"
                 },
-                "endPosition": "2991",
+                "endPosition": "3124",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "2955"
+                "startPosition": "3088"
               },
               "arguments": [],
-              "startPosition": "2955"
+              "startPosition": "3088"
             }
           },
           {
             "expression": {
-              "endPosition": "3026",
+              "endPosition": "3160",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "sort",
@@ -6291,751 +6412,751 @@
                   "expression": {
                     "identifier": "util",
                     "expression": {
-                      "endPosition": "3002",
+                      "endPosition": "3136",
                       "kind": "IDENTIFIER",
                       "name": "java",
-                      "startPosition": "2998"
+                      "startPosition": "3132"
                     },
-                    "endPosition": "3007",
+                    "endPosition": "3141",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "2998"
+                    "startPosition": "3132"
                   },
-                  "endPosition": "3014",
+                  "endPosition": "3148",
                   "kind": "MEMBER_SELECT",
-                  "startPosition": "2998"
+                  "startPosition": "3132"
                 },
-                "endPosition": "3019",
+                "endPosition": "3153",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "2998"
+                "startPosition": "3132"
               },
               "arguments": [
                 {
-                  "endPosition": "3025",
+                  "endPosition": "3159",
                   "kind": "IDENTIFIER",
                   "name": "files",
-                  "startPosition": "3020"
+                  "startPosition": "3154"
                 }
               ],
-              "startPosition": "2998"
+              "startPosition": "3132"
             },
-            "endPosition": "3026",
+            "endPosition": "3160",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "2998"
+            "startPosition": "3132"
           },
           {
-            "endPosition": "3049",
+            "endPosition": "3184",
             "kind": "VARIABLE",
             "name": "file",
-            "startPosition": "3045"
+            "startPosition": "3180"
           },
           {
             "expression": {
-              "endPosition": "3058",
+              "endPosition": "3193",
               "kind": "IDENTIFIER",
               "name": "files",
-              "startPosition": "3053"
+              "startPosition": "3188"
             },
-            "endPosition": "3575",
+            "endPosition": "3724",
             "kind": "FOR_IN_LOOP",
             "forEach": "true",
             "variable": {
-              "endPosition": "3049",
+              "endPosition": "3184",
               "kind": "IDENTIFIER",
               "name": "file",
-              "startPosition": "3045"
+              "startPosition": "3180"
             },
             "statement": {
-              "endPosition": "3575",
+              "endPosition": "3724",
               "kind": "BLOCK",
               "statements": [
                 {
                   "condition": {
-                    "endPosition": "3098",
+                    "endPosition": "3234",
                     "kind": "FUNCTION_INVOCATION",
                     "functionSelect": {
                       "identifier": "endsWith",
                       "expression": {
                         "identifier": "name",
                         "expression": {
-                          "endPosition": "3077",
+                          "endPosition": "3213",
                           "kind": "IDENTIFIER",
                           "name": "file",
-                          "startPosition": "3073"
+                          "startPosition": "3209"
                         },
-                        "endPosition": "3082",
+                        "endPosition": "3218",
                         "kind": "MEMBER_SELECT",
-                        "startPosition": "3073"
+                        "startPosition": "3209"
                       },
-                      "endPosition": "3091",
+                      "endPosition": "3227",
                       "kind": "MEMBER_SELECT",
-                      "startPosition": "3073"
+                      "startPosition": "3209"
                     },
                     "arguments": [
                       {
-                        "endPosition": "3096",
+                        "endPosition": "3232",
                         "kind": "STRING_LITERAL",
                         "value": ".js",
-                        "startPosition": "3093"
+                        "startPosition": "3229"
                       }
                     ],
-                    "startPosition": "3073"
+                    "startPosition": "3209"
                   },
-                  "endPosition": "3570",
+                  "endPosition": "3718",
                   "kind": "IF",
-                  "startPosition": "3069",
+                  "startPosition": "3205",
                   "thenStatement": {
-                    "endPosition": "3570",
+                    "endPosition": "3718",
                     "kind": "BLOCK",
                     "statements": [
                       {
-                        "endPosition": "3141",
+                        "endPosition": "3278",
                         "kind": "VARIABLE",
                         "name": "script",
-                        "startPosition": "3117",
+                        "startPosition": "3254",
                         "initializer": {
-                          "endPosition": "3141",
+                          "endPosition": "3278",
                           "kind": "FUNCTION_INVOCATION",
                           "functionSelect": {
-                            "endPosition": "3135",
+                            "endPosition": "3272",
                             "kind": "IDENTIFIER",
                             "name": "readFully",
-                            "startPosition": "3126"
+                            "startPosition": "3263"
                           },
                           "arguments": [
                             {
-                              "endPosition": "3140",
+                              "endPosition": "3277",
                               "kind": "IDENTIFIER",
                               "name": "file",
-                              "startPosition": "3136"
+                              "startPosition": "3273"
                             }
                           ],
-                          "startPosition": "3126"
+                          "startPosition": "3263"
                         }
                       },
                       {
-                        "endPosition": "3179",
+                        "endPosition": "3317",
                         "kind": "VARIABLE",
                         "name": "parser",
-                        "startPosition": "3158",
+                        "startPosition": "3296",
                         "initializer": {
                           "constructorExpression": {
-                            "endPosition": "3179",
+                            "endPosition": "3317",
                             "kind": "FUNCTION_INVOCATION",
                             "functionSelect": {
-                              "endPosition": "3177",
+                              "endPosition": "3315",
                               "kind": "IDENTIFIER",
                               "name": "Parser",
-                              "startPosition": "3171"
+                              "startPosition": "3309"
                             },
                             "arguments": [],
-                            "startPosition": "3171"
+                            "startPosition": "3309"
                           },
-                          "endPosition": "3179",
+                          "endPosition": "3317",
                           "kind": "NEW",
-                          "startPosition": "3167"
+                          "startPosition": "3305"
                         }
                       },
                       {
-                        "endPosition": "3435",
+                        "endPosition": "3578",
                         "kind": "VARIABLE",
                         "name": "tree",
-                        "startPosition": "3196",
+                        "startPosition": "3335",
                         "initializer": {
-                          "endPosition": "3435",
+                          "endPosition": "3578",
                           "kind": "FUNCTION_INVOCATION",
                           "functionSelect": {
                             "identifier": "parse",
                             "expression": {
-                              "endPosition": "3209",
+                              "endPosition": "3348",
                               "kind": "IDENTIFIER",
                               "name": "parser",
-                              "startPosition": "3203"
+                              "startPosition": "3342"
                             },
-                            "endPosition": "3215",
+                            "endPosition": "3354",
                             "kind": "MEMBER_SELECT",
-                            "startPosition": "3203"
+                            "startPosition": "3342"
                           },
                           "arguments": [
                             {
                               "leftOperand": {
                                 "leftOperand": {
-                                  "endPosition": "3222",
+                                  "endPosition": "3361",
                                   "kind": "IDENTIFIER",
                                   "name": "subdir",
-                                  "startPosition": "3216"
+                                  "startPosition": "3355"
                                 },
-                                "endPosition": "3227",
+                                "endPosition": "3366",
                                 "kind": "PLUS",
                                 "rightOperand": {
-                                  "endPosition": "3227",
+                                  "endPosition": "3366",
                                   "kind": "STRING_LITERAL",
                                   "value": "/",
-                                  "startPosition": "3226"
+                                  "startPosition": "3365"
                                 },
-                                "startPosition": "3216"
+                                "startPosition": "3355"
                               },
-                              "endPosition": "3240",
+                              "endPosition": "3379",
                               "kind": "PLUS",
                               "rightOperand": {
                                 "identifier": "name",
                                 "expression": {
-                                  "endPosition": "3235",
+                                  "endPosition": "3374",
                                   "kind": "IDENTIFIER",
                                   "name": "file",
-                                  "startPosition": "3231"
+                                  "startPosition": "3370"
                                 },
-                                "endPosition": "3240",
+                                "endPosition": "3379",
                                 "kind": "MEMBER_SELECT",
-                                "startPosition": "3231"
+                                "startPosition": "3370"
                               },
-                              "startPosition": "3216"
+                              "startPosition": "3355"
                             },
                             {
-                              "endPosition": "3248",
+                              "endPosition": "3387",
                               "kind": "IDENTIFIER",
                               "name": "script",
-                              "startPosition": "3242"
+                              "startPosition": "3381"
                             },
                             {
-                              "endPosition": "3286",
+                              "endPosition": "3426",
                               "kind": "FUNCTION_EXPRESSION",
                               "body": {
-                                "endPosition": "3417",
+                                "endPosition": "3559",
                                 "kind": "BLOCK",
                                 "statements": [
                                   {
                                     "expression": {
-                                      "endPosition": "3385",
+                                      "endPosition": "3526",
                                       "kind": "FUNCTION_INVOCATION",
                                       "functionSelect": {
-                                        "endPosition": "3312",
+                                        "endPosition": "3453",
                                         "kind": "IDENTIFIER",
                                         "name": "print",
-                                        "startPosition": "3307"
+                                        "startPosition": "3448"
                                       },
                                       "arguments": [
                                         {
-                                          "endPosition": "3384",
+                                          "endPosition": "3525",
                                           "kind": "FUNCTION_INVOCATION",
                                           "functionSelect": {
                                             "identifier": "replace",
                                             "expression": {
-                                              "endPosition": "3364",
+                                              "endPosition": "3505",
                                               "kind": "FUNCTION_INVOCATION",
                                               "functionSelect": {
                                                 "identifier": "stringify",
                                                 "expression": {
-                                                  "endPosition": "3317",
+                                                  "endPosition": "3458",
                                                   "kind": "IDENTIFIER",
                                                   "name": "JSON",
-                                                  "startPosition": "3313"
+                                                  "startPosition": "3454"
                                                 },
-                                                "endPosition": "3327",
+                                                "endPosition": "3468",
                                                 "kind": "MEMBER_SELECT",
-                                                "startPosition": "3313"
+                                                "startPosition": "3454"
                                               },
                                               "arguments": [
                                                 {
-                                                  "endPosition": "3354",
+                                                  "endPosition": "3495",
                                                   "kind": "FUNCTION_INVOCATION",
                                                   "functionSelect": {
                                                     "identifier": "convert",
                                                     "expression": {
-                                                      "endPosition": "3334",
+                                                      "endPosition": "3475",
                                                       "kind": "IDENTIFIER",
                                                       "name": "parser",
-                                                      "startPosition": "3328"
+                                                      "startPosition": "3469"
                                                     },
-                                                    "endPosition": "3342",
+                                                    "endPosition": "3483",
                                                     "kind": "MEMBER_SELECT",
-                                                    "startPosition": "3328"
+                                                    "startPosition": "3469"
                                                   },
                                                   "arguments": [
                                                     {
-                                                      "endPosition": "3353",
+                                                      "endPosition": "3494",
                                                       "kind": "IDENTIFIER",
                                                       "name": "diagnostic",
-                                                      "startPosition": "3343"
+                                                      "startPosition": "3484"
                                                     }
                                                   ],
-                                                  "startPosition": "3328"
+                                                  "startPosition": "3469"
                                                 },
                                                 {
-                                                  "endPosition": "3360",
+                                                  "endPosition": "3501",
                                                   "kind": "NULL_LITERAL",
-                                                  "startPosition": "3356"
+                                                  "startPosition": "3497"
                                                 },
                                                 {
-                                                  "endPosition": "3363",
+                                                  "endPosition": "3504",
                                                   "kind": "NUMBER_LITERAL",
                                                   "value": "2",
-                                                  "startPosition": "3362"
+                                                  "startPosition": "3503"
                                                 }
                                               ],
-                                              "startPosition": "3313"
+                                              "startPosition": "3454"
                                             },
-                                            "endPosition": "3372",
+                                            "endPosition": "3513",
                                             "kind": "MEMBER_SELECT",
-                                            "startPosition": "3313"
+                                            "startPosition": "3454"
                                           },
                                           "arguments": [
                                             {
-                                              "endPosition": "3379",
+                                              "endPosition": "3520",
                                               "kind": "REGEXP_LITERAL",
                                               "options": "g",
                                               "pattern": "\\\\r",
-                                              "startPosition": "3373"
+                                              "startPosition": "3514"
                                             },
                                             {
-                                              "endPosition": "3382",
+                                              "endPosition": "3523",
                                               "kind": "STRING_LITERAL",
                                               "value": "",
-                                              "startPosition": "3382"
+                                              "startPosition": "3523"
                                             }
                                           ],
-                                          "startPosition": "3372"
+                                          "startPosition": "3513"
                                         }
                                       ],
-                                      "startPosition": "3307"
+                                      "startPosition": "3448"
                                     },
-                                    "endPosition": "3385",
+                                    "endPosition": "3526",
                                     "kind": "EXPRESSION_STATEMENT",
-                                    "startPosition": "3307"
+                                    "startPosition": "3448"
                                   },
                                   {
                                     "expression": {
-                                      "endPosition": "3416",
+                                      "endPosition": "3558",
                                       "kind": "FUNCTION_INVOCATION",
                                       "functionSelect": {
-                                        "endPosition": "3411",
+                                        "endPosition": "3553",
                                         "kind": "IDENTIFIER",
                                         "name": "print",
-                                        "startPosition": "3406"
+                                        "startPosition": "3548"
                                       },
                                       "arguments": [
                                         {
-                                          "endPosition": "3414",
+                                          "endPosition": "3556",
                                           "kind": "STRING_LITERAL",
                                           "value": ",",
-                                          "startPosition": "3413"
+                                          "startPosition": "3555"
                                         }
                                       ],
-                                      "startPosition": "3406"
+                                      "startPosition": "3548"
                                     },
-                                    "endPosition": "3416",
+                                    "endPosition": "3558",
                                     "kind": "EXPRESSION_STATEMENT",
-                                    "startPosition": "3406"
+                                    "startPosition": "3548"
                                   }
                                 ],
-                                "startPosition": "3286"
+                                "startPosition": "3426"
                               },
                               "strict": "false",
-                              "startPosition": "3286",
+                              "startPosition": "3426",
                               "parameters": [
                                 {
-                                  "endPosition": "3284",
+                                  "endPosition": "3424",
                                   "kind": "IDENTIFIER",
                                   "name": "diagnostic",
-                                  "startPosition": "3274"
+                                  "startPosition": "3414"
                                 }
                               ]
                             }
                           ],
-                          "startPosition": "3203"
+                          "startPosition": "3342"
                         }
                       },
                       {
                         "condition": {
                           "leftOperand": {
-                            "endPosition": "3457",
+                            "endPosition": "3601",
                             "kind": "IDENTIFIER",
                             "name": "tree",
-                            "startPosition": "3453"
+                            "startPosition": "3597"
                           },
-                          "endPosition": "3465",
+                          "endPosition": "3609",
                           "kind": "NOT_EQUAL_TO",
                           "rightOperand": {
-                            "endPosition": "3465",
+                            "endPosition": "3609",
                             "kind": "NULL_LITERAL",
-                            "startPosition": "3461"
+                            "startPosition": "3605"
                           },
-                          "startPosition": "3453"
+                          "startPosition": "3597"
                         },
-                        "endPosition": "3561",
+                        "endPosition": "3708",
                         "kind": "IF",
-                        "startPosition": "3449",
+                        "startPosition": "3593",
                         "thenStatement": {
-                          "endPosition": "3561",
+                          "endPosition": "3708",
                           "kind": "BLOCK",
                           "statements": [
                             {
                               "expression": {
-                                "endPosition": "3520",
+                                "endPosition": "3665",
                                 "kind": "FUNCTION_INVOCATION",
                                 "functionSelect": {
-                                  "endPosition": "3489",
+                                  "endPosition": "3634",
                                   "kind": "IDENTIFIER",
                                   "name": "print",
-                                  "startPosition": "3484"
+                                  "startPosition": "3629"
                                 },
                                 "arguments": [
                                   {
-                                    "endPosition": "3519",
+                                    "endPosition": "3664",
                                     "kind": "FUNCTION_INVOCATION",
                                     "functionSelect": {
                                       "identifier": "stringify",
                                       "expression": {
-                                        "endPosition": "3494",
+                                        "endPosition": "3639",
                                         "kind": "IDENTIFIER",
                                         "name": "JSON",
-                                        "startPosition": "3490"
+                                        "startPosition": "3635"
                                       },
-                                      "endPosition": "3504",
+                                      "endPosition": "3649",
                                       "kind": "MEMBER_SELECT",
-                                      "startPosition": "3490"
+                                      "startPosition": "3635"
                                     },
                                     "arguments": [
                                       {
-                                        "endPosition": "3509",
+                                        "endPosition": "3654",
                                         "kind": "IDENTIFIER",
                                         "name": "tree",
-                                        "startPosition": "3505"
+                                        "startPosition": "3650"
                                       },
                                       {
-                                        "endPosition": "3515",
+                                        "endPosition": "3660",
                                         "kind": "NULL_LITERAL",
-                                        "startPosition": "3511"
+                                        "startPosition": "3656"
                                       },
                                       {
-                                        "endPosition": "3518",
+                                        "endPosition": "3663",
                                         "kind": "NUMBER_LITERAL",
                                         "value": "2",
-                                        "startPosition": "3517"
+                                        "startPosition": "3662"
                                       }
                                     ],
-                                    "startPosition": "3490"
+                                    "startPosition": "3635"
                                   }
                                 ],
-                                "startPosition": "3484"
+                                "startPosition": "3629"
                               },
-                              "endPosition": "3520",
+                              "endPosition": "3665",
                               "kind": "EXPRESSION_STATEMENT",
-                              "startPosition": "3484"
+                              "startPosition": "3629"
                             },
                             {
                               "expression": {
-                                "endPosition": "3547",
+                                "endPosition": "3693",
                                 "kind": "FUNCTION_INVOCATION",
                                 "functionSelect": {
-                                  "endPosition": "3542",
+                                  "endPosition": "3688",
                                   "kind": "IDENTIFIER",
                                   "name": "print",
-                                  "startPosition": "3537"
+                                  "startPosition": "3683"
                                 },
                                 "arguments": [
                                   {
-                                    "endPosition": "3545",
+                                    "endPosition": "3691",
                                     "kind": "STRING_LITERAL",
                                     "value": ",",
-                                    "startPosition": "3544"
+                                    "startPosition": "3690"
                                   }
                                 ],
-                                "startPosition": "3537"
+                                "startPosition": "3683"
                               },
-                              "endPosition": "3547",
+                              "endPosition": "3693",
                               "kind": "EXPRESSION_STATEMENT",
-                              "startPosition": "3537"
+                              "startPosition": "3683"
                             }
                           ],
-                          "startPosition": "3467"
+                          "startPosition": "3611"
                         }
                       }
                     ],
-                    "startPosition": "3100"
+                    "startPosition": "3236"
                   }
                 }
               ],
-              "startPosition": "3060"
+              "startPosition": "3195"
             },
-            "startPosition": "3031"
+            "startPosition": "3166"
           }
         ],
-        "startPosition": "2897"
+        "startPosition": "3028"
       },
       "strict": "false",
-      "startPosition": "2867",
+      "startPosition": "2998",
       "parameters": [
         {
-          "endPosition": "2895",
+          "endPosition": "3026",
           "kind": "IDENTIFIER",
           "name": "subdir",
-          "startPosition": "2889"
+          "startPosition": "3020"
         }
       ]
     },
     {
-      "endPosition": "3921",
+      "endPosition": "4070",
       "kind": "FUNCTION",
       "name": "main",
       "body": {
-        "endPosition": "3919",
+        "endPosition": "4068",
         "kind": "BLOCK",
         "statements": [
           {
             "expression": {
-              "endPosition": "3651",
+              "endPosition": "3800",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3646",
+                "endPosition": "3795",
                 "kind": "IDENTIFIER",
                 "name": "print",
-                "startPosition": "3641"
+                "startPosition": "3790"
               },
               "arguments": [
                 {
-                  "endPosition": "3649",
+                  "endPosition": "3798",
                   "kind": "STRING_LITERAL",
                   "value": "[",
-                  "startPosition": "3648"
+                  "startPosition": "3797"
                 }
               ],
-              "startPosition": "3641"
+              "startPosition": "3790"
             },
-            "endPosition": "3651",
+            "endPosition": "3800",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3641"
+            "startPosition": "3790"
           },
           {
             "expression": {
-              "endPosition": "3685",
+              "endPosition": "3834",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3670",
+                "endPosition": "3819",
                 "kind": "IDENTIFIER",
                 "name": "processFiles",
-                "startPosition": "3658"
+                "startPosition": "3807"
               },
               "arguments": [
                 {
-                  "endPosition": "3683",
+                  "endPosition": "3832",
                   "kind": "STRING_LITERAL",
                   "value": "parsertests",
-                  "startPosition": "3672"
+                  "startPosition": "3821"
                 }
               ],
-              "startPosition": "3658"
+              "startPosition": "3807"
             },
-            "endPosition": "3685",
+            "endPosition": "3834",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3658"
+            "startPosition": "3807"
           },
           {
             "expression": {
-              "endPosition": "3726",
+              "endPosition": "3875",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3703",
+                "endPosition": "3852",
                 "kind": "IDENTIFIER",
                 "name": "processFiles",
-                "startPosition": "3691"
+                "startPosition": "3840"
               },
               "arguments": [
                 {
-                  "endPosition": "3724",
+                  "endPosition": "3873",
                   "kind": "STRING_LITERAL",
                   "value": "parsernegativetests",
-                  "startPosition": "3705"
+                  "startPosition": "3854"
                 }
               ],
-              "startPosition": "3691"
+              "startPosition": "3840"
             },
-            "endPosition": "3726",
+            "endPosition": "3875",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3691"
+            "startPosition": "3840"
           },
           {
-            "endPosition": "3795",
+            "endPosition": "3944",
             "kind": "VARIABLE",
             "name": "script",
-            "startPosition": "3767",
+            "startPosition": "3916",
             "initializer": {
-              "endPosition": "3795",
+              "endPosition": "3944",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3785",
+                "endPosition": "3934",
                 "kind": "IDENTIFIER",
                 "name": "readFully",
-                "startPosition": "3776"
+                "startPosition": "3925"
               },
               "arguments": [
                 {
-                  "endPosition": "3794",
+                  "endPosition": "3943",
                   "kind": "IDENTIFIER",
                   "name": "__FILE__",
-                  "startPosition": "3786"
+                  "startPosition": "3935"
                 }
               ],
-              "startPosition": "3776"
+              "startPosition": "3925"
             }
           },
           {
-            "endPosition": "3860",
+            "endPosition": "4009",
             "kind": "VARIABLE",
             "name": "tree",
-            "startPosition": "3805",
+            "startPosition": "3954",
             "initializer": {
-              "endPosition": "3860",
+              "endPosition": "4009",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "parse",
                 "expression": {
                   "constructorExpression": {
-                    "endPosition": "3824",
+                    "endPosition": "3973",
                     "kind": "FUNCTION_INVOCATION",
                     "functionSelect": {
-                      "endPosition": "3822",
+                      "endPosition": "3971",
                       "kind": "IDENTIFIER",
                       "name": "Parser",
-                      "startPosition": "3816"
+                      "startPosition": "3965"
                     },
                     "arguments": [],
-                    "startPosition": "3816"
+                    "startPosition": "3965"
                   },
-                  "endPosition": "3824",
+                  "endPosition": "3973",
                   "kind": "NEW",
-                  "startPosition": "3812"
+                  "startPosition": "3961"
                 },
-                "endPosition": "3830",
+                "endPosition": "3979",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "3812"
+                "startPosition": "3961"
               },
               "arguments": [
                 {
-                  "endPosition": "3844",
+                  "endPosition": "3993",
                   "kind": "STRING_LITERAL",
                   "value": "parserapi.js",
-                  "startPosition": "3832"
+                  "startPosition": "3981"
                 },
                 {
-                  "endPosition": "3853",
+                  "endPosition": "4002",
                   "kind": "IDENTIFIER",
                   "name": "script",
-                  "startPosition": "3847"
+                  "startPosition": "3996"
                 },
                 {
-                  "endPosition": "3859",
+                  "endPosition": "4008",
                   "kind": "NULL_LITERAL",
-                  "startPosition": "3855"
+                  "startPosition": "4004"
                 }
               ],
-              "startPosition": "3812"
+              "startPosition": "3961"
             }
           },
           {
             "expression": {
-              "endPosition": "3902",
+              "endPosition": "4051",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3871",
+                "endPosition": "4020",
                 "kind": "IDENTIFIER",
                 "name": "print",
-                "startPosition": "3866"
+                "startPosition": "4015"
               },
               "arguments": [
                 {
-                  "endPosition": "3901",
+                  "endPosition": "4050",
                   "kind": "FUNCTION_INVOCATION",
                   "functionSelect": {
                     "identifier": "stringify",
                     "expression": {
-                      "endPosition": "3876",
+                      "endPosition": "4025",
                       "kind": "IDENTIFIER",
                       "name": "JSON",
-                      "startPosition": "3872"
+                      "startPosition": "4021"
                     },
-                    "endPosition": "3886",
+                    "endPosition": "4035",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "3872"
+                    "startPosition": "4021"
                   },
                   "arguments": [
                     {
-                      "endPosition": "3891",
+                      "endPosition": "4040",
                       "kind": "IDENTIFIER",
                       "name": "tree",
-                      "startPosition": "3887"
+                      "startPosition": "4036"
                     },
                     {
-                      "endPosition": "3897",
+                      "endPosition": "4046",
                       "kind": "NULL_LITERAL",
-                      "startPosition": "3893"
+                      "startPosition": "4042"
                     },
                     {
-                      "endPosition": "3900",
+                      "endPosition": "4049",
                       "kind": "NUMBER_LITERAL",
                       "value": "2",
-                      "startPosition": "3899"
+                      "startPosition": "4048"
                     }
                   ],
-                  "startPosition": "3872"
+                  "startPosition": "4021"
                 }
               ],
-              "startPosition": "3866"
+              "startPosition": "4015"
             },
-            "endPosition": "3902",
+            "endPosition": "4051",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3866"
+            "startPosition": "4015"
           },
           {
             "expression": {
-              "endPosition": "3918",
+              "endPosition": "4067",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3913",
+                "endPosition": "4062",
                 "kind": "IDENTIFIER",
                 "name": "print",
-                "startPosition": "3908"
+                "startPosition": "4057"
               },
               "arguments": [
                 {
-                  "endPosition": "3916",
+                  "endPosition": "4065",
                   "kind": "STRING_LITERAL",
                   "value": "]",
-                  "startPosition": "3915"
+                  "startPosition": "4064"
                 }
               ],
-              "startPosition": "3908"
+              "startPosition": "4057"
             },
-            "endPosition": "3918",
+            "endPosition": "4067",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3908"
+            "startPosition": "4057"
           }
         ],
-        "startPosition": "3635"
+        "startPosition": "3784"
       },
       "strict": "false",
-      "startPosition": "3619",
+      "startPosition": "3768",
       "parameters": []
     },
     {
       "expression": {
-        "endPosition": "3929",
+        "endPosition": "4078",
         "kind": "FUNCTION_INVOCATION",
         "functionSelect": {
-          "endPosition": "3927",
+          "endPosition": "4076",
           "kind": "IDENTIFIER",
           "name": "main",
-          "startPosition": "3923"
+          "startPosition": "4072"
         },
         "arguments": [],
-        "startPosition": "3923"
-      },
-      "endPosition": "3929",
+        "startPosition": "4072"
+      },
+      "endPosition": "4078",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "3923"
+      "startPosition": "4072"
     }
   ],
   "sourceName": "parserapi.js",
   "strict": "false",
   "startPosition": "1136"
-}
-]
+}
+]