changeset 39662:e2b36a3779b9

8149929: Nashorn Parser API needs to be updated for ES6 Reviewed-by: mhaupt, hannesw
author sundar
date Tue, 12 Jul 2016 21:18:13 +0530
parents 8e45018bde9d
children 7cb424af93f1
files nashorn/make/project.properties nashorn/samples/prettyprinter.js nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/NashornCompleter.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CatchTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CatchTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassDeclarationTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassDeclarationTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassExpressionTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassExpressionTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CompilationUnitTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CompilationUnitTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/DestructuringDeclTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ExportEntryTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ExportEntryTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForOfLoopTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForOfLoopTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionDeclarationTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionDeclarationTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionExpressionTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionExpressionTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IdentifierTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IdentifierTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ImportEntryTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ImportEntryTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ModuleTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ModuleTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/PropertyTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/PropertyTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SimpleTreeVisitorES5_1.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SimpleTreeVisitorES6.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SpreadTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SpreadTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TemplateLiteralTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TemplateLiteralTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Tree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TreeVisitor.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/VariableTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/VariableTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/YieldTree.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/YieldTreeImpl.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SplitIntoFunctions.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/ClassNode.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/ExpressionStatement.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/FunctionNode.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/TemplateLiteral.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/visitor/NodeVisitor.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextFunctionNode.java nashorn/test/script/basic/JDK-8075207.js nashorn/test/script/basic/JDK-8075448.js nashorn/test/script/basic/es6/let-const-switch.js.EXPECTED nashorn/test/script/nosecurity/parserapi.js nashorn/test/script/nosecurity/parserapi.js.EXPECTED nashorn/test/script/nosecurity/parservisitor.js nashorn/test/script/nosecurity/treeapi/arrow.js nashorn/test/script/nosecurity/treeapi/arrow.js.EXPECTED nashorn/test/script/nosecurity/treeapi/arrow_params.js nashorn/test/script/nosecurity/treeapi/arrow_params.js.EXPECTED nashorn/test/script/nosecurity/treeapi/assignment.js.EXPECTED nashorn/test/script/nosecurity/treeapi/class.js nashorn/test/script/nosecurity/treeapi/class.js.EXPECTED nashorn/test/script/nosecurity/treeapi/const.js nashorn/test/script/nosecurity/treeapi/const.js.EXPECTED nashorn/test/script/nosecurity/treeapi/defaultparams.js nashorn/test/script/nosecurity/treeapi/defaultparams.js.EXPECTED nashorn/test/script/nosecurity/treeapi/destructuring_assign.js nashorn/test/script/nosecurity/treeapi/destructuring_assign.js.EXPECTED nashorn/test/script/nosecurity/treeapi/destructuring_decl.js nashorn/test/script/nosecurity/treeapi/destructuring_decl.js.EXPECTED nashorn/test/script/nosecurity/treeapi/destructuring_params.js nashorn/test/script/nosecurity/treeapi/destructuring_params.js.EXPECTED nashorn/test/script/nosecurity/treeapi/functionCall.js.EXPECTED nashorn/test/script/nosecurity/treeapi/functionDeclaration.js.EXPECTED nashorn/test/script/nosecurity/treeapi/functionExpr.js.EXPECTED nashorn/test/script/nosecurity/treeapi/generator.js nashorn/test/script/nosecurity/treeapi/generator.js.EXPECTED nashorn/test/script/nosecurity/treeapi/let.js nashorn/test/script/nosecurity/treeapi/let.js.EXPECTED nashorn/test/script/nosecurity/treeapi/memberSelect.js.EXPECTED nashorn/test/script/nosecurity/treeapi/modules.js nashorn/test/script/nosecurity/treeapi/modules.js.EXPECTED nashorn/test/script/nosecurity/treeapi/new.js.EXPECTED nashorn/test/script/nosecurity/treeapi/objectLiteral.js.EXPECTED nashorn/test/script/nosecurity/treeapi/property.js.EXPECTED nashorn/test/script/nosecurity/treeapi/rest.js nashorn/test/script/nosecurity/treeapi/rest.js.EXPECTED nashorn/test/script/nosecurity/treeapi/return.js.EXPECTED nashorn/test/script/nosecurity/treeapi/spread.js nashorn/test/script/nosecurity/treeapi/spread.js.EXPECTED nashorn/test/script/nosecurity/treeapi/template_literal.js nashorn/test/script/nosecurity/treeapi/template_literal.js.EXPECTED nashorn/test/script/nosecurity/treeapi/utils.js nashorn/test/script/nosecurity/treeapi/variable.js.EXPECTED nashorn/test/script/nosecurity/treeapi/with.js.EXPECTED
diffstat 99 files changed, 7205 insertions(+), 882 deletions(-) [+]
line wrap: on
line diff
--- a/nashorn/make/project.properties	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/make/project.properties	Tue Jul 12 21:18:13 2016 +0530
@@ -35,7 +35,9 @@
 javac.source=1.9
 javac.target=1.9
 
-javadoc.option=-tag "implSpec:a:Implementation Requirements:"
+javadoc.option=\
+    -tag "implSpec:a:Implementation Requirements:"\
+    -tag "implNote:a:Implementation Note:"
 
 # nashorn version information
 nashorn.version=0.1
--- a/nashorn/samples/prettyprinter.js	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/samples/prettyprinter.js	Tue Jul 12 21:18:13 2016 +0530
@@ -209,7 +209,7 @@
         }
         print("function ");
         if (func.name) {
-            print(func.name);
+            print(func.name.name);
         }
         printFunctionBody(func, extra, end);
         if (funcDecl) {
@@ -608,7 +608,7 @@
 
          visitVariable: function(node, extra) {
              indent();
-             print("var " + node.name);
+             print("var " + node.binding.name);
              var init = node.initializer;
              if (init) {
                  print(" = ");
--- a/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/NashornCompleter.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn.shell/share/classes/jdk/nashorn/tools/jjs/NashornCompleter.java	Tue Jul 12 21:18:13 2016 +0530
@@ -439,6 +439,10 @@
             args.add("-strict");
         }
 
+        if (env._es6) {
+            args.add("--language=es6");
+        }
+
         return Parser.create(args.toArray(new String[0]));
     }
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CatchTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CatchTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -38,11 +38,11 @@
  */
 public interface CatchTree extends Tree {
     /**
-     * Returns the catch parameter identifier of the exception caught.
+     * Returns the catch parameter identifier or parameter binding pattern of the exception caught.
      *
-     * @return the catch parameter identifier
+     * @return the catch parameter identifier or parameter binding pattern
      */
-    IdentifierTree getParameter();
+    ExpressionTree getParameter();
 
     /**
      * Returns the code block of this catch block.
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CatchTreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CatchTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -28,12 +28,12 @@
 import jdk.nashorn.internal.ir.CatchNode;
 
 final class CatchTreeImpl extends TreeImpl implements CatchTree {
-    private final IdentifierTree param;
+    private final ExpressionTree param;
     private final BlockTree block;
     private final ExpressionTree condition;
 
     CatchTreeImpl(final CatchNode node,
-            final IdentifierTree param,
+            final ExpressionTree param,
             final BlockTree block,
             final ExpressionTree condition) {
         super(node);
@@ -48,7 +48,7 @@
     }
 
     @Override
-    public IdentifierTree getParameter() {
+    public ExpressionTree getParameter() {
         return param;
     }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassDeclarationTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,63 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+
+/**
+ * A tree node that represents a <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-class-definitions">class declaration</a>.
+ *
+ * @since 9
+ */
+public interface ClassDeclarationTree extends StatementTree {
+
+    /**
+     * Class identifier.
+     *
+     * @return the class identifier
+     */
+    IdentifierTree getName();
+
+    /**
+     * The expression of the {@code extends} clause. Optional.
+     *
+     * @return the class heritage
+     */
+    ExpressionTree getClassHeritage();
+
+    /**
+     * Get the constructor method definition.
+     *
+     * @return the constructor
+     */
+    PropertyTree getConstructor();
+
+    /**
+     * Get other property definitions except for the constructor.
+     *
+     * @return the class elements
+     */
+    List<? extends PropertyTree> getClassElements();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassDeclarationTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,77 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+import jdk.nashorn.internal.ir.VarNode;
+
+final class ClassDeclarationTreeImpl extends StatementTreeImpl implements ClassDeclarationTree {
+
+    private final IdentifierTree name;
+    private final ExpressionTree classHeritage;
+    private final PropertyTree constructor;
+    private final List<? extends PropertyTree> classElements;
+
+    ClassDeclarationTreeImpl(final VarNode node, final IdentifierTree name,
+            final ExpressionTree classHeritage, final PropertyTree constructor,
+            final List<? extends PropertyTree> classElements) {
+        super(node);
+        this.name = name;
+        this.classHeritage = classHeritage;
+        this.constructor = constructor;
+        this.classElements = classElements;
+    }
+
+    @Override
+    public Tree.Kind getKind() {
+        return Tree.Kind.CLASS;
+    }
+
+    @Override
+    public IdentifierTree getName() {
+        return name;
+    }
+
+    @Override
+    public ExpressionTree getClassHeritage() {
+        return classHeritage;
+    }
+
+    @Override
+    public PropertyTree getConstructor() {
+        return constructor;
+    }
+
+    @Override
+    public List<? extends PropertyTree> getClassElements() {
+        return classElements;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitClassDeclaration(this, data);
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassExpressionTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,63 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+
+/**
+ * A tree node that represents a <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-class-definitions">class expression</a>.
+ *
+ * @since 9
+ */
+public interface ClassExpressionTree extends ExpressionTree {
+    /**
+     * Class identifier. Optional.
+     *
+     * @return the class identifier
+     */
+    IdentifierTree getName();
+
+    /**
+     * The expression of the {@code extends} clause. Optional.
+     *
+     * @return the class heritage
+     */
+    ExpressionTree getClassHeritage();
+
+    /**
+     * Get the constructor method definition.
+     *
+     * @return the constructor
+     */
+    PropertyTree getConstructor();
+
+    /**
+     * Get other property definitions except for the constructor.
+     *
+     * @return the class elements
+     */
+    List<? extends PropertyTree> getClassElements();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ClassExpressionTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,76 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+import jdk.nashorn.internal.ir.ClassNode;
+
+final class ClassExpressionTreeImpl extends ExpressionTreeImpl implements ClassExpressionTree {
+
+    private final IdentifierTree name;
+    private final ExpressionTree classHeritage;
+    private final PropertyTree constructor;
+    private final List<? extends PropertyTree> classElements;
+
+    ClassExpressionTreeImpl(final ClassNode cn, final IdentifierTree name,
+            final ExpressionTree classHeritage, final PropertyTree constructor,
+            final List<? extends PropertyTree> classElements) {
+        super(cn);
+        this.name = name;
+        this.classHeritage = classHeritage;
+        this.constructor = constructor;
+        this.classElements = classElements;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.CLASS_EXPRESSION;
+    }
+
+    @Override
+    public IdentifierTree getName() {
+        return name;
+    }
+
+    @Override
+    public ExpressionTree getClassHeritage() {
+        return classHeritage;
+    }
+
+    @Override
+    public PropertyTree getConstructor() {
+        return constructor;
+    }
+
+    @Override
+    public List<? extends PropertyTree> getClassElements() {
+        return classElements;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitClassExpression(this, data);
+    }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CompilationUnitTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CompilationUnitTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -62,4 +62,12 @@
      * @return the line map for this compilation unit
      */
     LineMap getLineMap();
+
+    /**
+     * Return the {@link ModuleTree} associated with this compilation unit. This is null,
+     * if there is no module information from this compilation unit.
+     *
+     * @return the Module info or null
+     */
+    ModuleTree getModule();
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CompilationUnitTreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/CompilationUnitTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -32,13 +32,18 @@
     implements CompilationUnitTree {
     private final FunctionNode funcNode;
     private final List<? extends Tree> elements;
+    private final ModuleTree module;
 
     CompilationUnitTreeImpl(final FunctionNode node,
-            final List<? extends Tree> elements) {
+            final List<? extends Tree> elements,
+            final ModuleTree module) {
         super(node);
         this.funcNode = node;
-        assert funcNode.getKind() == FunctionNode.Kind.SCRIPT : "script function expected";
+        assert funcNode.getKind() == FunctionNode.Kind.SCRIPT ||
+                funcNode.getKind() == FunctionNode.Kind.MODULE :
+                "script or module function expected";
         this.elements = elements;
+        this.module = module;
     }
 
     @Override
@@ -67,6 +72,11 @@
     }
 
     @Override
+    public ModuleTree getModule() {
+        return module;
+    }
+
+    @Override
     public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
         return visitor.visitCompilationUnit(this, data);
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/DestructuringDeclTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,77 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+import jdk.nashorn.internal.ir.ExpressionStatement;
+import jdk.nashorn.internal.parser.TokenType;
+
+// This implementation of VariableTree represents a destructuring declaration
+final class DestructuringDeclTreeImpl extends StatementTreeImpl
+        implements VariableTree {
+
+    private final TokenType declType;
+    private final ExpressionTree lhs;
+    private final ExpressionTree init;
+
+    DestructuringDeclTreeImpl(ExpressionStatement exprStat, final ExpressionTree lhs, final ExpressionTree init) {
+        super(exprStat);
+        assert exprStat.destructuringDeclarationType() != null : "expecting a destructuring decl. statement";
+
+        this.declType = exprStat.destructuringDeclarationType();
+        this.lhs = lhs;
+        this.init = init;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.VARIABLE;
+    }
+
+    @Override
+    public ExpressionTree getBinding() {
+        return lhs;
+    }
+
+    @Override
+    public ExpressionTree getInitializer() {
+        return init;
+    }
+
+    @Override
+    public boolean isConst() {
+        return declType == TokenType.CONST;
+    }
+
+    @Override
+    public boolean isLet() {
+        return declType == TokenType.LET;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitVariable(this, data);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ExportEntryTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,60 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+
+/**
+ * A Tree node for export entry in <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-modules">Module information</a>.
+ */
+public interface ExportEntryTree extends Tree {
+    /**
+     * Returns the entry's export name.
+     *
+     * @return the export name
+     */
+    public IdentifierTree getExportName();
+
+    /**
+     * Returns the entry's module request.
+     *
+     * @return the module request
+     */
+    public IdentifierTree getModuleRequest();
+
+    /**
+     * Returns the entry's import name.
+     *
+     * @return the import name
+     */
+    public IdentifierTree getImportName();
+
+    /**
+     * Returns the entry's local name.
+     *
+     * @return the local name
+     */
+    public IdentifierTree getLocalName();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ExportEntryTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,109 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import jdk.nashorn.internal.ir.FunctionNode;
+import jdk.nashorn.internal.ir.IdentNode;
+import jdk.nashorn.internal.ir.Module;
+import static jdk.nashorn.api.tree.ModuleTreeImpl.identOrNull;
+
+final class ExportEntryTreeImpl extends TreeImpl implements ExportEntryTree {
+    private final long startPos, endPos;
+    private final IdentifierTree exportName;
+    private final IdentifierTree moduleRequest;
+    private final IdentifierTree importName;
+    private final IdentifierTree localName;
+
+    private ExportEntryTreeImpl(final long startPos, final long endPos,
+            IdentifierTree exportName,
+            IdentifierTree moduleRequest,
+            IdentifierTree importName,
+            IdentifierTree localName) {
+        super(null); // no underlying Node!
+        this.startPos = startPos;
+        this.endPos = endPos;
+        this.exportName = exportName;
+        this.moduleRequest = moduleRequest;
+        this.importName = importName;
+        this.localName = localName;
+    }
+
+    private static ExportEntryTreeImpl createExportEntry(Module.ExportEntry entry) {
+        return new ExportEntryTreeImpl(entry.getStartPosition(),
+                entry.getEndPosition(),
+                identOrNull(entry.getExportName()),
+                identOrNull(entry.getModuleRequest()),
+                identOrNull(entry.getImportName()),
+                identOrNull(entry.getLocalName()));
+    }
+
+    static List<ExportEntryTreeImpl> createExportList(List<Module.ExportEntry> exportList) {
+        return exportList.stream().
+            map(ExportEntryTreeImpl::createExportEntry).
+            collect(Collectors.toList());
+    }
+
+    @Override
+    public Kind getKind() {
+        return Tree.Kind.EXPORT_ENTRY;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitExportEntry(this, data);
+    }
+
+    @Override
+    public long getStartPosition() {
+        return startPos;
+    }
+
+    @Override
+    public long getEndPosition() {
+        return endPos;
+    }
+
+    @Override
+    public IdentifierTree getExportName() {
+        return exportName;
+    }
+
+    @Override
+    public IdentifierTree getModuleRequest() {
+        return moduleRequest;
+    }
+
+    @Override
+    public IdentifierTree getImportName() {
+        return importName;
+    }
+
+    @Override
+    public IdentifierTree getLocalName() {
+        return localName;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForOfLoopTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,62 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+/**
+ * A tree node for <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-for-in-and-for-of-statements">for..of statement</a>.
+ *
+ * For example:
+ * <pre>
+ *   for ( <em>variable</em> of <em>expression</em> )
+ *       <em>statement</em>
+ * </pre>
+ *
+ * @since 9
+ */
+public interface ForOfLoopTree extends LoopTree {
+    /**
+     * The for..in left hand side expression.
+     *
+     * @return the left hand side expression
+     */
+    ExpressionTree getVariable();
+
+    /**
+     * The object or array being whose properties are iterated.
+     *
+     * @return the object or array expression being iterated
+     */
+    ExpressionTree getExpression();
+
+    /**
+     * The statement contained in this for..in statement.
+     *
+     * @return the statement
+     */
+    @Override
+    StatementTree getStatement();
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ForOfLoopTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,69 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import jdk.nashorn.internal.ir.ForNode;
+
+final class ForOfLoopTreeImpl extends StatementTreeImpl implements ForOfLoopTree {
+    private final ExpressionTree lhsExpr;
+    private final ExpressionTree expr;
+    private final StatementTree stat;
+
+    ForOfLoopTreeImpl(final ForNode node,
+            final ExpressionTree lhsExpr,
+            final ExpressionTree expr,
+            final StatementTree stat) {
+        super(node);
+        assert node.isForIn() : "for ..in expected";
+        this.lhsExpr = lhsExpr;
+        this.expr = expr;
+        this.stat = stat;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.FOR_IN_LOOP;
+    }
+
+    @Override
+    public ExpressionTree getVariable() {
+        return lhsExpr;
+    }
+
+    @Override
+    public ExpressionTree getExpression() {
+        return expr;
+    }
+
+    @Override
+    public StatementTree getStatement() {
+        return stat;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitForOfLoop(this, data);
+    }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionDeclarationTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionDeclarationTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -28,7 +28,7 @@
 import java.util.List;
 
 /**
- * A tree node for a function declaration.
+ * A tree node for a <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-function-definitions">function declaration</a>.
  *
  * For example:
  * <pre>
@@ -37,6 +37,12 @@
  *      <em>body</em>
  * </pre>
  *
+ * <pre>
+ *   <em>function*</em> <em>name</em>
+ *      ( <em>parameters</em> )
+ *      <em>body</em>
+ * </pre>
+ *
  * @since 9
  */
 public interface FunctionDeclarationTree extends StatementTree {
@@ -45,7 +51,7 @@
      *
      * @return name the function declared
      */
-    String getName();
+    IdentifierTree getName();
 
     /**
      * Returns the parameters of this function.
@@ -67,4 +73,11 @@
      * @return true if this function is strict
      */
     boolean isStrict();
+
+    /**
+     * Is this a generator function?
+     *
+     * @return true if this is a generator function
+     */
+    boolean isGenerator();
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionDeclarationTreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionDeclarationTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -32,7 +32,7 @@
 final class FunctionDeclarationTreeImpl extends StatementTreeImpl
     implements FunctionDeclarationTree {
     private final FunctionNode funcNode;
-    private final String funcName;
+    private final IdentifierTree funcName;
     private final List<? extends ExpressionTree> params;
     private final BlockTree body;
 
@@ -43,7 +43,7 @@
         assert node.getInit() instanceof FunctionNode : "function expected";
         funcNode = (FunctionNode)node.getInit();
         assert funcNode.isDeclared() : "function declaration expected";
-        funcName = funcNode.isAnonymous()? null : node.getName().getName();
+        funcName = funcNode.isAnonymous()? null : new IdentifierTreeImpl(node.getName());
         this.params = params;
         this.body = body;
     }
@@ -54,7 +54,7 @@
     }
 
     @Override
-    public String getName() {
+    public IdentifierTree getName() {
         return funcName;
     }
 
@@ -74,6 +74,11 @@
     }
 
     @Override
+    public boolean isGenerator() {
+        return funcNode.getKind() == FunctionNode.Kind.GENERATOR;
+    }
+
+    @Override
     public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
         return visitor.visitFunctionDeclaration(this, data);
     }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionExpressionTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionExpressionTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -28,7 +28,7 @@
 import java.util.List;
 
 /**
- * A tree node for a function expression.
+ * A tree node for <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-function-defining-expressions">function expressions</a> including <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions">arrow functions</a>.
  *
  * For example:
  * <pre>
@@ -37,6 +37,10 @@
  *      <em>body</em>
  * </pre>
  *
+ * <pre>
+ *   <em>var</em> func = <em>(x) =&gt; x+1</em>
+ * </pre>
+ *
  * @since 9
  */
 public interface FunctionExpressionTree extends ExpressionTree {
@@ -45,7 +49,7 @@
      *
      * @return name the function declared
      */
-    String getName();
+    IdentifierTree getName();
 
     /**
      * Returns the parameters of this function.
@@ -55,11 +59,13 @@
     List<? extends ExpressionTree> getParameters();
 
     /**
-     * Returns the body of code of this function.
+     * Returns the body of this function. This may be a {@link BlockTree} when this
+     * function has a block body. This is an {@link ExpressionTree} when the function body
+     * is a concise expression as in an expression arrow, or in an expression closure.
      *
-     * @return the body of code
+     * @return the body of this function
      */
-    BlockTree getBody();
+    Tree getBody();
 
     /**
      * Is this a strict function?
@@ -67,4 +73,18 @@
      * @return true if this function is strict
      */
     boolean isStrict();
+
+    /**
+     * Is this a arrow function?
+     *
+     * @return true if this is a arrow function
+     */
+    boolean isArrow();
+
+    /**
+     * Is this a generator function?
+     *
+     * @return true if this is a generator function
+     */
+    boolean isGenerator();
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionExpressionTreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/FunctionExpressionTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -31,9 +31,9 @@
 final class FunctionExpressionTreeImpl extends ExpressionTreeImpl
     implements FunctionExpressionTree {
     private final FunctionNode funcNode;
-    private final String funcName;
+    private final IdentifierTree funcName;
     private final List<? extends ExpressionTree> params;
-    private final BlockTree body;
+    private final Tree body;
 
     FunctionExpressionTreeImpl(final FunctionNode node,
             final List<? extends ExpressionTree> params,
@@ -46,11 +46,17 @@
         if (node.isAnonymous() || kind == FunctionNode.Kind.GETTER || kind == FunctionNode.Kind.SETTER) {
             funcName = null;
         } else {
-            funcName = node.getIdent().getName();
+            funcName = new IdentifierTreeImpl(node.getIdent());
         }
 
         this.params = params;
-        this.body = body;
+        if (node.getFlag(FunctionNode.HAS_EXPRESSION_BODY)) {
+            StatementTree first = body.getStatements().get(0);
+            assert first instanceof ReturnTree : "consise func. expression should have a return statement";
+            this.body = ((ReturnTree)first).getExpression();
+        } else {
+            this.body = body;
+        }
     }
 
     @Override
@@ -59,7 +65,7 @@
     }
 
     @Override
-    public String getName() {
+    public IdentifierTree getName() {
         return funcName;
     }
 
@@ -69,7 +75,7 @@
     }
 
     @Override
-    public BlockTree getBody() {
+    public Tree getBody() {
         return body;
     }
 
@@ -79,6 +85,16 @@
     }
 
     @Override
+    public boolean isArrow() {
+        return funcNode.getKind() == FunctionNode.Kind.ARROW;
+    }
+
+    @Override
+    public boolean isGenerator() {
+        return funcNode.getKind() == FunctionNode.Kind.GENERATOR;
+    }
+
+    @Override
     public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
         return visitor.visitFunctionExpression(this, data);
     }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IRTranslator.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -27,6 +27,7 @@
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import jdk.nashorn.internal.ir.AccessNode;
 import jdk.nashorn.internal.ir.BinaryNode;
 import jdk.nashorn.internal.ir.Block;
@@ -35,6 +36,7 @@
 import jdk.nashorn.internal.ir.CallNode;
 import jdk.nashorn.internal.ir.CaseNode;
 import jdk.nashorn.internal.ir.CatchNode;
+import jdk.nashorn.internal.ir.ClassNode;
 import jdk.nashorn.internal.ir.ContinueNode;
 import jdk.nashorn.internal.ir.DebuggerNode;
 import jdk.nashorn.internal.ir.EmptyNode;
@@ -56,6 +58,7 @@
 import jdk.nashorn.internal.ir.SplitNode;
 import jdk.nashorn.internal.ir.Statement;
 import jdk.nashorn.internal.ir.SwitchNode;
+import jdk.nashorn.internal.ir.TemplateLiteral;
 import jdk.nashorn.internal.ir.TernaryNode;
 import jdk.nashorn.internal.ir.ThrowNode;
 import jdk.nashorn.internal.ir.TryNode;
@@ -87,11 +90,14 @@
             return null;
         }
 
-        assert (node.getKind() == FunctionNode.Kind.SCRIPT) : "script function expected";
+        assert node.getKind() == FunctionNode.Kind.SCRIPT ||
+                node.getKind() == FunctionNode.Kind.MODULE :
+                "script or module function expected";
 
         final Block body = node.getBody();
         return new CompilationUnitTreeImpl(node,
-                translateStats(body != null? getOrderedStatements(body.getStatements()) : null));
+                translateStats(body != null? getOrderedStatements(body.getStatements()) : null),
+                translateModule(node));
     }
 
     @Override
@@ -184,8 +190,15 @@
 
     @Override
     public boolean enterExpressionStatement(final ExpressionStatement expressionStatement) {
-        curStat = new ExpressionStatementTreeImpl(expressionStatement,
+        if (expressionStatement.destructuringDeclarationType() != null) {
+            ExpressionTree expr = translateExpr(expressionStatement.getExpression());
+            assert expr instanceof AssignmentTree : "destructuring decl. statement does not have assignment";
+            AssignmentTree assign = (AssignmentTree)expr;
+            curStat = new DestructuringDeclTreeImpl(expressionStatement, assign.getVariable(), assign.getExpression());
+        } else {
+            curStat = new ExpressionStatementTreeImpl(expressionStatement,
                 translateExpr(expressionStatement.getExpression()));
+        }
         return false;
     }
 
@@ -209,6 +222,11 @@
                     translateExpr(forNode.getInit()),
                     translateExpr(forNode.getModify()),
                     translateBlock(forNode.getBody()));
+        } else if (forNode.isForOf()) {
+            curStat = new ForOfLoopTreeImpl(forNode,
+                    translateExpr(forNode.getInit()),
+                    translateExpr(forNode.getModify()),
+                    translateBlock(forNode.getBody()));
         } else {
             curStat = new ForLoopTreeImpl(forNode,
                     translateExpr(forNode.getInit()),
@@ -224,8 +242,7 @@
     public boolean enterFunctionNode(final FunctionNode functionNode) {
         assert !functionNode.isDeclared() || functionNode.isAnonymous() : "should not reach here for function declaration";
 
-        final List<? extends ExpressionTree> paramTrees
-                    = translateExprs(functionNode.getParameters());
+        final List<? extends ExpressionTree> paramTrees = translateParameters(functionNode);
         final BlockTree blockTree = (BlockTree) translateBlock(functionNode.getBody(), true);
         curExpr = new FunctionExpressionTreeImpl(functionNode, paramTrees, blockTree);
 
@@ -291,14 +308,7 @@
     @Override
     public boolean enterObjectNode(final ObjectNode objectNode) {
         final List<PropertyNode> propNodes = objectNode.getElements();
-        final List<PropertyTreeImpl> propTrees = new ArrayList<>(propNodes.size());
-        for (final PropertyNode propNode : propNodes) {
-            propTrees.add(new PropertyTreeImpl(propNode,
-                    translateExpr(propNode.getKey()),
-                    translateExpr(propNode.getValue()),
-                    (FunctionExpressionTree) translateExpr(propNode.getGetter()),
-                    (FunctionExpressionTree) translateExpr(propNode.getSetter())));
-        }
+        final List<? extends PropertyTree> propTrees = translateProperties(propNodes);
         curExpr = new ObjectLiteralTreeImpl(objectNode, propTrees);
         return false;
     }
@@ -347,6 +357,12 @@
     }
 
     @Override
+    public boolean enterTemplateLiteral(final TemplateLiteral templateLiteral) {
+        curExpr = new TemplateLiteralTreeImpl(templateLiteral, translateExprs(templateLiteral.getExpressions()));
+        return false;
+    }
+
+    @Override
     public boolean enterTernaryNode(final TernaryNode ternaryNode) {
         curExpr = new ConditionalExpressionTreeImpl(ternaryNode,
                 translateExpr(ternaryNode.getTest()),
@@ -386,6 +402,14 @@
         if (unaryNode.isTokenType(TokenType.NEW)) {
             curExpr = new NewTreeImpl(unaryNode,
                     translateExpr(unaryNode.getExpression()));
+        } else if (unaryNode.isTokenType(TokenType.YIELD) ||
+                unaryNode.isTokenType(TokenType.YIELD_STAR)) {
+            curExpr = new YieldTreeImpl(unaryNode,
+                    translateExpr(unaryNode.getExpression()));
+        } else if (unaryNode.isTokenType(TokenType.SPREAD_ARGUMENT) ||
+                unaryNode.isTokenType(TokenType.SPREAD_ARRAY)) {
+            curExpr = new SpreadTreeImpl(unaryNode,
+                    translateExpr(unaryNode.getExpression()));
         } else {
             curExpr = new UnaryTreeImpl(unaryNode,
                     translateExpr(unaryNode.getExpression()));
@@ -399,12 +423,19 @@
         if (initNode instanceof FunctionNode && ((FunctionNode)initNode).isDeclared()) {
             final FunctionNode funcNode = (FunctionNode) initNode;
 
-            final List<? extends ExpressionTree> paramTrees
-                    = translateExprs(funcNode.getParameters());
+            final List<? extends ExpressionTree> paramTrees = translateParameters(funcNode);
             final BlockTree blockTree = (BlockTree) translateBlock(funcNode.getBody(), true);
             curStat = new FunctionDeclarationTreeImpl(varNode, paramTrees, blockTree);
+        } else if (initNode instanceof ClassNode && ((ClassNode)initNode).isStatement()) {
+            final ClassNode classNode = (ClassNode) initNode;
+
+            curStat = new ClassDeclarationTreeImpl(varNode,
+                    translateIdent(classNode.getIdent()),
+                    translateExpr(classNode.getClassHeritage()),
+                    translateProperty(classNode.getConstructor()),
+                    translateProperties(classNode.getClassElements()));
         } else {
-            curStat = new VariableTreeImpl(varNode, translateExpr(initNode));
+            curStat = new VariableTreeImpl(varNode, translateIdent(varNode.getName()), translateExpr(initNode));
         }
 
         return false;
@@ -433,6 +464,25 @@
         return false;
     }
 
+    /**
+     * Callback for entering a ClassNode
+     *
+     * @param  classNode  the node
+     * @return true if traversal should continue and node children be traversed, false otherwise
+     */
+    @Override
+    public boolean enterClassNode(final ClassNode classNode) {
+        assert !classNode.isStatement(): "should not reach here for class declaration";
+
+        curExpr = new ClassExpressionTreeImpl(classNode,
+            translateIdent(classNode.getIdent()),
+            translateExpr(classNode.getClassHeritage()),
+            translateProperty(classNode.getConstructor()),
+            translateProperties(classNode.getClassElements()));
+
+        return false;
+    }
+
     private StatementTree translateBlock(final Block blockNode) {
         return translateBlock(blockNode, false);
     }
@@ -493,6 +543,24 @@
         return statTrees;
     }
 
+    private List<? extends ExpressionTree> translateParameters(final FunctionNode func) {
+        Map<IdentNode, Expression> paramExprs = func.getParameterExpressions();
+        if (paramExprs != null) {
+            List<IdentNode> params = func.getParameters();
+            final List<ExpressionTreeImpl> exprTrees = new ArrayList<>(params.size());
+            for (final IdentNode ident : params) {
+                Expression expr = paramExprs.containsKey(ident)? paramExprs.get(ident) : ident;
+                curExpr = null;
+                expr.accept(this);
+                assert curExpr != null;
+                exprTrees.add(curExpr);
+            }
+            return exprTrees;
+        } else {
+            return translateExprs(func.getParameters());
+        }
+    }
+
     private List<? extends ExpressionTree> translateExprs(final List<? extends Expression> exprs) {
         if (exprs == null) {
             return null;
@@ -532,4 +600,25 @@
     private static IdentifierTree translateIdent(final IdentNode ident) {
         return new IdentifierTreeImpl(ident);
     }
+
+    private List<? extends PropertyTree> translateProperties(final List<PropertyNode> propNodes) {
+        final List<PropertyTree> propTrees = new ArrayList<>(propNodes.size());
+        for (final PropertyNode propNode : propNodes) {
+            propTrees.add(translateProperty(propNode));
+        }
+        return propTrees;
+    }
+
+    private PropertyTree translateProperty(final PropertyNode propNode) {
+        return new PropertyTreeImpl(propNode,
+                    translateExpr(propNode.getKey()),
+                    translateExpr(propNode.getValue()),
+                    (FunctionExpressionTree) translateExpr(propNode.getGetter()),
+                    (FunctionExpressionTree) translateExpr(propNode.getSetter()));
+    }
+
+    private ModuleTree translateModule(final FunctionNode func) {
+        return func.getKind() == FunctionNode.Kind.MODULE?
+            ModuleTreeImpl.create(func) : null;
+    }
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IdentifierTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IdentifierTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -42,4 +42,46 @@
      * @return the name of this identifier
      */
     String getName();
+
+    /**
+     * Is this a rest parameter for a function or rest elements of an array?
+     *
+     * @return true if this is a rest parameter
+     */
+    boolean isRestParameter();
+
+    /**
+     * Is this super identifier?
+     *
+     * @return true if this is super identifier
+     */
+    boolean isSuper();
+
+    /**
+     * Is this 'this' identifier?
+     *
+     * @return true if this is 'this' identifier
+     */
+    boolean isThis();
+
+    /**
+     * Is this "*" used in module export entry?
+     *
+     * @return true if this "*" used in module export entry?
+     */
+    boolean isStar();
+
+    /**
+     * Is this "default" used in module export entry?
+     *
+     * @return true if this 'default' used in module export entry?
+     */
+    boolean isDefault();
+
+    /**
+     * Is this "*default*" used in module export entry?
+     *
+     * @return true if this '*default*' used in module export entry?
+     */
+    boolean isStarDefaultStar();
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IdentifierTreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/IdentifierTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -27,6 +27,7 @@
 package jdk.nashorn.api.tree;
 
 import jdk.nashorn.internal.ir.IdentNode;
+import jdk.nashorn.internal.ir.Module;
 
 final class IdentifierTreeImpl extends ExpressionTreeImpl implements IdentifierTree {
     private final String name;
@@ -47,6 +48,37 @@
     }
 
     @Override
+    public boolean isRestParameter() {
+        return ((IdentNode)node).isRestParameter();
+    }
+
+    @Override
+    public boolean isSuper() {
+        final IdentNode ident = (IdentNode)node;
+        return ident.isDirectSuper() || "super".equals(ident.getName());
+    }
+
+    @Override
+    public boolean isThis() {
+        return "this".equals(((IdentNode)node).getName());
+    }
+
+    @Override
+    public boolean isStar() {
+        return Module.STAR_NAME.equals(((IdentNode)node).getName());
+    }
+
+    @Override
+    public boolean isDefault() {
+        return Module.DEFAULT_NAME.equals(((IdentNode)node).getName());
+    }
+
+    @Override
+    public boolean isStarDefaultStar() {
+        return Module.DEFAULT_EXPORT_BINDING_NAME.equals(((IdentNode)node).getName());
+    }
+
+    @Override
     public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
         return visitor.visitIdentifier(this, data);
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ImportEntryTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,53 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+
+/**
+ * A Tree node for import entry of <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-modules">Module information</a>.
+ */
+public interface ImportEntryTree extends Tree {
+    /**
+     * Returns the entry's module request.
+     *
+     * @return the module request
+     */
+    public IdentifierTree getModuleRequest();
+
+    /**
+     * Returns the entry's import name.
+     *
+     * @return the import name
+     */
+    public IdentifierTree getImportName();
+
+    /**
+     * Returns the entry's local name.
+     *
+     * @return the local name
+     */
+    public IdentifierTree getLocalName();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ImportEntryTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,100 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import jdk.nashorn.internal.ir.FunctionNode;
+import jdk.nashorn.internal.ir.IdentNode;
+import jdk.nashorn.internal.ir.Module;
+import static jdk.nashorn.api.tree.ModuleTreeImpl.identOrNull;
+
+final class ImportEntryTreeImpl extends TreeImpl implements ImportEntryTree {
+    private final long startPos, endPos;
+    private final IdentifierTree moduleRequest;
+    private final IdentifierTree importName;
+    private final IdentifierTree localName;
+
+    private ImportEntryTreeImpl(final long startPos, final long endPos,
+            IdentifierTree moduleRequest,
+            IdentifierTree importName,
+            IdentifierTree localName) {
+        super(null); // No underlying Node!
+        this.startPos = startPos;
+        this.endPos = endPos;
+        this.moduleRequest = moduleRequest;
+        this.importName = importName;
+        this.localName = localName;
+    }
+
+    private static ImportEntryTreeImpl createImportEntry(Module.ImportEntry entry) {
+        return new ImportEntryTreeImpl(entry.getStartPosition(),
+                entry.getEndPosition(),
+                identOrNull(entry.getModuleRequest()),
+                identOrNull(entry.getImportName()),
+                identOrNull(entry.getLocalName()));
+    }
+
+    static List<ImportEntryTreeImpl> createImportList(List<Module.ImportEntry> importList) {
+        return importList.stream().
+            map(ImportEntryTreeImpl::createImportEntry).
+            collect(Collectors.toList());
+    }
+
+    @Override
+    public Kind getKind() {
+        return Tree.Kind.IMPORT_ENTRY;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitImportEntry(this, data);
+    }
+
+    @Override
+    public long getStartPosition() {
+        return startPos;
+    }
+
+    @Override
+    public long getEndPosition() {
+        return endPos;
+    }
+
+    @Override
+    public IdentifierTree getModuleRequest() {
+        return moduleRequest;
+    }
+
+    @Override
+    public IdentifierTree getImportName() {
+        return importName;
+    }
+
+    @Override
+    public IdentifierTree getLocalName() {
+        return localName;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ModuleTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,60 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+
+/**
+ * A Tree node for <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-modules">Module information</a>.
+ */
+public interface ModuleTree extends Tree {
+    /**
+     * Returns the list of import entries.
+     *
+     * @return the import entries
+     */
+    public List<? extends ImportEntryTree> getImportEntries();
+
+    /**
+     * Returns the list of local export entries.
+     *
+     * @return the local export entries
+     */
+    public List<? extends ExportEntryTree> getLocalExportEntries();
+
+    /**
+     * Returns the list of indirect export entries.
+     *
+     * @return the indirect export entries
+     */
+    public List<? extends ExportEntryTree> getIndirectExportEntries();
+
+    /**
+     * Returns the list of star export entries.
+     *
+     * @return the star export entries
+     */
+    public List<? extends ExportEntryTree> getStarExportEntries();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ModuleTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,99 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import jdk.nashorn.internal.ir.FunctionNode;
+import jdk.nashorn.internal.ir.IdentNode;
+import jdk.nashorn.internal.ir.Module;
+import static jdk.nashorn.api.tree.ExportEntryTreeImpl.createExportList;
+import static jdk.nashorn.api.tree.ImportEntryTreeImpl.createImportList;
+
+final class ModuleTreeImpl extends TreeImpl implements ModuleTree {
+
+    private final Module mod;
+    private final List<? extends ImportEntryTree> imports;
+    private final List<? extends ExportEntryTree> localExports;
+    private final List<? extends ExportEntryTree> indirectExports;
+    private final List<? extends ExportEntryTree> starExports;
+
+    private ModuleTreeImpl(final FunctionNode func,
+            final List<? extends ImportEntryTree> imports,
+            final List<? extends ExportEntryTree> localExports,
+            final List<? extends ExportEntryTree> indirectExports,
+            final List<? extends ExportEntryTree> starExports) {
+        super(func);
+        assert func.getKind() == FunctionNode.Kind.MODULE : "module function node expected";
+        this.mod = func.getModule();
+        this.imports = imports;
+        this.localExports = localExports;
+        this.indirectExports = indirectExports;
+        this.starExports = starExports;
+    }
+
+    static ModuleTreeImpl create(final FunctionNode func) {
+        final Module mod = func.getModule();
+        return new ModuleTreeImpl(func,
+            createImportList(mod.getImportEntries()),
+            createExportList(mod.getLocalExportEntries()),
+            createExportList(mod.getIndirectExportEntries()),
+            createExportList(mod.getStarExportEntries()));
+    }
+
+    @Override
+    public Kind getKind() {
+        return Tree.Kind.MODULE;
+    }
+
+    @Override
+    public List<? extends ImportEntryTree> getImportEntries() {
+        return imports;
+    }
+
+    @Override
+    public List<? extends ExportEntryTree> getLocalExportEntries() {
+        return localExports;
+    }
+
+    @Override
+    public List<? extends ExportEntryTree> getIndirectExportEntries() {
+        return indirectExports;
+    }
+
+    @Override
+    public List<? extends ExportEntryTree> getStarExportEntries() {
+        return starExports;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitModule(this, data);
+    }
+
+    static IdentifierTree identOrNull(final IdentNode node) {
+        return node != null? new IdentifierTreeImpl(node) : null;
+    }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Parser.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -130,6 +130,8 @@
      * <dt>"--no-syntax-extensions" or "-nse"</dt><dd>disable ECMAScript syntax extensions</dd>
      * <dt>"-scripting"</dt><dd>enable scripting mode extensions</dd>
      * <dt>"-strict"</dt><dd>enable ECMAScript strict mode</dd>
+     * <dt>"--language=es6"</dt><dd>enable ECMAScript 6 parsing mode</dd>
+     * <dt>"--es6-module"</dt><dd>enable ECMAScript 6 module parsing mode. This option implies --language=es6</dd>
      * </dl>
      *
      * @throws NullPointerException if options array or any of its element is null
@@ -148,6 +150,8 @@
                 case "-nse":
                 case "-scripting":
                 case "-strict":
+                case "--language=es6":
+                case "--es6-module":
                     break;
                 default:
                     throw new IllegalArgumentException(opt);
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/ParserImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -22,7 +22,6 @@
  * or visit www.oracle.com if you need additional information or have any
  * questions.
  */
-
 package jdk.nashorn.api.tree;
 
 import java.io.File;
@@ -31,6 +30,7 @@
 import java.io.Reader;
 import java.net.URL;
 import java.nio.file.Path;
+import java.util.Arrays;
 import java.util.Map;
 import java.util.Objects;
 import jdk.nashorn.api.scripting.NashornException;
@@ -47,51 +47,94 @@
 final class ParserImpl implements Parser {
 
     private final ScriptEnvironment env;
+    private final boolean moduleMode;
 
     ParserImpl(final String... args) throws IllegalArgumentException {
-       Objects.requireNonNull(args);
-       Options options = new Options("nashorn");
-       options.process(args);
-       this.env = new ScriptEnvironment(options,
-               new PrintWriter(System.out), new PrintWriter(System.err));
+        Objects.requireNonNull(args);
+
+        // handle the parser specific "--es6-module" option
+        boolean seenModuleOption = false;
+        for (int idx = 0; idx < args.length; idx++) {
+            final String opt = args[idx];
+            if (opt.equals("--es6-module")) {
+                seenModuleOption = true;
+                /*
+                 * Nashorn parser does not understand parser API specific
+                 * option. This option implies --language=es6. So, we change
+                 * the option to --language=es6. Note that if user specified
+                 * --language=es6 explicitly, that is okay. Nashorn tolerates
+                 * repeated options!
+                 */
+                args[idx] = "--language=es6";
+                break;
+            }
+        }
+        this.moduleMode = seenModuleOption;
+
+        // append "--parse-only to signal to the Nashorn that it
+        // is being used in "parse only" mode.
+        String[] newArgs = Arrays.copyOf(args, args.length + 1, String[].class);
+        newArgs[args.length] = "--parse-only";
+        Options options = new Options("nashorn");
+        options.process(newArgs);
+        this.env = new ScriptEnvironment(options,
+                new PrintWriter(System.out), new PrintWriter(System.err));
     }
 
     @Override
     public CompilationUnitTree parse(final File file, final DiagnosticListener listener) throws IOException, NashornException {
+        if (moduleMode) {
+            return parseModule(file, listener);
+        }
         final Source src = Source.sourceFor(Objects.requireNonNull(file).getName(), file);
         return translate(makeParser(src, listener).parse());
     }
 
     @Override
     public CompilationUnitTree parse(final Path path, final DiagnosticListener listener) throws IOException, NashornException {
+        if (moduleMode) {
+            return parseModule(path, listener);
+        }
         final Source src = Source.sourceFor(Objects.requireNonNull(path).toString(), path);
         return translate(makeParser(src, listener).parse());
     }
 
     @Override
     public CompilationUnitTree parse(final URL url, final DiagnosticListener listener) throws IOException, NashornException {
+        if (moduleMode) {
+            return parseModule(url, listener);
+        }
         final Source src = Source.sourceFor(url.toString(), url);
         return translate(makeParser(src, listener).parse());
     }
 
     @Override
     public CompilationUnitTree parse(final String name, final Reader reader, final DiagnosticListener listener) throws IOException, NashornException {
+        if (moduleMode) {
+            return parseModule(name, reader, listener);
+        }
         final Source src = Source.sourceFor(Objects.requireNonNull(name), Objects.requireNonNull(reader));
         return translate(makeParser(src, listener).parse());
     }
 
     @Override
     public CompilationUnitTree parse(final String name, final String code, final DiagnosticListener listener) throws NashornException {
+        if (moduleMode) {
+            return parseModule(name, code, listener);
+        }
         final Source src = Source.sourceFor(name, code);
         return translate(makeParser(src, listener).parse());
     }
 
     @Override
     public CompilationUnitTree parse(final ScriptObjectMirror scriptObj, final DiagnosticListener listener) throws NashornException {
-        final Map<?,?> map = Objects.requireNonNull(scriptObj);
+        if (moduleMode) {
+            return parseModule(scriptObj, listener);
+        }
+        final Map<?, ?> map = Objects.requireNonNull(scriptObj);
         if (map.containsKey("script") && map.containsKey("name")) {
             final String script = JSType.toString(map.get("script"));
-            final String name   = JSType.toString(map.get("name"));
+            final String name = JSType.toString(map.get("name"));
             final Source src = Source.sourceFor(name, script);
             return translate(makeParser(src, listener).parse());
         } else {
@@ -99,12 +142,55 @@
         }
     }
 
+    private CompilationUnitTree parseModule(File file, DiagnosticListener listener) throws IOException, NashornException {
+        final Source src = Source.sourceFor(Objects.requireNonNull(file).getName(), file);
+        return makeModule(src, listener);
+    }
+
+    private CompilationUnitTree parseModule(Path path, DiagnosticListener listener) throws IOException, NashornException {
+        final Source src = Source.sourceFor(Objects.requireNonNull(path).toString(), path);
+        return makeModule(src, listener);
+    }
+
+    private CompilationUnitTree parseModule(URL url, DiagnosticListener listener) throws IOException, NashornException {
+        final Source src = Source.sourceFor(url.toString(), url);
+        return makeModule(src, listener);
+    }
+
+    private CompilationUnitTree parseModule(String name, Reader reader, DiagnosticListener listener) throws IOException, NashornException {
+        final Source src = Source.sourceFor(Objects.requireNonNull(name), Objects.requireNonNull(reader));
+        return makeModule(src, listener);
+    }
+
+    private CompilationUnitTree parseModule(String name, String code, DiagnosticListener listener) throws NashornException {
+        final Source src = Source.sourceFor(name, code);
+        return makeModule(src, listener);
+    }
+
+    private CompilationUnitTree parseModule(ScriptObjectMirror scriptObj, DiagnosticListener listener) throws NashornException {
+        final Map<?, ?> map = Objects.requireNonNull(scriptObj);
+        if (map.containsKey("script") && map.containsKey("name")) {
+            final String script = JSType.toString(map.get("script"));
+            final String name = JSType.toString(map.get("name"));
+            final Source src = Source.sourceFor(name, script);
+            return makeModule(src, listener);
+        } else {
+            throw new IllegalArgumentException("can't find 'script' and 'name' properties");
+        }
+    }
+
+    private CompilationUnitTree makeModule(Source src, DiagnosticListener listener) {
+        final FunctionNode modFunc = makeParser(src, listener).parseModule(src.getName());
+        return new IRTranslator().translate(modFunc);
+    }
+
     private jdk.nashorn.internal.parser.Parser makeParser(final Source source, final DiagnosticListener listener) {
-        final ErrorManager errMgr = listener != null? new ListenerErrorManager(listener) : new Context.ThrowErrorManager();
+        final ErrorManager errMgr = listener != null ? new ListenerErrorManager(listener) : new Context.ThrowErrorManager();
         return new jdk.nashorn.internal.parser.Parser(env, source, errMgr);
     }
 
     private static class ListenerErrorManager extends ErrorManager {
+
         private final DiagnosticListener listener;
 
         ListenerErrorManager(final DiagnosticListener listener) {
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/PropertyTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/PropertyTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -60,4 +60,18 @@
      * @return the getter function of the property
      */
     public FunctionExpressionTree getSetter();
+
+    /**
+     * Is this a class static property?
+     *
+     * @return true if this is a static property
+     */
+    public boolean isStatic();
+
+    /**
+     * Is this a computed property?
+     *
+     * @return true if this is a computed property
+     */
+    public boolean isComputed();
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/PropertyTreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/PropertyTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -32,6 +32,8 @@
     private final ExpressionTree value;
     private final FunctionExpressionTree getter;
     private final FunctionExpressionTree setter;
+    private final boolean isStatic, isComputed;
+
     PropertyTreeImpl(final PropertyNode node,
             final ExpressionTree key,
             final ExpressionTree value,
@@ -42,6 +44,8 @@
         this.value  = value;
         this.getter = getter;
         this.setter = setter;
+        this.isStatic = node.isStatic();
+        this.isComputed = node.isComputed();
     }
 
     @Override
@@ -70,6 +74,16 @@
     }
 
     @Override
+    public boolean isStatic() {
+        return isStatic;
+    }
+
+    @Override
+    public boolean isComputed() {
+        return isComputed;
+    }
+
+    @Override
     public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
         return visitor.visitProperty(this, data);
     }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/RegExpLiteralTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -30,7 +30,7 @@
  *
  * @since 9
  */
-public interface RegExpLiteralTree extends Tree {
+public interface RegExpLiteralTree extends ExpressionTree {
     /**
      * Regular expression pattern to match.
      *
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SimpleTreeVisitorES5_1.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SimpleTreeVisitorES5_1.java	Tue Jul 12 21:18:13 2016 +0530
@@ -61,6 +61,45 @@
         return null;
     }
 
+    /**
+     * Visits a {@code ModuleTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitModule(ModuleTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
+    /**
+     * Visits an {@code ExportEntryTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitExportEntry(ExportEntryTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
+    /**
+     * Visits an {@code ImportEntryTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitImportEntry(ImportEntryTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
     @Override
     public R visitBinary(final BinaryTree node, final P r) {
         node.getLeftOperand().accept(this, r);
@@ -105,6 +144,32 @@
         return null;
     }
 
+    /**
+     * Visits a {@code ClassDeclarationTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitClassDeclaration(ClassDeclarationTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
+    /**
+     * Visits a {@code ClassExpressionTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitClassExpression(ClassExpressionTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
     @Override
     public R visitConditionalExpression(final ConditionalExpressionTree node, final P r) {
         node.getCondition().accept(this, r);
@@ -173,6 +238,19 @@
         return null;
     }
 
+    /**
+     * Visits a {@code ForOfLoopTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitForOfLoop(ForOfLoopTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
     @Override
     public R visitFunctionCall(final FunctionCallTree node, final P r) {
         node.getFunctionSelect().accept(this, r);
@@ -305,11 +383,37 @@
         return null;
     }
 
+    /**
+     * Visits a {@code TemplateLiteralTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitTemplateLiteral(TemplateLiteralTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
     @Override
     public R visitEmptyStatement(final EmptyStatementTree node, final P r) {
         return null;
     }
 
+    /**
+     * Visits a {@code SpreadTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
+    @Override
+    public R visitSpread(SpreadTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
     @Override
     public R visitSwitch(final SwitchTree node, final P r) {
         node.getExpression().accept(this, r);
@@ -382,9 +486,36 @@
         return null;
     }
 
+    /**
+     * Visits a {@code YieldTree} tree by calling {@code
+     * visitUnknown}.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return the result of {@code visitUnknown}
+     */
     @Override
-    public R visitUnknown(final Tree node, final P r) {
+    public R visitYield(YieldTree node, P p) {
+        return visitUnknown(node, p);
+    }
+
+    /**
+     * {@inheritDoc}
+     *
+     * @implSpec The default implementation of this method in {@code
+     * SimpleTreeVisitorES5_1} will always throw {@code
+     * UnknownTypeException}. This behavior is not required of a
+     * subclass.
+     *
+     * @param node  {@inheritDoc}
+     * @param p  {@inheritDoc}
+     * @return abnormal return by throwing exception always
+     * @throws UnknownTreeException
+     *  a visitor implementation may optionally throw this exception
+     */
+    @Override
+    public R visitUnknown(final Tree node, final P p) {
         // unknown in ECMAScript 5.1 edition
-        throw new UnknownTreeException(node, r);
+        throw new UnknownTreeException(node, p);
     }
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SimpleTreeVisitorES6.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,226 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+
+/**
+ * A simple implementation of the TreeVisitor for ECMAScript edition 6.
+ *
+ * <p>The visit methods corresponding to ES 6 language constructs walk the
+ * "components" of the given tree by calling accept method passing the
+ * current visitor and the additional parameter.
+ *
+ * <p>For constructs introduced in later versions, {@code visitUnknown}
+ * is called instead which throws {@link UnknownTreeException}.
+ *
+ * <p> Methods in this class may be overridden subject to their
+ * general contract.  Note that annotating methods in concrete
+ * subclasses with {@link java.lang.Override @Override} will help
+ * ensure that methods are overridden as intended.
+ *
+ * @param <R> the return type of this visitor's methods.  Use {@link
+ *            Void} for visitors that do not need to return results.
+ * @param <P> the type of the additional parameter to this visitor's
+ *            methods.  Use {@code Void} for visitors that do not need an
+ *            additional parameter.
+ */
+public class SimpleTreeVisitorES6<R, P> extends SimpleTreeVisitorES5_1<R, P> {
+    @Override
+    public R visitCompilationUnit(final CompilationUnitTree node, final P r) {
+        final ModuleTree mod = node.getModule();
+        if (mod != null) {
+            mod.accept(this, r);
+        }
+        return super.visitCompilationUnit(node, r);
+    }
+
+    /**
+     * Visit Module tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    @Override
+    public R visitModule(ModuleTree node, P p) {
+        node.getImportEntries().forEach(e -> visitImportEntry(e, p));
+        node.getLocalExportEntries().forEach(e -> visitExportEntry(e, p));
+        node.getIndirectExportEntries().forEach(e -> visitExportEntry(e, p));
+        node.getStarExportEntries().forEach(e -> visitExportEntry(e, p));
+        return null;
+    }
+
+    /**
+     * Visit Module ExportEntry tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    @Override
+    public R visitExportEntry(ExportEntryTree node, P p) {
+        return null;
+    }
+
+    /**
+     * Visit Module ImportEntry tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    @Override
+    public R visitImportEntry(ImportEntryTree node, P p) {
+        return null;
+    }
+
+   /**
+    * Visit class statement tree.
+    *
+    * @param node node being visited
+    * @param p extra parameter passed to the visitor
+    * @return value from the visitor
+    */
+    @Override
+    public R visitClassDeclaration(ClassDeclarationTree node, P p) {
+        node.getName().accept(this, p);
+        final ExpressionTree heritage = node.getClassHeritage();
+        if (heritage != null) {
+            heritage.accept(this, p);
+        }
+        final PropertyTree constructor = node.getConstructor();
+        if (constructor != null) {
+            constructor.accept(this, p);
+        }
+        final List<? extends PropertyTree> elements = node.getClassElements();
+        if (elements != null) {
+            for (PropertyTree prop : elements) {
+                prop.accept(this, p);
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Visit class expression tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    @Override
+    public R visitClassExpression(ClassExpressionTree node, P p) {
+        node.getName().accept(this, p);
+        final ExpressionTree heritage = node.getClassHeritage();
+        if (heritage != null) {
+            heritage.accept(this, p);
+        }
+        final PropertyTree constructor = node.getConstructor();
+        if (constructor != null) {
+            constructor.accept(this, p);
+        }
+        final List<? extends PropertyTree> elements = node.getClassElements();
+        if (elements != null) {
+            for (PropertyTree prop : elements) {
+                prop.accept(this, p);
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Visit for..of statement tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    @Override
+    public R visitForOfLoop(final ForOfLoopTree node, final P p) {
+        node.getVariable().accept(this, p);
+        node.getExpression().accept(this, p);
+        final StatementTree stat = node.getStatement();
+        if (stat != null) {
+            stat.accept(this, p);
+        }
+        return null;
+    }
+
+    /**
+     * Visit 'yield' expression tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    @Override
+    public R visitYield(YieldTree node, P p) {
+        node.getExpression().accept(this, p);
+        return null;
+    }
+
+    /**
+     * Visit 'spread' expression tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    @Override
+    public R visitSpread(SpreadTree node, P p) {
+        node.getExpression().accept(this, p);
+        return null;
+    }
+
+   /**
+    * Visit template literal tree.
+    *
+    * @param node node being visited
+    * @param p extra parameter passed to the visitor
+    * @return value from the visitor
+    */
+    @Override
+    public R visitTemplateLiteral(TemplateLiteralTree node, P p) {
+        final List<? extends ExpressionTree> expressions = node.getExpressions();
+        for (ExpressionTree expr : expressions) {
+            expr.accept(this, p);
+        }
+        return null;
+    }
+
+    @Override
+    public R visitVariable(final VariableTree node, final P r) {
+        final ExpressionTree expr = node.getBinding();
+        if (expr != null) {
+            expr.accept(this, r);
+        }
+        super.visitVariable(node, r);
+        return null;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SpreadTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,38 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+/**
+ *  A tree node for spread operator in array elements, function call arguments.
+ */
+public interface SpreadTree extends ExpressionTree {
+    /**
+     * Returns the expression that is being spread.
+     *
+     * @return The expression that is being spread.
+     */
+    ExpressionTree getExpression();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/SpreadTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,53 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import jdk.nashorn.internal.ir.Expression;
+
+final class SpreadTreeImpl extends ExpressionTreeImpl
+        implements SpreadTree {
+
+    private final ExpressionTree expr;
+
+    SpreadTreeImpl(final Expression exprNode, final ExpressionTree expr) {
+        super(exprNode);
+        this.expr = expr;
+    }
+
+    @Override
+    public Tree.Kind getKind() {
+        return Tree.Kind.SPREAD;
+    }
+
+    @Override
+    public ExpressionTree getExpression() {
+        return expr;
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitSpread(this, data);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TemplateLiteralTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,48 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+
+/**
+ * A tree node for <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-template-literals">template literal strings</a>.
+ *
+ * For example:
+ * <pre>
+ * `This is a String with ${computed} values in it`
+ * </pre>
+ *
+ * @since 9
+ *
+ */
+public interface TemplateLiteralTree extends ExpressionTree {
+    /**
+     * Returns the list of expressions in this template string
+     *
+     * @return the list of expressions in this template string
+     */
+    List<? extends ExpressionTree> getExpressions();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TemplateLiteralTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,56 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+import java.util.List;
+import jdk.nashorn.internal.ir.Expression;
+
+final class TemplateLiteralTreeImpl extends ExpressionTreeImpl
+        implements TemplateLiteralTree {
+
+    private final List<? extends ExpressionTree> expressions;
+
+    TemplateLiteralTreeImpl(Expression node, List<? extends ExpressionTree> expressions) {
+        super(node);
+        this.expressions = expressions;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.TEMPLATE_LITERAL;
+    }
+
+    @Override
+    public List<? extends ExpressionTree> getExpressions() {
+        return expressions;
+    }
+
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitTemplateLiteral(this, data);
+    }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Tree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/Tree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -65,6 +65,16 @@
         BREAK(BreakTree.class),
 
         /**
+         * Used for instances of {@link ClassDeclarationTree}.
+         */
+        CLASS(ClassDeclarationTree.class),
+
+        /**
+         * Used for instances of {@link ClassExpressionTree}.
+         */
+        CLASS_EXPRESSION(ClassExpressionTree.class),
+
+        /**
          * Used for instances of {@link CaseTree}.
          */
         CASE(CaseTree.class),
@@ -150,6 +160,21 @@
         LABELED_STATEMENT(LabeledStatementTree.class),
 
         /**
+         * Used for instances of {@link ModuleTree}.
+         */
+        MODULE(ModuleTree.class),
+
+        /**
+         * Used for instances of {@link ExportEntryTree}.
+         */
+        EXPORT_ENTRY(ExportEntryTree.class),
+
+        /**
+         * Used for instances of {@link ImportEntryTree}.
+         */
+        IMPORT_ENTRY(ImportEntryTree.class),
+
+        /**
          * Used for instances of {@link FunctionDeclarationTree}.
          */
         FUNCTION(FunctionDeclarationTree.class),
@@ -185,6 +210,11 @@
         REGEXP_LITERAL(RegExpLiteralTree.class),
 
         /**
+         * Used for instances of {@link TemplateLiteralTree}.
+         */
+        TEMPLATE_LITERAL(TemplateLiteralTree.class),
+
+        /**
          * Used for instances of {@link ReturnTree}.
          */
         RETURN(ReturnTree.class),
@@ -286,7 +316,7 @@
 
         /**
          * Used for instances of {@link UnaryTree} representing logical
-         * void operator {@code typeof}.
+         * void operator {@code void}.
          */
         VOID(UnaryTree.class),
 
@@ -495,6 +525,18 @@
         OR_ASSIGNMENT(CompoundAssignmentTree.class),
 
         /**
+         * Used for instances of {@link SpreadTree} representing
+         * spread "operator" for arrays and function call arguments.
+         */
+        SPREAD(SpreadTree.class),
+
+        /**
+         * Used for instances of {@link YieldTree} representing (generator)
+         * yield expression {@code yield expr}.
+         */
+        YIELD(YieldTree.class),
+
+        /**
          * Used for instances of {@link LiteralTree} representing
          * a number literal expression of type {@code double}.
          */
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -137,10 +137,15 @@
                 return Kind.BITWISE_COMPLEMENT;
             case DELETE:
                 return Kind.DELETE;
+            case SPREAD_ARRAY:
+            case SPREAD_ARGUMENT:
+                return Kind.SPREAD;
             case TYPEOF:
                 return Kind.TYPEOF;
             case VOID:
                 return Kind.VOID;
+            case YIELD:
+                return Kind.YIELD;
             case IN:
                 return Kind.IN;
             case INSTANCEOF:
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TreeVisitor.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/TreeVisitor.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -118,6 +118,24 @@
     R visitCatch(CatchTree node, P p);
 
     /**
+     * Visit class statement tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitClassDeclaration(ClassDeclarationTree node, P p);
+
+    /**
+     * Visit class expression tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitClassExpression(ClassExpressionTree node, P p);
+
+    /**
      * Visit conditional expression tree.
      *
      * @param node node being visited
@@ -190,6 +208,15 @@
     R visitForInLoop(ForInLoopTree node, P p);
 
     /**
+     * Visit for..of statement tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitForOfLoop(ForOfLoopTree node, P p);
+
+    /**
      * Visit function call expression tree.
      *
      * @param node node being visited
@@ -216,7 +243,7 @@
      */
     R visitFunctionExpression(FunctionExpressionTree node, P p);
 
-        /**
+    /**
      * Visit identifier tree.
      *
      * @param node node being visited
@@ -334,6 +361,15 @@
     R visitRegExpLiteral(RegExpLiteralTree node, P p);
 
     /**
+     * Visit template literal tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitTemplateLiteral(TemplateLiteralTree node, P p);
+
+    /**
      * Visit an empty statement tree.
      *
      * @param node node being visited
@@ -343,6 +379,15 @@
     R visitEmptyStatement(EmptyStatementTree node, P p);
 
     /**
+     * Visit 'spread' expression tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitSpread(SpreadTree node, P p);
+
+    /**
      * Visit 'switch' statement tree.
      *
      * @param node node being visited
@@ -370,6 +415,33 @@
     R visitCompilationUnit(CompilationUnitTree node, P p);
 
     /**
+     * Visit Module tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitModule(ModuleTree node, P p);
+
+    /**
+     * Visit Module ExportEntry tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitExportEntry(ExportEntryTree node, P p);
+
+    /**
+     * Visit Module ImportEntry tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitImportEntry(ImportEntryTree node, P p);
+
+    /**
      * Visit 'try' statement tree.
      *
      * @param node node being visited
@@ -424,6 +496,15 @@
     R visitWith(WithTree node, P p);
 
     /**
+     * Visit 'yield' expression tree.
+     *
+     * @param node node being visited
+     * @param p extra parameter passed to the visitor
+     * @return value from the visitor
+     */
+    R visitYield(YieldTree node, P p);
+
+    /**
      * Visit unknown expression/statement tree. This fallback will be
      * called if new Tree subtypes are introduced in future. A specific
      * implementation may throw {{@linkplain UnknownTreeException unknown tree exception}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/VariableTree.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/VariableTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -26,22 +26,26 @@
 package jdk.nashorn.api.tree;
 
 /**
- * A tree node for a variable declaration.
+ * A tree node for a <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-variable-statement">variable declaration statement</a>.
  *
  * For example:
  * <pre>
- *   <em>var</em> <em>name</em> <em>initializer</em> ;
+ *   <em>var</em> <em>name</em> [ <em>initializer</em> ] ;
+ *   <em>var</em> <em>binding_pattern</em> [ <em>initializer</em> ];
  * </pre>
  *
  * @since 9
  */
 public interface VariableTree extends StatementTree {
     /**
-     * Returns the name of this variable.
+     * Returns the binding of this declaration. This is an {@link IdentifierTree}
+     * for a binding identifier case (simple variable declaration).
+     * This is an {@link ObjectLiteralTree} or a {@link ArrayLiteralTree} for a
+     * destructuring declaration.
      *
-     * @return the name of this variable
+     * @return the binding expression of this declaration
      */
-    String getName();
+    ExpressionTree getBinding();
 
     /**
      * Returns the initial value expression for this variable. This is
@@ -50,4 +54,18 @@
      * @return the initial value expression
      */
     ExpressionTree getInitializer();
+
+    /**
+     * Is this a const declaration?
+     *
+     * @return true if this is a const declaration
+     */
+    boolean isConst();
+
+    /**
+     * Is this a let declaration?
+     *
+     * @return true if this is a let declaration
+     */
+    boolean isLet();
 }
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/VariableTreeImpl.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/VariableTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * 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
@@ -28,12 +28,12 @@
 import jdk.nashorn.internal.ir.VarNode;
 
 final class VariableTreeImpl extends StatementTreeImpl implements VariableTree {
-    private final String name;
+    private final IdentifierTree ident;
     private final ExpressionTree init;
 
-    VariableTreeImpl(final VarNode node, final ExpressionTree init) {
+    VariableTreeImpl(final VarNode node, final IdentifierTree ident, final ExpressionTree init) {
         super(node);
-        this.name = node.getName().getName();
+        this.ident = ident;
         this.init = init;
     }
 
@@ -43,8 +43,8 @@
     }
 
     @Override
-    public String getName() {
-        return name;
+    public ExpressionTree getBinding() {
+        return ident;
     }
 
     @Override
@@ -53,6 +53,16 @@
     }
 
     @Override
+    public boolean isConst() {
+        return ((VarNode)node).isConst();
+    }
+
+    @Override
+    public boolean isLet() {
+        return ((VarNode)node).isLet();
+    }
+
+    @Override
     public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
         return visitor.visitVariable(this, data);
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/YieldTree.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,66 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.api.tree;
+
+/**
+ *  A tree node for <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-generator-function-definitions">yield expressions</a> used in generator functions.
+ *
+ * For example:
+ * <pre>
+ * <em>function*</em> id(){
+ *     var index = 0;
+ *     while(index &lt; 10)
+ *         <em>yield index++;</em>
+ * }
+ * </pre>
+ *
+ * @since 9
+ */
+public interface YieldTree extends ExpressionTree {
+    /**
+     * Returns the expression that is yielded.
+     *
+     * @return The expression that is yielded.
+     */
+    ExpressionTree getExpression();
+
+    /**
+     * Is this a yield * expression in a generator function?
+     *
+     * For example:
+     * <pre>
+     * function* id(){
+     *     yield 1;
+     *     <em>yield * anotherGeneratorFunc();</em>
+     *     yield 10;
+     * }
+     * </pre>
+     *
+     *
+     * @return true if this is a yield * expression
+     */
+    boolean isStar();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/api/tree/YieldTreeImpl.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,60 @@
+/*
+ * 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+package jdk.nashorn.api.tree;
+
+import jdk.nashorn.internal.ir.Expression;
+import jdk.nashorn.internal.ir.UnaryNode;
+import jdk.nashorn.internal.parser.TokenType;
+
+final class YieldTreeImpl extends ExpressionTreeImpl
+        implements YieldTree {
+
+    private final ExpressionTree expr;
+
+    YieldTreeImpl(final Expression exprNode, final ExpressionTree expr) {
+        super(exprNode);
+        this.expr = expr;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.YIELD;
+    }
+
+    @Override
+    public ExpressionTree getExpression() {
+        return expr;
+    }
+
+    @Override
+    public boolean isStar() {
+        return ((UnaryNode) node).isTokenType(TokenType.YIELD_STAR);
+    }
+
+    @Override
+    public <R,D> R accept(final TreeVisitor<R,D> visitor, final D data) {
+        return visitor.visitYield(this, data);
+    }
+}
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SplitIntoFunctions.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/SplitIntoFunctions.java	Tue Jul 12 21:18:13 2016 +0530
@@ -167,6 +167,7 @@
                 createIdent(name),
                 originalFn.getName() + "$" + name,
                 isProgram ? Collections.singletonList(createReturnParamIdent()) : Collections.<IdentNode>emptyList(),
+                null,
                 FunctionNode.Kind.NORMAL,
                 // We only need IS_SPLIT conservatively, in case it contains any array units so that we force
                 // the :callee's existence, to force :scope to never be in a slot lower than 2. This is actually
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/ClassNode.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/ClassNode.java	Tue Jul 12 21:18:13 2016 +0530
@@ -42,6 +42,7 @@
     private final PropertyNode constructor;
     private final List<PropertyNode> classElements;
     private final int line;
+    private final boolean isStatement;
 
     /**
      * Constructor.
@@ -53,15 +54,17 @@
      * @param classHeritage class heritage
      * @param constructor constructor
      * @param classElements class elements
+     * @param isStatement is this a statement or an expression?
      */
     public ClassNode(final int line, final long token, final int finish, final IdentNode ident, final Expression classHeritage, final PropertyNode constructor,
-                     final List<PropertyNode> classElements) {
+                     final List<PropertyNode> classElements, final boolean isStatement) {
         super(token, finish);
         this.line = line;
         this.ident = ident;
         this.classHeritage = classHeritage;
         this.constructor = constructor;
         this.classElements = classElements;
+        this.isStatement = isStatement;
     }
 
     /**
@@ -101,6 +104,15 @@
     }
 
     /**
+     * Returns if this class was a statement or an expression
+     *
+     * @return true if this class was a statement
+     */
+    public boolean isStatement() {
+        return isStatement;
+    }
+
+    /**
      * Returns the line number.
      *
      * @return the line number
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/ExpressionStatement.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/ExpressionStatement.java	Tue Jul 12 21:18:13 2016 +0530
@@ -27,6 +27,7 @@
 
 import jdk.nashorn.internal.ir.annotations.Immutable;
 import jdk.nashorn.internal.ir.visitor.NodeVisitor;
+import jdk.nashorn.internal.parser.TokenType;
 
 /**
  * IR representation for executing bare expressions. Basically, an expression
@@ -39,6 +40,23 @@
 
     /** Expression to execute. */
     private final Expression expression;
+    private final TokenType destructuringDecl;
+
+    /**
+     * Constructor
+     *
+     * @param lineNumber line number
+     * @param token      token
+     * @param finish     finish
+     * @param expression the expression to execute
+     * @param destructuringDecl does this statement represent a destructuring declaration?
+     */
+    public ExpressionStatement(final int lineNumber, final long token, final int finish,
+            final Expression expression, final TokenType destructuringDecl) {
+        super(lineNumber, token, finish);
+        this.expression = expression;
+        this.destructuringDecl = destructuringDecl;
+    }
 
     /**
      * Constructor
@@ -49,13 +67,13 @@
      * @param expression the expression to execute
      */
     public ExpressionStatement(final int lineNumber, final long token, final int finish, final Expression expression) {
-        super(lineNumber, token, finish);
-        this.expression = expression;
+        this(lineNumber, token, finish, expression, null);
     }
 
     private ExpressionStatement(final ExpressionStatement expressionStatement, final Expression expression) {
         super(expressionStatement);
         this.expression = expression;
+        this.destructuringDecl = null;
     }
 
     @Override
@@ -81,6 +99,15 @@
     }
 
     /**
+     * Return declaration type if this expression statement is a destructuring declaration
+     *
+     * @return declaration type (LET, VAR, CONST) if destructuring declaration, null otherwise.
+     */
+    public TokenType destructuringDeclarationType() {
+        return destructuringDecl;
+    }
+
+    /**
      * Reset the expression to be executed
      * @param expression the expression
      * @return new or same execute node
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/FunctionNode.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/FunctionNode.java	Tue Jul 12 21:18:13 2016 +0530
@@ -35,6 +35,7 @@
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import jdk.nashorn.internal.codegen.CompileUnit;
 import jdk.nashorn.internal.codegen.Compiler;
 import jdk.nashorn.internal.codegen.CompilerConstants;
@@ -106,6 +107,9 @@
     /** List of parameters. */
     private final List<IdentNode> parameters;
 
+    /** Map of ES6 function parameter expressions. */
+    private final Map<IdentNode, Expression> parameterExpressions;
+
     /** First token of function. **/
     private final long firstToken;
 
@@ -242,6 +246,9 @@
     /** Does this function use new.target? */
     public static final int ES6_USES_NEW_TARGET         = 1 << 25;
 
+    /** Does this function have expression as its body? */
+    public static final int HAS_EXPRESSION_BODY         = 1 << 26;
+
     /** Does this function or any nested functions contain an eval? */
     private static final int HAS_DEEP_EVAL = HAS_EVAL | HAS_NESTED_EVAL;
 
@@ -306,6 +313,7 @@
      * @param ident      the identifier
      * @param name       the name of the function
      * @param parameters parameter list
+     * @param paramExprs the ES6 function parameter expressions
      * @param kind       kind of function as in {@link FunctionNode.Kind}
      * @param flags      initial flags
      * @param body       body of the function
@@ -324,6 +332,7 @@
         final IdentNode ident,
         final String name,
         final List<IdentNode> parameters,
+        final Map<IdentNode, Expression> paramExprs,
         final FunctionNode.Kind kind,
         final int flags,
         final Block body,
@@ -338,6 +347,7 @@
         this.name             = name;
         this.kind             = kind;
         this.parameters       = parameters;
+        this.parameterExpressions = paramExprs;
         this.firstToken       = firstToken;
         this.lastToken        = lastToken;
         this.namespace        = namespace;
@@ -375,6 +385,7 @@
         this.lastToken        = lastToken;
         this.body             = body;
         this.parameters       = parameters;
+        this.parameterExpressions = functionNode.parameterExpressions;
         this.thisProperties   = thisProperties;
         this.rootClass        = rootClass;
         this.source           = source;
@@ -977,6 +988,15 @@
     }
 
     /**
+     * Get the ES6 style parameter expressions of this function. This may be null.
+     *
+     * @return a Map of parameter IdentNode to Expression node (for ES6 parameter expressions)
+     */
+    public Map<IdentNode, Expression> getParameterExpressions() {
+        return parameterExpressions;
+    }
+
+    /**
      * Return the number of parameters to this function
      * @return the number of parameters
      */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/TemplateLiteral.java	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2010, 2013, 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.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * 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.
+ */
+
+package jdk.nashorn.internal.ir;
+
+import java.util.Collections;
+import java.util.List;
+import jdk.nashorn.internal.codegen.types.Type;
+import jdk.nashorn.internal.ir.visitor.NodeVisitor;
+
+/**
+ * Represents ES6 template string expression. Note that this Node class is used
+ * only in "parse only" mode. In evaluation mode, Parser directly folds template
+ * literal as string concatenation. Parser API uses this node to represent ES6
+ * template literals "as is" rather than as a String concatenation.
+ */
+public final class TemplateLiteral extends Expression {
+    private static final long serialVersionUID = 1L;
+    private final List<Expression> exprs;
+
+    public TemplateLiteral(final List<Expression> exprs) {
+        super(exprs.get(0).getToken(), exprs.get(exprs.size() - 1).finish);
+        this.exprs = exprs;
+    }
+
+    @Override
+    public Type getType() {
+        return Type.STRING;
+    }
+
+    @Override
+    public Node accept(NodeVisitor<? extends LexicalContext> visitor) {
+        if (visitor.enterTemplateLiteral(this)) {
+            return visitor.leaveTemplateLiteral(this);
+        }
+
+        return this;
+    }
+
+    @Override
+    public void toString(StringBuilder sb, boolean printType) {
+        for (Expression expr : exprs) {
+            sb.append(expr);
+        }
+    }
+
+    /**
+     * The list of expressions that are part of this template literal.
+     *
+     * @return the list of expressions that are part of this template literal.
+     */
+    public List<Expression> getExpressions() {
+        return Collections.unmodifiableList(exprs);
+    }
+}
\ No newline at end of file
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/visitor/NodeVisitor.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/ir/visitor/NodeVisitor.java	Tue Jul 12 21:18:13 2016 +0530
@@ -59,6 +59,7 @@
 import jdk.nashorn.internal.ir.SplitNode;
 import jdk.nashorn.internal.ir.SplitReturn;
 import jdk.nashorn.internal.ir.SwitchNode;
+import jdk.nashorn.internal.ir.TemplateLiteral;
 import jdk.nashorn.internal.ir.TernaryNode;
 import jdk.nashorn.internal.ir.ThrowNode;
 import jdk.nashorn.internal.ir.TryNode;
@@ -738,6 +739,26 @@
     }
 
     /**
+     * Callback for entering a TemplateLiteral (used only in --parse-only mode)
+     *
+     * @param  templateLiteral the node
+     * @return true if traversal should continue and node children be traversed, false otherwise
+     */
+    public boolean enterTemplateLiteral(final TemplateLiteral templateLiteral) {
+        return enterDefault(templateLiteral);
+    }
+
+    /**
+     * Callback for leaving a TemplateLiteral (used only in --parse-only mode)
+     *
+     * @param  templateLiteral the node
+     * @return processed node, which will replace the original one, or the original node
+     */
+    public Node leaveTemplateLiteral(final TemplateLiteral templateLiteral) {
+        return leaveDefault(templateLiteral);
+    }
+
+    /**
      * Callback for entering a TernaryNode
      *
      * @param  ternaryNode the node
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java	Tue Jul 12 21:18:13 2016 +0530
@@ -127,6 +127,7 @@
 import jdk.nashorn.internal.ir.RuntimeNode;
 import jdk.nashorn.internal.ir.Statement;
 import jdk.nashorn.internal.ir.SwitchNode;
+import jdk.nashorn.internal.ir.TemplateLiteral;
 import jdk.nashorn.internal.ir.TernaryNode;
 import jdk.nashorn.internal.ir.ThrowNode;
 import jdk.nashorn.internal.ir.TryNode;
@@ -545,7 +546,7 @@
         sb.append(ident.getName());
 
         final String name = namespace.uniqueName(sb.toString());
-        assert parentFunction != null || name.equals(PROGRAM.symbolName()) : "name = " + name;
+        assert parentFunction != null || kind == FunctionNode.Kind.MODULE || name.equals(PROGRAM.symbolName()) : "name = " + name;
 
         int flags = 0;
         if (isStrictMode) {
@@ -575,6 +576,7 @@
                 ident,
                 function.getName(),
                 parameters,
+                function.getParameterExpressions(),
                 kind,
                 function.getFlags(),
                 body,
@@ -623,19 +625,6 @@
     }
 
     /**
-     * Get the statements in a case clause.
-     */
-    private List<Statement> caseStatementList() {
-        final ParserContextBlockNode newBlock = newBlock();
-        try {
-            statementList();
-        } finally {
-            restoreBlock(newBlock);
-        }
-        return newBlock.getStatements();
-    }
-
-    /**
      * Get all the statements generated by a single statement.
      * @return Statements.
      */
@@ -855,17 +844,6 @@
         });
     }
 
-    private static Expression newBinaryExpression(final long op, final Expression lhs, final Expression rhs) {
-        final TokenType opType = Token.descType(op);
-
-        // Build up node.
-        if (BinaryNode.isLogical(opType)) {
-            return new BinaryNode(op, new JoinPredecessorExpression(lhs), new JoinPredecessorExpression(rhs));
-        }
-        return new BinaryNode(op, lhs, rhs);
-    }
-
-
     /**
      * Reduce increment/decrement to simpler operations.
      * @param firstToken First token.
@@ -1268,7 +1246,7 @@
             className = getIdent();
         }
 
-        return classTail(classLineNumber, classToken, className);
+        return classTail(classLineNumber, classToken, className, isStatement);
     }
 
     private static final class ClassElementKey {
@@ -1317,7 +1295,8 @@
      *   static MethodDefinition[?Yield]
      *   ;
      */
-    private ClassNode classTail(final int classLineNumber, final long classToken, final IdentNode className) {
+    private ClassNode classTail(final int classLineNumber, final long classToken,
+            final IdentNode className, final boolean isStatement) {
         final boolean oldStrictMode = isStrictMode;
         isStrictMode = true;
         try {
@@ -1399,7 +1378,7 @@
             }
 
             classElements.trimToSize();
-            return new ClassNode(classLineNumber, classToken, finish, className, classHeritage, constructor, classElements);
+            return new ClassNode(classLineNumber, classToken, finish, className, classHeritage, constructor, classElements, isStatement);
         } finally {
             isStrictMode = oldStrictMode;
         }
@@ -1601,6 +1580,9 @@
     private List<Expression> variableDeclarationList(final TokenType varType, final boolean isStatement, final int sourceOrder) {
         // VAR tested in caller.
         assert varType == VAR || varType == LET || varType == CONST;
+        final int varLine = line;
+        final long varToken = token;
+
         next();
 
         final List<Expression> bindings = new ArrayList<>();
@@ -1613,9 +1595,6 @@
 
         Expression missingAssignment = null;
         while (true) {
-            // Get starting token.
-            final int  varLine  = line;
-            final long varToken = token;
             // Get name of var.
             if (type == YIELD && inGeneratorFunction()) {
                 expect(IDENT);
@@ -1627,10 +1606,14 @@
             if (isDestructuring) {
                 final int finalVarFlags = varFlags;
                 verifyDestructuringBindingPattern(binding, new Consumer<IdentNode>() {
+                    @Override
                     public void accept(final IdentNode identNode) {
                         verifyIdent(identNode, contextString);
-                        final VarNode var = new VarNode(varLine, varToken, sourceOrder, identNode.getFinish(), identNode.setIsDeclaredHere(), null, finalVarFlags);
-                        appendStatement(var);
+                        if (!env._parse_only) {
+                            // don't bother adding a variable if we are just parsing!
+                            final VarNode var = new VarNode(varLine, varToken, sourceOrder, identNode.getFinish(), identNode.setIsDeclaredHere(), null, finalVarFlags);
+                            appendStatement(var);
+                        }
                     }
                 });
             }
@@ -1682,7 +1665,7 @@
                 assert init != null || !isStatement;
                 binding = init == null ? binding : verifyAssignment(Token.recast(varToken, ASSIGN), binding, init);
                 if (isStatement) {
-                    appendStatement(new ExpressionStatement(varLine, binding.getToken(), finish, binding));
+                    appendStatement(new ExpressionStatement(varLine, binding.getToken(), finish, binding, varType));
                 } else if (init == null) {
                     if (missingAssignment == null) {
                         missingAssignment = binding;
@@ -1748,7 +1731,8 @@
      * Verify destructuring variable declaration binding pattern and extract bound variable declarations.
      */
     private void verifyDestructuringBindingPattern(final Expression pattern, final Consumer<IdentNode> identifierCallback) {
-        assert pattern instanceof ObjectNode || pattern instanceof LiteralNode.ArrayLiteralNode;
+        assert (pattern instanceof BinaryNode && ((BinaryNode)pattern).isTokenType(ASSIGN)) ||
+                pattern instanceof ObjectNode || pattern instanceof LiteralNode.ArrayLiteralNode;
         pattern.accept(new NodeVisitor<LexicalContext>(new LexicalContext()) {
             @Override
             public boolean enterLiteralNode(final LiteralNode<?> literalNode) {
@@ -1857,9 +1841,8 @@
         // Get expression and add as statement.
         final Expression expression = expression();
 
-        ExpressionStatement expressionStatement = null;
         if (expression != null) {
-            expressionStatement = new ExpressionStatement(expressionLine, expressionToken, finish, expression);
+            ExpressionStatement expressionStatement = new ExpressionStatement(expressionLine, expressionToken, finish, expression);
             appendStatement(expressionStatement);
         } else {
             expect(null);
@@ -2625,6 +2608,10 @@
                 final long catchToken = token;
                 next();
                 expect(LPAREN);
+
+                // FIXME: ES6 catch parameter can be a BindingIdentifier or a BindingPattern
+                // We need to generalize this here!
+                // http://www.ecma-international.org/ecma-262/6.0/
                 final IdentNode exception = getIdent();
 
                 // ECMA 12.4.1 strict mode restrictions
@@ -4021,12 +4008,18 @@
 
                     ParserContextFunctionNode currentFunction = lc.getCurrentFunction();
                     if (currentFunction != null) {
-                        // desugar to: param = (param === undefined) ? initializer : param;
-                        // possible alternative: if (param === undefined) param = initializer;
-                        BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
-                        TernaryNode value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
-                        BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), ident, value);
-                        lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                        if (env._parse_only) {
+                            // keep what is seen in source "as is" and save it as parameter expression
+                            BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), ident, initializer);
+                            currentFunction.addParameterExpression(ident, assignment);
+                        } else {
+                            // desugar to: param = (param === undefined) ? initializer : param;
+                            // possible alternative: if (param === undefined) param = initializer;
+                            BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
+                            TernaryNode value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
+                            BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), ident, value);
+                            lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                        }
                     }
                 }
 
@@ -4050,16 +4043,31 @@
 
                     // binding pattern with initializer. desugar to: (param === undefined) ? initializer : param
                     Expression initializer = assignmentExpression(false);
-                    // TODO initializer must not contain yield expression if yield=true (i.e. this is generator function's parameter list)
-                    BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
-                    value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
+
+                    if (env._parse_only) {
+                        // we don't want the synthetic identifier in parse only mode
+                        value = initializer;
+                    } else {
+                        // TODO initializer must not contain yield expression if yield=true (i.e. this is generator function's parameter list)
+                        BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
+                        value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
+                    }
                 }
 
                 ParserContextFunctionNode currentFunction = lc.getCurrentFunction();
                 if (currentFunction != null) {
                     // destructuring assignment
                     BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), pattern, value);
-                    lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                    if (env._parse_only) {
+                        // in parse-only mode, represent source tree "as is"
+                        if (ident.isDefaultParameter()) {
+                            currentFunction.addParameterExpression(ident, assignment);
+                        } else {
+                            currentFunction.addParameterExpression(ident, pattern);
+                        }
+                    } else {
+                        lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                    }
                 }
             }
             parameters.add(ident);
@@ -4077,7 +4085,9 @@
                 ParserContextFunctionNode currentFunction = lc.getCurrentFunction();
                 if (currentFunction != null) {
                     // declare function-scope variables for destructuring bindings
-                    lc.getFunctionBody(currentFunction).appendStatement(new VarNode(paramLine, Token.recast(paramToken, VAR), pattern.getFinish(), identNode, null));
+                    if (!env._parse_only) {
+                        lc.getFunctionBody(currentFunction).appendStatement(new VarNode(paramLine, Token.recast(paramToken, VAR), pattern.getFinish(), identNode, null));
+                    }
                     // detect duplicate bounds names in parameter list
                     currentFunction.addParameterBinding(identNode);
                     currentFunction.setSimpleParameterList(false);
@@ -4136,6 +4146,7 @@
                 // the note below for reasoning on skipping happening before instead of after RBRACE for
                 // details).
                 if (parseBody) {
+                    functionNode.setFlag(FunctionNode.HAS_EXPRESSION_BODY);
                     final ReturnNode returnNode = new ReturnNode(functionNode.getLineNumber(), expr.getToken(), lastFinish, expr);
                     appendStatement(returnNode);
                 }
@@ -4305,7 +4316,7 @@
     }
 
     private RuntimeNode referenceError(final Expression lhs, final Expression rhs, final boolean earlyError) {
-        if (earlyError) {
+        if (env._parse_only || earlyError) {
             throw error(JSErrorType.REFERENCE_ERROR, AbstractParser.message("invalid.lvalue"), lhs.getToken());
         }
         final ArrayList<Expression> args = new ArrayList<>();
@@ -4838,10 +4849,14 @@
 
                 ParserContextFunctionNode currentFunction = lc.getCurrentFunction();
                 if (currentFunction != null) {
-                    BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
-                    TernaryNode value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
-                    BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), ident, value);
-                    lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                    if (env._parse_only) {
+                        currentFunction.addParameterExpression(ident, param);
+                    } else {
+                        BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
+                        TernaryNode value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
+                        BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), ident, value);
+                        lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                    }
 
                     currentFunction.addParameterBinding(ident);
                     currentFunction.setSimpleParameterList(false);
@@ -4855,10 +4870,14 @@
 
                 ParserContextFunctionNode currentFunction = lc.getCurrentFunction();
                 if (currentFunction != null) {
-                    BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
-                    TernaryNode value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
-                    BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), param, value);
-                    lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                    if (env._parse_only) {
+                        currentFunction.addParameterExpression(ident, param);
+                    } else {
+                        BinaryNode test = new BinaryNode(Token.recast(paramToken, EQ_STRICT), ident, newUndefinedLiteral(paramToken, finish));
+                        TernaryNode value = new TernaryNode(Token.recast(paramToken, TERNARY), test, new JoinPredecessorExpression(initializer), new JoinPredecessorExpression(ident));
+                        BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), param, value);
+                        lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                    }
                 }
                 return ident;
             }
@@ -4872,8 +4891,12 @@
 
             ParserContextFunctionNode currentFunction = lc.getCurrentFunction();
             if (currentFunction != null) {
-                BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), param, ident);
-                lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                if (env._parse_only) {
+                    currentFunction.addParameterExpression(ident, param);
+                } else {
+                    BinaryNode assignment = new BinaryNode(Token.recast(paramToken, ASSIGN), param, ident);
+                    lc.getFunctionBody(currentFunction).appendStatement(new ExpressionStatement(paramLine, assignment.getToken(), assignment.getFinish(), assignment));
+                }
             }
             return ident;
         }
@@ -4982,20 +5005,37 @@
             return literal;
         }
 
-        Expression concat = literal;
-        TokenType lastLiteralType;
-        do {
-            final Expression expression = expression();
-            if (type != TEMPLATE_MIDDLE && type != TEMPLATE_TAIL) {
-                throw error(AbstractParser.message("unterminated.template.expression"), token);
-            }
-            concat = new BinaryNode(Token.recast(lastLiteralToken, TokenType.ADD), concat, expression);
-            lastLiteralType = type;
-            lastLiteralToken = token;
-            literal = getLiteral();
-            concat = new BinaryNode(Token.recast(lastLiteralToken, TokenType.ADD), concat, literal);
-        } while (lastLiteralType == TEMPLATE_MIDDLE);
-        return concat;
+        if (env._parse_only) {
+            List<Expression> exprs = new ArrayList<>();
+            exprs.add(literal);
+            TokenType lastLiteralType;
+            do {
+                final Expression expression = expression();
+                if (type != TEMPLATE_MIDDLE && type != TEMPLATE_TAIL) {
+                    throw error(AbstractParser.message("unterminated.template.expression"), token);
+                }
+                exprs.add(expression);
+                lastLiteralType = type;
+                literal = getLiteral();
+                exprs.add(literal);
+            } while (lastLiteralType == TEMPLATE_MIDDLE);
+            return new TemplateLiteral(exprs);
+        } else {
+            Expression concat = literal;
+            TokenType lastLiteralType;
+            do {
+                final Expression expression = expression();
+                if (type != TEMPLATE_MIDDLE && type != TEMPLATE_TAIL) {
+                    throw error(AbstractParser.message("unterminated.template.expression"), token);
+                }
+                concat = new BinaryNode(Token.recast(lastLiteralToken, TokenType.ADD), concat, expression);
+                lastLiteralType = type;
+                lastLiteralToken = token;
+                literal = getLiteral();
+                concat = new BinaryNode(Token.recast(lastLiteralToken, TokenType.ADD), concat, literal);
+            } while (lastLiteralType == TEMPLATE_MIDDLE);
+            return concat;
+        }
     }
 
     /**
--- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextFunctionNode.java	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/ParserContextFunctionNode.java	Tue Jul 12 21:18:13 2016 +0530
@@ -24,9 +24,12 @@
  */
 package jdk.nashorn.internal.parser;
 
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import jdk.nashorn.internal.codegen.Namespace;
+import jdk.nashorn.internal.ir.Expression;
 import jdk.nashorn.internal.ir.FunctionNode;
 import jdk.nashorn.internal.ir.IdentNode;
 import jdk.nashorn.internal.ir.Module;
@@ -70,6 +73,7 @@
     private Module module;
 
     private int debugFlags;
+    private Map<IdentNode, Expression> parameterExpressions;
 
     /**
      * @param token The token for the function
@@ -170,6 +174,22 @@
     }
 
     /**
+     * Return ES6 function parameter expressions
+     *
+     * @return ES6 function parameter expressions
+     */
+    public Map<IdentNode, Expression> getParameterExpressions() {
+        return parameterExpressions;
+    }
+
+    void addParameterExpression(IdentNode ident, Expression node) {
+        if (parameterExpressions == null) {
+            parameterExpressions = new HashMap<>();
+        }
+        parameterExpressions.put(ident, node);
+    }
+
+    /**
      * Set last token
      * @param token New last token
      */
--- a/nashorn/test/script/basic/JDK-8075207.js	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/test/script/basic/JDK-8075207.js	Tue Jul 12 21:18:13 2016 +0530
@@ -61,7 +61,7 @@
 Assert.assertTrue(stats.get(2) instanceof VariableTree);
 
 var print_hello = stats.get(1);
-Assert.assertEquals(print_hello.name, "print_hello");
+Assert.assertEquals(print_hello.name.name, "print_hello");
 var print_hello_stats = print_hello.body.statements;
 Assert.assertTrue(print_hello_stats.get(0) instanceof VariableTree);
 Assert.assertTrue(print_hello_stats.get(1) instanceof ExpressionStatementTree);
--- a/nashorn/test/script/basic/JDK-8075448.js	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/test/script/basic/JDK-8075448.js	Tue Jul 12 21:18:13 2016 +0530
@@ -44,6 +44,6 @@
 var stats = ast.sourceElements;
 
 Assert.assertTrue(stats[0] instanceof VariableTree);
-Assert.assertEquals(stats[0].name, "i");
+Assert.assertEquals(stats[0].binding.name, "i");
 Assert.assertTrue(stats[1] instanceof ForLoopTree);
 
--- a/nashorn/test/script/basic/es6/let-const-switch.js.EXPECTED	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/test/script/basic/es6/let-const-switch.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -1,12 +1,12 @@
-1
-2
-0
-1
-2
-0
-SyntaxError: test/script/basic/es6/let-const-switch.js#34:8<eval>:1:25 Unsupported let declaration in unprotected switch statement
-switch (x) { case 0: let x = 1; }
-                         ^
-SyntaxError: test/script/basic/es6/let-const-switch.js#34:8<eval>:1:27 Unsupported const declaration in unprotected switch statement
-switch (x) { case 0: const x = 1; }
-                           ^
+1
+2
+0
+1
+2
+0
+SyntaxError: test/script/basic/es6/let-const-switch.js#34:8<eval>:1:21 Unsupported let declaration in unprotected switch statement
+switch (x) { case 0: let x = 1; }
+                     ^
+SyntaxError: test/script/basic/es6/let-const-switch.js#34:8<eval>:1:21 Unsupported const declaration in unprotected switch statement
+switch (x) { case 0: const x = 1; }
+                     ^
--- a/nashorn/test/script/nosecurity/parserapi.js	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/test/script/nosecurity/parserapi.js	Tue Jul 12 21:18:13 2016 +0530
@@ -62,6 +62,26 @@
     var result = {};
     for (var i in obj) {
         var val = obj[i];
+        // skip these ES6 specific properties to reduce noise
+        // in the output - unless there were set to true
+        if (typeof(val) == 'boolean' && val == false) {
+            switch (i) {
+                case "computed":
+                case "static":
+                case "restParameter":
+                case "this":
+                case "super":
+                case "star":
+                case "default":
+                case "starDefaultStar":
+                case "arrow":
+                case "generator":
+                case "let":
+                case "const":
+                    continue;
+             }
+        }
+
         if (val instanceof Parser.Tree) {
             result[i] = this.convert(val);
         } else if (val instanceof Parser.List) {
--- a/nashorn/test/script/nosecurity/parserapi.js.EXPECTED	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/test/script/nosecurity/parserapi.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -1,4 +1,4 @@
-[
+[
 {
   "endPosition": "1113",
   "kind": "COMPILATION_UNIT",
@@ -6,8 +6,13 @@
     {
       "endPosition": "1123",
       "kind": "VARIABLE",
-      "name": "x",
-      "startPosition": "1117",
+      "binding": {
+        "endPosition": "1118",
+        "kind": "IDENTIFIER",
+        "name": "x",
+        "startPosition": "1117"
+      },
+      "startPosition": "1113",
       "initializer": {
         "endPosition": "1123",
         "kind": "ARRAY_LITERAL",
@@ -18,8 +23,13 @@
     {
       "endPosition": "1147",
       "kind": "VARIABLE",
-      "name": "y",
-      "startPosition": "1129",
+      "binding": {
+        "endPosition": "1130",
+        "kind": "IDENTIFIER",
+        "name": "y",
+        "startPosition": "1129"
+      },
+      "startPosition": "1125",
       "initializer": {
         "endPosition": "1147",
         "kind": "ARRAY_LITERAL",
@@ -55,8 +65,13 @@
     {
       "endPosition": "1165",
       "kind": "VARIABLE",
-      "name": "z",
-      "startPosition": "1153",
+      "binding": {
+        "endPosition": "1154",
+        "kind": "IDENTIFIER",
+        "name": "z",
+        "startPosition": "1153"
+      },
+      "startPosition": "1149",
       "initializer": {
         "endPosition": "1165",
         "kind": "ARRAY_LITERAL",
@@ -82,8 +97,13 @@
     {
       "endPosition": "1200",
       "kind": "VARIABLE",
-      "name": "k",
-      "startPosition": "1171",
+      "binding": {
+        "endPosition": "1172",
+        "kind": "IDENTIFIER",
+        "name": "k",
+        "startPosition": "1171"
+      },
+      "startPosition": "1167",
       "initializer": {
         "endPosition": "1200",
         "kind": "ARRAY_LITERAL",
@@ -132,8 +152,8 @@
   "sourceName": "parsertests/array_literal.js",
   "strict": "false",
   "startPosition": "1113"
-}
-,
+}
+,
 {
   "endPosition": "1126",
   "kind": "COMPILATION_UNIT",
@@ -406,8 +426,8 @@
   "sourceName": "parsertests/assignmentExpr.js",
   "strict": "false",
   "startPosition": "1126"
-}
-,
+}
+,
 {
   "endPosition": "1116",
   "kind": "COMPILATION_UNIT",
@@ -912,8 +932,8 @@
   "sourceName": "parsertests/binaryExpr.js",
   "strict": "false",
   "startPosition": "1116"
-}
-,
+}
+,
 {
   "endPosition": "1117",
   "kind": "COMPILATION_UNIT",
@@ -959,8 +979,8 @@
   "sourceName": "parsertests/block.js",
   "strict": "false",
   "startPosition": "1117"
-}
-,
+}
+,
 {
   "endPosition": "1117",
   "kind": "COMPILATION_UNIT",
@@ -1060,8 +1080,8 @@
   "sourceName": "parsertests/breakStat.js",
   "strict": "false",
   "startPosition": "1117"
-}
-,
+}
+,
 {
   "endPosition": "1117",
   "kind": "COMPILATION_UNIT",
@@ -1098,8 +1118,8 @@
   "sourceName": "parsertests/condExpr.js",
   "strict": "false",
   "startPosition": "1117"
-}
-,
+}
+,
 {
   "endPosition": "1120",
   "kind": "COMPILATION_UNIT",
@@ -1199,8 +1219,8 @@
   "sourceName": "parsertests/continueStat.js",
   "strict": "false",
   "startPosition": "1120"
-}
-,
+}
+,
 {
   "endPosition": "1118",
   "kind": "COMPILATION_UNIT",
@@ -1214,8 +1234,8 @@
   "sourceName": "parsertests/debuggerStat.js",
   "strict": "false",
   "startPosition": "1118"
-}
-,
+}
+,
 {
   "endPosition": "1137",
   "kind": "COMPILATION_UNIT",
@@ -1223,7 +1243,12 @@
     {
       "endPosition": "1172",
       "kind": "FUNCTION",
-      "name": "hello",
+      "name": {
+        "endPosition": "1151",
+        "kind": "IDENTIFIER",
+        "name": "hello",
+        "startPosition": "1146"
+      },
       "body": {
         "endPosition": "1170",
         "kind": "BLOCK",
@@ -1262,7 +1287,12 @@
     {
       "endPosition": "1203",
       "kind": "FUNCTION",
-      "name": "hello",
+      "name": {
+        "endPosition": "1187",
+        "kind": "IDENTIFIER",
+        "name": "hello",
+        "startPosition": "1182"
+      },
       "body": {
         "endPosition": "1201",
         "kind": "BLOCK",
@@ -1308,7 +1338,12 @@
     {
       "endPosition": "1240",
       "kind": "FUNCTION",
-      "name": "hello",
+      "name": {
+        "endPosition": "1218",
+        "kind": "IDENTIFIER",
+        "name": "hello",
+        "startPosition": "1213"
+      },
       "body": {
         "endPosition": "1238",
         "kind": "BLOCK",
@@ -1366,8 +1401,13 @@
     {
       "endPosition": "1282",
       "kind": "VARIABLE",
-      "name": "hello",
-      "startPosition": "1245",
+      "binding": {
+        "endPosition": "1250",
+        "kind": "IDENTIFIER",
+        "name": "hello",
+        "startPosition": "1245"
+      },
+      "startPosition": "1241",
       "initializer": {
         "endPosition": "1264",
         "kind": "FUNCTION_EXPRESSION",
@@ -1410,12 +1450,22 @@
     {
       "endPosition": "1331",
       "kind": "VARIABLE",
-      "name": "hello",
-      "startPosition": "1288",
+      "binding": {
+        "endPosition": "1293",
+        "kind": "IDENTIFIER",
+        "name": "hello",
+        "startPosition": "1288"
+      },
+      "startPosition": "1284",
       "initializer": {
         "endPosition": "1313",
         "kind": "FUNCTION_EXPRESSION",
-        "name": "hello",
+        "name": {
+          "endPosition": "1310",
+          "kind": "IDENTIFIER",
+          "name": "hello",
+          "startPosition": "1305"
+        },
         "body": {
           "endPosition": "1329",
           "kind": "BLOCK",
@@ -1473,7 +1523,12 @@
     {
       "endPosition": "1380",
       "kind": "FUNCTION",
-      "name": "test",
+      "name": {
+        "endPosition": "1361",
+        "kind": "IDENTIFIER",
+        "name": "test",
+        "startPosition": "1357"
+      },
       "body": {
         "endPosition": "1377",
         "kind": "BLOCK",
@@ -1500,8 +1555,8 @@
   "sourceName": "parsertests/functions.js",
   "strict": "false",
   "startPosition": "1137"
-}
-,
+}
+,
 {
   "endPosition": "1114",
   "kind": "COMPILATION_UNIT",
@@ -1604,8 +1659,8 @@
   "sourceName": "parsertests/ifStat.js",
   "strict": "false",
   "startPosition": "1114"
-}
-,
+}
+,
 {
   "endPosition": "1113",
   "kind": "COMPILATION_UNIT",
@@ -1668,8 +1723,8 @@
   "sourceName": "parsertests/labelledStat.js",
   "strict": "false",
   "startPosition": "1113"
-}
-,
+}
+,
 {
   "endPosition": "1125",
   "kind": "COMPILATION_UNIT",
@@ -2066,8 +2121,8 @@
   "sourceName": "parsertests/lhsExpr.js",
   "strict": "false",
   "startPosition": "1125"
-}
-,
+}
+,
 {
   "endPosition": "1110",
   "kind": "COMPILATION_UNIT",
@@ -2350,8 +2405,8 @@
   "sourceName": "parsertests/loopStat.js",
   "strict": "false",
   "startPosition": "1110"
-}
-,
+}
+,
 {
   "endPosition": "1125",
   "kind": "COMPILATION_UNIT",
@@ -2608,6 +2663,7 @@
                         "expression": {
                           "endPosition": "1272",
                           "kind": "IDENTIFIER",
+                          "this": "true",
                           "name": "this",
                           "startPosition": "1268"
                         },
@@ -2650,6 +2706,7 @@
                           "expression": {
                             "endPosition": "1300",
                             "kind": "IDENTIFIER",
+                            "this": "true",
                             "name": "this",
                             "startPosition": "1296"
                           },
@@ -2705,8 +2762,8 @@
   "sourceName": "parsertests/objectLitExpr.js",
   "strict": "false",
   "startPosition": "1125"
-}
-,
+}
+,
 {
   "endPosition": "1118",
   "kind": "COMPILATION_UNIT",
@@ -2781,8 +2838,8 @@
   "sourceName": "parsertests/parenExpr.js",
   "strict": "false",
   "startPosition": "1118"
-}
-,
+}
+,
 {
   "endPosition": "1119",
   "kind": "COMPILATION_UNIT",
@@ -2791,6 +2848,7 @@
       "expression": {
         "endPosition": "1123",
         "kind": "IDENTIFIER",
+        "this": "true",
         "name": "this",
         "startPosition": "1119"
       },
@@ -2995,8 +3053,8 @@
   "sourceName": "parsertests/primaryExpr.js",
   "strict": "false",
   "startPosition": "1119"
-}
-,
+}
+,
 {
   "endPosition": "1114",
   "kind": "COMPILATION_UNIT",
@@ -3004,8 +3062,13 @@
     {
       "endPosition": "1127",
       "kind": "VARIABLE",
-      "name": "x",
-      "startPosition": "1118",
+      "binding": {
+        "endPosition": "1119",
+        "kind": "IDENTIFIER",
+        "name": "x",
+        "startPosition": "1118"
+      },
+      "startPosition": "1114",
       "initializer": {
         "endPosition": "1127",
         "kind": "REGEXP_LITERAL",
@@ -3017,8 +3080,13 @@
     {
       "endPosition": "1143",
       "kind": "VARIABLE",
-      "name": "y",
-      "startPosition": "1133",
+      "binding": {
+        "endPosition": "1134",
+        "kind": "IDENTIFIER",
+        "name": "y",
+        "startPosition": "1133"
+      },
+      "startPosition": "1129",
       "initializer": {
         "endPosition": "1143",
         "kind": "REGEXP_LITERAL",
@@ -3030,8 +3098,13 @@
     {
       "endPosition": "1168",
       "kind": "VARIABLE",
-      "name": "z",
-      "startPosition": "1149",
+      "binding": {
+        "endPosition": "1150",
+        "kind": "IDENTIFIER",
+        "name": "z",
+        "startPosition": "1149"
+      },
+      "startPosition": "1145",
       "initializer": {
         "endPosition": "1168",
         "kind": "REGEXP_LITERAL",
@@ -3044,8 +3117,8 @@
   "sourceName": "parsertests/regexp_literal.js",
   "strict": "false",
   "startPosition": "1114"
-}
-,
+}
+,
 {
   "endPosition": "1118",
   "kind": "COMPILATION_UNIT",
@@ -3144,8 +3217,8 @@
   "sourceName": "parsertests/returnStat.js",
   "strict": "false",
   "startPosition": "1118"
-}
-,
+}
+,
 {
   "endPosition": "1111",
   "kind": "COMPILATION_UNIT",
@@ -3309,8 +3382,8 @@
   "sourceName": "parsertests/switchStat.js",
   "strict": "false",
   "startPosition": "1111"
-}
-,
+}
+,
 {
   "endPosition": "1110",
   "kind": "COMPILATION_UNIT",
@@ -3421,8 +3494,8 @@
   "sourceName": "parsertests/throwStat.js",
   "strict": "false",
   "startPosition": "1110"
-}
-,
+}
+,
 {
   "endPosition": "1121",
   "kind": "COMPILATION_UNIT",
@@ -3783,8 +3856,8 @@
   "sourceName": "parsertests/tryCatchStat.js",
   "strict": "false",
   "startPosition": "1121"
-}
-,
+}
+,
 {
   "endPosition": "1115",
   "kind": "COMPILATION_UNIT",
@@ -3969,8 +4042,8 @@
   "sourceName": "parsertests/unaryExpr.js",
   "strict": "false",
   "startPosition": "1115"
-}
-,
+}
+,
 {
   "endPosition": "1122",
   "kind": "COMPILATION_UNIT",
@@ -3989,7 +4062,12 @@
     {
       "endPosition": "1165",
       "kind": "FUNCTION",
-      "name": "f",
+      "name": {
+        "endPosition": "1146",
+        "kind": "IDENTIFIER",
+        "name": "f",
+        "startPosition": "1145"
+      },
       "body": {
         "endPosition": "1162",
         "kind": "BLOCK",
@@ -4016,8 +4094,8 @@
   "sourceName": "parsertests/useStrict.js",
   "strict": "true",
   "startPosition": "1122"
-}
-,
+}
+,
 {
   "endPosition": "1143",
   "kind": "COMPILATION_UNIT",
@@ -4025,26 +4103,46 @@
     {
       "endPosition": "1148",
       "kind": "VARIABLE",
-      "name": "a",
-      "startPosition": "1147"
+      "binding": {
+        "endPosition": "1148",
+        "kind": "IDENTIFIER",
+        "name": "a",
+        "startPosition": "1147"
+      },
+      "startPosition": "1143"
     },
     {
       "endPosition": "1155",
       "kind": "VARIABLE",
-      "name": "a",
-      "startPosition": "1154"
+      "binding": {
+        "endPosition": "1155",
+        "kind": "IDENTIFIER",
+        "name": "a",
+        "startPosition": "1154"
+      },
+      "startPosition": "1150"
     },
     {
       "endPosition": "1158",
       "kind": "VARIABLE",
-      "name": "b",
-      "startPosition": "1157"
+      "binding": {
+        "endPosition": "1158",
+        "kind": "IDENTIFIER",
+        "name": "b",
+        "startPosition": "1157"
+      },
+      "startPosition": "1150"
     },
     {
       "endPosition": "1200",
       "kind": "VARIABLE",
-      "name": "a",
-      "startPosition": "1190",
+      "binding": {
+        "endPosition": "1191",
+        "kind": "IDENTIFIER",
+        "name": "a",
+        "startPosition": "1190"
+      },
+      "startPosition": "1186",
       "initializer": {
         "endPosition": "1200",
         "kind": "STRING_LITERAL",
@@ -4055,8 +4153,13 @@
     {
       "endPosition": "1212",
       "kind": "VARIABLE",
-      "name": "a",
-      "startPosition": "1207",
+      "binding": {
+        "endPosition": "1208",
+        "kind": "IDENTIFIER",
+        "name": "a",
+        "startPosition": "1207"
+      },
+      "startPosition": "1203",
       "initializer": {
         "endPosition": "1212",
         "kind": "NUMBER_LITERAL",
@@ -4067,8 +4170,13 @@
     {
       "endPosition": "1219",
       "kind": "VARIABLE",
-      "name": "b",
-      "startPosition": "1214",
+      "binding": {
+        "endPosition": "1215",
+        "kind": "IDENTIFIER",
+        "name": "b",
+        "startPosition": "1214"
+      },
+      "startPosition": "1203",
       "initializer": {
         "endPosition": "1219",
         "kind": "NUMBER_LITERAL",
@@ -4079,8 +4187,13 @@
     {
       "endPosition": "1226",
       "kind": "VARIABLE",
-      "name": "c",
-      "startPosition": "1221",
+      "binding": {
+        "endPosition": "1222",
+        "kind": "IDENTIFIER",
+        "name": "c",
+        "startPosition": "1221"
+      },
+      "startPosition": "1203",
       "initializer": {
         "endPosition": "1226",
         "kind": "NUMBER_LITERAL",
@@ -4092,8 +4205,8 @@
   "sourceName": "parsertests/varDecl.js",
   "strict": "false",
   "startPosition": "1143"
-}
-,
+}
+,
 {
   "endPosition": "1111",
   "kind": "COMPILATION_UNIT",
@@ -4142,8 +4255,8 @@
   "sourceName": "parsertests/withStat.js",
   "strict": "false",
   "startPosition": "1111"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/caseoutofswitch.js",
   "code": "case (1090, 4)",
@@ -4152,8 +4265,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 +4275,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 +4353,8 @@
   "sourceName": "parsernegativetests/caseoutofswitch.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegalbreak.js",
   "code": "break (1090, 5)",
@@ -4250,8 +4363,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 +4373,8 @@
   "position": "1103",
   "message": "parsernegativetests/illegalbreak.js:30:6 Undefined Label \"foo\"\nbreak foo;\n      ^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4290,8 +4403,8 @@
   "sourceName": "parsernegativetests/illegalbreak.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegalcontinue.js",
   "code": "continue (1090, 8)",
@@ -4300,8 +4413,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 +4423,8 @@
   "position": "1109",
   "message": "parsernegativetests/illegalcontinue.js:30:9 Undefined Label \"foo\"\ncontinue foo;\n         ^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4340,8 +4453,8 @@
   "sourceName": "parsernegativetests/illegalcontinue.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegallvalue.js",
   "code": "decimal (1090, 2)",
@@ -4350,8 +4463,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 +4473,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 +4483,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 +4523,8 @@
   "sourceName": "parsernegativetests/illegallvalue.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/illegaloperator.js",
   "code": "* (1093, 1)",
@@ -4420,8 +4533,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 +4553,8 @@
   "sourceName": "parsernegativetests/illegaloperator.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/keywordident.js",
   "code": "var (1094, 3)",
@@ -4450,8 +4563,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",
@@ -4469,8 +4582,13 @@
     {
       "endPosition": "1115",
       "kind": "VARIABLE",
-      "name": "x",
-      "startPosition": "1108",
+      "binding": {
+        "endPosition": "1109",
+        "kind": "IDENTIFIER",
+        "name": "x",
+        "startPosition": "1108"
+      },
+      "startPosition": "1104",
       "initializer": {
         "endPosition": "1115",
         "kind": "NUMBER_LITERAL",
@@ -4482,8 +4600,8 @@
   "sourceName": "parsernegativetests/keywordident.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/parenmissing.js",
   "code": "; (1096, 1)",
@@ -4492,8 +4610,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 +4620,8 @@
   "position": "1103",
   "message": "parsernegativetests/parenmissing.js:30:5 Expected ; but found )\nx * y);\n     ^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4554,8 +4672,8 @@
   "sourceName": "parsernegativetests/parenmissing.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/repeatedproperty.js",
   "code": "ident (1111, 3)",
@@ -4564,8 +4682,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 +4692,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 +4702,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 +4712,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 +4722,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 +4782,8 @@
   "sourceName": "parsernegativetests/repeatedproperty.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/strict_repeatedproperty.js",
   "code": "ident (1126, 3)",
@@ -4674,8 +4792,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 +4823,8 @@
   "sourceName": "parsernegativetests/strict_repeatedproperty.js",
   "strict": "true",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/strict_repeatparam.js",
   "code": "ident (1122, 1)",
@@ -4715,8 +4833,8 @@
   "position": "1122",
   "message": "parsernegativetests/strict_repeatparam.js:31:17 strict mode function cannot have duplicate parameter name \"x\"\nfunction func(x, x) {}\n                 ^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4746,8 +4864,8 @@
   "sourceName": "parsernegativetests/strict_repeatparam.js",
   "strict": "true",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/strict_with.js",
   "code": "with (1105, 4)",
@@ -4756,8 +4874,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 +4884,8 @@
   "position": "1112",
   "message": "parsernegativetests/strict_with.js:31:7 Expected ; but found )\nwith({}) {}\n       ^",
   "lineNumber": "31"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4807,8 +4925,8 @@
   "sourceName": "parsernegativetests/strict_with.js",
   "strict": "true",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "fileName": "parsernegativetests/toplevelreturn.js",
   "code": "return (1090, 6)",
@@ -4817,8 +4935,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 +4945,8 @@
   "position": "1098",
   "message": "parsernegativetests/toplevelreturn.js:30:0 Invalid return statement\nreturn 23;\n^",
   "lineNumber": "30"
-}
-,
+}
+,
 {
   "endPosition": "1090",
   "kind": "COMPILATION_UNIT",
@@ -4857,8 +4975,8 @@
   "sourceName": "parsernegativetests/toplevelreturn.js",
   "strict": "false",
   "startPosition": "1090"
-}
-,
+}
+,
 {
   "endPosition": "1136",
   "kind": "COMPILATION_UNIT",
@@ -4866,7 +4984,12 @@
     {
       "endPosition": "1222",
       "kind": "FUNCTION",
-      "name": "Parser",
+      "name": {
+        "endPosition": "1151",
+        "kind": "IDENTIFIER",
+        "name": "Parser",
+        "startPosition": "1145"
+      },
       "body": {
         "endPosition": "1220",
         "kind": "BLOCK",
@@ -4898,6 +5021,7 @@
                 "expression": {
                   "endPosition": "1193",
                   "kind": "IDENTIFIER",
+                  "this": "true",
                   "name": "this",
                   "startPosition": "1189"
                 },
@@ -5165,8 +5289,13 @@
               {
                 "endPosition": "1718",
                 "kind": "VARIABLE",
-                "name": "tree",
-                "startPosition": "1669",
+                "binding": {
+                  "endPosition": "1673",
+                  "kind": "IDENTIFIER",
+                  "name": "tree",
+                  "startPosition": "1669"
+                },
+                "startPosition": "1665",
                 "initializer": {
                   "endPosition": "1718",
                   "kind": "FUNCTION_INVOCATION",
@@ -5177,6 +5306,7 @@
                       "expression": {
                         "endPosition": "1680",
                         "kind": "IDENTIFIER",
+                        "this": "true",
                         "name": "this",
                         "startPosition": "1676"
                       },
@@ -5272,6 +5402,7 @@
                     "expression": {
                       "endPosition": "1790",
                       "kind": "IDENTIFIER",
+                      "this": "true",
                       "name": "this",
                       "startPosition": "1786"
                     },
@@ -5429,7 +5560,7 @@
           "endPosition": "2016",
           "kind": "FUNCTION_EXPRESSION",
           "body": {
-            "endPosition": "2994",
+            "endPosition": "3634",
             "kind": "BLOCK",
             "statements": [
               {
@@ -5554,8 +5685,13 @@
               {
                 "endPosition": "2169",
                 "kind": "VARIABLE",
-                "name": "obj",
-                "startPosition": "2132",
+                "binding": {
+                  "endPosition": "2135",
+                  "kind": "IDENTIFIER",
+                  "name": "obj",
+                  "startPosition": "2132"
+                },
+                "startPosition": "2128",
                 "initializer": {
                   "endPosition": "2169",
                   "kind": "FUNCTION_INVOCATION",
@@ -5591,8 +5727,13 @@
               {
                 "endPosition": "2190",
                 "kind": "VARIABLE",
-                "name": "result",
-                "startPosition": "2179",
+                "binding": {
+                  "endPosition": "2185",
+                  "kind": "IDENTIFIER",
+                  "name": "result",
+                  "startPosition": "2179"
+                },
+                "startPosition": "2175",
                 "initializer": {
                   "endPosition": "2190",
                   "kind": "OBJECT_LITERAL",
@@ -5603,8 +5744,13 @@
               {
                 "endPosition": "2206",
                 "kind": "VARIABLE",
-                "name": "i",
-                "startPosition": "2205"
+                "binding": {
+                  "endPosition": "2206",
+                  "kind": "IDENTIFIER",
+                  "name": "i",
+                  "startPosition": "2205"
+                },
+                "startPosition": "2201"
               },
               {
                 "expression": {
@@ -5613,7 +5759,7 @@
                   "name": "obj",
                   "startPosition": "2210"
                 },
-                "endPosition": "2975",
+                "endPosition": "3615",
                 "kind": "FOR_IN_LOOP",
                 "forEach": "false",
                 "variable": {
@@ -5623,14 +5769,19 @@
                   "startPosition": "2205"
                 },
                 "statement": {
-                  "endPosition": "2975",
+                  "endPosition": "3615",
                   "kind": "BLOCK",
                   "statements": [
                     {
                       "endPosition": "2241",
                       "kind": "VARIABLE",
-                      "name": "val",
-                      "startPosition": "2229",
+                      "binding": {
+                        "endPosition": "2232",
+                        "kind": "IDENTIFIER",
+                        "name": "val",
+                        "startPosition": "2229"
+                      },
+                      "startPosition": "2225",
                       "initializer": {
                         "expression": {
                           "endPosition": "2238",
@@ -5652,605 +5803,836 @@
                     {
                       "condition": {
                         "leftOperand": {
-                          "endPosition": "2258",
+                          "leftOperand": {
+                            "expression": {
+                              "endPosition": "2384",
+                              "kind": "IDENTIFIER",
+                              "name": "val",
+                              "startPosition": "2381"
+                            },
+                            "endPosition": "2384",
+                            "kind": "TYPEOF",
+                            "startPosition": "2374"
+                          },
+                          "endPosition": "2397",
+                          "kind": "EQUAL_TO",
+                          "rightOperand": {
+                            "endPosition": "2397",
+                            "kind": "STRING_LITERAL",
+                            "value": "boolean",
+                            "startPosition": "2390"
+                          },
+                          "startPosition": "2374"
+                        },
+                        "endPosition": "2414",
+                        "kind": "CONDITIONAL_AND",
+                        "rightOperand": {
+                          "leftOperand": {
+                            "endPosition": "2405",
+                            "kind": "IDENTIFIER",
+                            "name": "val",
+                            "startPosition": "2402"
+                          },
+                          "endPosition": "2414",
+                          "kind": "EQUAL_TO",
+                          "rightOperand": {
+                            "endPosition": "2414",
+                            "kind": "BOOLEAN_LITERAL",
+                            "value": "false",
+                            "startPosition": "2409"
+                          },
+                          "startPosition": "2402"
+                        },
+                        "startPosition": "2374"
+                      },
+                      "endPosition": "2881",
+                      "kind": "IF",
+                      "startPosition": "2370",
+                      "thenStatement": {
+                        "endPosition": "2881",
+                        "kind": "BLOCK",
+                        "statements": [
+                          {
+                            "cases": [
+                              {
+                                "expression": {
+                                  "endPosition": "2473",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "computed",
+                                  "startPosition": "2465"
+                                },
+                                "endPosition": "2475",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2459"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2504",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "static",
+                                  "startPosition": "2498"
+                                },
+                                "endPosition": "2506",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2492"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2542",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "restParameter",
+                                  "startPosition": "2529"
+                                },
+                                "endPosition": "2544",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2523"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2571",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "this",
+                                  "startPosition": "2567"
+                                },
+                                "endPosition": "2573",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2561"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2601",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "super",
+                                  "startPosition": "2596"
+                                },
+                                "endPosition": "2603",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2590"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2630",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "star",
+                                  "startPosition": "2626"
+                                },
+                                "endPosition": "2632",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2620"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2662",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "default",
+                                  "startPosition": "2655"
+                                },
+                                "endPosition": "2664",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2649"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2702",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "starDefaultStar",
+                                  "startPosition": "2687"
+                                },
+                                "endPosition": "2704",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2681"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2732",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "arrow",
+                                  "startPosition": "2727"
+                                },
+                                "endPosition": "2734",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2721"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2766",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "generator",
+                                  "startPosition": "2757"
+                                },
+                                "endPosition": "2768",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2751"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2794",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "let",
+                                  "startPosition": "2791"
+                                },
+                                "endPosition": "2796",
+                                "kind": "CASE",
+                                "statements": [],
+                                "startPosition": "2785"
+                              },
+                              {
+                                "expression": {
+                                  "endPosition": "2824",
+                                  "kind": "STRING_LITERAL",
+                                  "value": "const",
+                                  "startPosition": "2819"
+                                },
+                                "endPosition": "2856",
+                                "kind": "CASE",
+                                "statements": [
+                                  {
+                                    "endPosition": "2856",
+                                    "kind": "CONTINUE",
+                                    "startPosition": "2847"
+                                  }
+                                ],
+                                "startPosition": "2813"
+                              }
+                            ],
+                            "expression": {
+                              "endPosition": "2439",
+                              "kind": "IDENTIFIER",
+                              "name": "i",
+                              "startPosition": "2438"
+                            },
+                            "endPosition": "2871",
+                            "kind": "SWITCH",
+                            "startPosition": "2430"
+                          }
+                        ],
+                        "startPosition": "2416"
+                      }
+                    },
+                    {
+                      "condition": {
+                        "leftOperand": {
+                          "endPosition": "2898",
                           "kind": "IDENTIFIER",
                           "name": "val",
-                          "startPosition": "2255"
+                          "startPosition": "2895"
                         },
                         "expression": {
-                          "endPosition": "2258",
+                          "endPosition": "2898",
                           "kind": "IDENTIFIER",
                           "name": "val",
-                          "startPosition": "2255"
+                          "startPosition": "2895"
                         },
-                        "endPosition": "2281",
+                        "endPosition": "2921",
                         "kind": "INSTANCE_OF",
                         "rightOperand": {
                           "identifier": "Tree",
                           "expression": {
-                            "endPosition": "2276",
+                            "endPosition": "2916",
                             "kind": "IDENTIFIER",
                             "name": "Parser",
-                            "startPosition": "2270"
+                            "startPosition": "2910"
                           },
-                          "endPosition": "2281",
+                          "endPosition": "2921",
                           "kind": "MEMBER_SELECT",
-                          "startPosition": "2270"
+                          "startPosition": "2910"
                         },
                         "type": {
                           "identifier": "Tree",
                           "expression": {
-                            "endPosition": "2276",
+                            "endPosition": "2916",
                             "kind": "IDENTIFIER",
                             "name": "Parser",
-                            "startPosition": "2270"
+                            "startPosition": "2910"
                           },
-                          "endPosition": "2281",
+                          "endPosition": "2921",
                           "kind": "MEMBER_SELECT",
-                          "startPosition": "2270"
+                          "startPosition": "2910"
                         },
-                        "startPosition": "2255"
+                        "startPosition": "2895"
                       },
                       "elseStatement": {
                         "condition": {
                           "leftOperand": {
-                            "endPosition": "2350",
+                            "endPosition": "2990",
                             "kind": "IDENTIFIER",
                             "name": "val",
-                            "startPosition": "2347"
+                            "startPosition": "2987"
                           },
                           "expression": {
-                            "endPosition": "2350",
+                            "endPosition": "2990",
                             "kind": "IDENTIFIER",
                             "name": "val",
-                            "startPosition": "2347"
+                            "startPosition": "2987"
                           },
-                          "endPosition": "2373",
+                          "endPosition": "3013",
                           "kind": "INSTANCE_OF",
                           "rightOperand": {
                             "identifier": "List",
                             "expression": {
-                              "endPosition": "2368",
+                              "endPosition": "3008",
                               "kind": "IDENTIFIER",
                               "name": "Parser",
-                              "startPosition": "2362"
+                              "startPosition": "3002"
                             },
-                            "endPosition": "2373",
+                            "endPosition": "3013",
                             "kind": "MEMBER_SELECT",
-                            "startPosition": "2362"
+                            "startPosition": "3002"
                           },
                           "type": {
                             "identifier": "List",
                             "expression": {
-                              "endPosition": "2368",
+                              "endPosition": "3008",
                               "kind": "IDENTIFIER",
                               "name": "Parser",
-                              "startPosition": "2362"
+                              "startPosition": "3002"
                             },
-                            "endPosition": "2373",
+                            "endPosition": "3013",
                             "kind": "MEMBER_SELECT",
-                            "startPosition": "2362"
+                            "startPosition": "3002"
                           },
-                          "startPosition": "2347"
+                          "startPosition": "2987"
                         },
                         "elseStatement": {
-                          "endPosition": "2969",
+                          "endPosition": "3609",
                           "kind": "BLOCK",
                           "statements": [
                             {
                               "cases": [
                                 {
                                   "expression": {
-                                    "endPosition": "2625",
+                                    "endPosition": "3265",
                                     "kind": "STRING_LITERAL",
                                     "value": "number",
-                                    "startPosition": "2619"
+                                    "startPosition": "3259"
                                   },
-                                  "endPosition": "2627",
+                                  "endPosition": "3267",
                                   "kind": "CASE",
                                   "statements": [],
-                                  "startPosition": "2613"
+                                  "startPosition": "3253"
                                 },
                                 {
                                   "expression": {
-                                    "endPosition": "2656",
+                                    "endPosition": "3296",
                                     "kind": "STRING_LITERAL",
                                     "value": "string",
-                                    "startPosition": "2650"
+                                    "startPosition": "3290"
                                   },
-                                  "endPosition": "2658",
+                                  "endPosition": "3298",
                                   "kind": "CASE",
                                   "statements": [],
-                                  "startPosition": "2644"
+                                  "startPosition": "3284"
                                 },
                                 {
                                   "expression": {
-                                    "endPosition": "2688",
+                                    "endPosition": "3328",
                                     "kind": "STRING_LITERAL",
                                     "value": "boolean",
-                                    "startPosition": "2681"
+                                    "startPosition": "3321"
                                   },
-                                  "endPosition": "2762",
+                                  "endPosition": "3402",
                                   "kind": "CASE",
                                   "statements": [
                                     {
                                       "expression": {
                                         "expression": {
-                                          "endPosition": "2734",
+                                          "endPosition": "3374",
                                           "kind": "FUNCTION_INVOCATION",
                                           "functionSelect": {
-                                            "endPosition": "2729",
+                                            "endPosition": "3369",
                                             "kind": "IDENTIFIER",
                                             "name": "String",
-                                            "startPosition": "2723"
+                                            "startPosition": "3363"
                                           },
                                           "arguments": [
                                             {
-                                              "endPosition": "2733",
+                                              "endPosition": "3373",
                                               "kind": "IDENTIFIER",
                                               "name": "val",
-                                              "startPosition": "2730"
+                                              "startPosition": "3370"
                                             }
                                           ],
-                                          "startPosition": "2723"
+                                          "startPosition": "3363"
                                         },
-                                        "endPosition": "2734",
+                                        "endPosition": "3374",
                                         "kind": "ASSIGNMENT",
                                         "variable": {
                                           "expression": {
-                                            "endPosition": "2717",
+                                            "endPosition": "3357",
                                             "kind": "IDENTIFIER",
                                             "name": "result",
-                                            "startPosition": "2711"
+                                            "startPosition": "3351"
                                           },
-                                          "endPosition": "2720",
+                                          "endPosition": "3360",
                                           "kind": "ARRAY_ACCESS",
                                           "index": {
-                                            "endPosition": "2719",
+                                            "endPosition": "3359",
                                             "kind": "IDENTIFIER",
                                             "name": "i",
-                                            "startPosition": "2718"
+                                            "startPosition": "3358"
                                           },
-                                          "startPosition": "2711"
+                                          "startPosition": "3351"
                                         },
-                                        "startPosition": "2711"
+                                        "startPosition": "3351"
                                       },
-                                      "endPosition": "2734",
+                                      "endPosition": "3374",
                                       "kind": "EXPRESSION_STATEMENT",
-                                      "startPosition": "2711"
+                                      "startPosition": "3351"
                                     },
                                     {
-                                      "endPosition": "2762",
+                                      "endPosition": "3402",
                                       "kind": "BREAK",
-                                      "startPosition": "2756"
+                                      "startPosition": "3396"
                                     }
                                   ],
-                                  "startPosition": "2675"
+                                  "startPosition": "3315"
                                 },
                                 {
-                                  "endPosition": "2945",
+                                  "endPosition": "3585",
                                   "kind": "CASE",
                                   "statements": [
                                     {
                                       "condition": {
                                         "leftOperand": {
                                           "leftOperand": {
-                                            "endPosition": "2815",
+                                            "endPosition": "3455",
                                             "kind": "IDENTIFIER",
                                             "name": "val",
-                                            "startPosition": "2812"
+                                            "startPosition": "3452"
                                           },
                                           "expression": {
-                                            "endPosition": "2815",
+                                            "endPosition": "3455",
                                             "kind": "IDENTIFIER",
                                             "name": "val",
-                                            "startPosition": "2812"
+                                            "startPosition": "3452"
                                           },
-                                          "endPosition": "2841",
+                                          "endPosition": "3481",
                                           "kind": "INSTANCE_OF",
                                           "rightOperand": {
                                             "identifier": "Long",
                                             "expression": {
                                               "identifier": "lang",
                                               "expression": {
-                                                "endPosition": "2831",
+                                                "endPosition": "3471",
                                                 "kind": "IDENTIFIER",
                                                 "name": "java",
-                                                "startPosition": "2827"
+                                                "startPosition": "3467"
                                               },
-                                              "endPosition": "2836",
+                                              "endPosition": "3476",
                                               "kind": "MEMBER_SELECT",
-                                              "startPosition": "2827"
+                                              "startPosition": "3467"
                                             },
-                                            "endPosition": "2841",
+                                            "endPosition": "3481",
                                             "kind": "MEMBER_SELECT",
-                                            "startPosition": "2827"
+                                            "startPosition": "3467"
                                           },
                                           "type": {
                                             "identifier": "Long",
                                             "expression": {
                                               "identifier": "lang",
                                               "expression": {
-                                                "endPosition": "2831",
+                                                "endPosition": "3471",
                                                 "kind": "IDENTIFIER",
                                                 "name": "java",
-                                                "startPosition": "2827"
+                                                "startPosition": "3467"
                                               },
-                                              "endPosition": "2836",
+                                              "endPosition": "3476",
                                               "kind": "MEMBER_SELECT",
-                                              "startPosition": "2827"
+                                              "startPosition": "3467"
                                             },
-                                            "endPosition": "2841",
+                                            "endPosition": "3481",
                                             "kind": "MEMBER_SELECT",
-                                            "startPosition": "2827"
+                                            "startPosition": "3467"
                                           },
-                                          "startPosition": "2812"
+                                          "startPosition": "3452"
                                         },
-                                        "endPosition": "2871",
+                                        "endPosition": "3511",
                                         "kind": "CONDITIONAL_OR",
                                         "rightOperand": {
                                           "leftOperand": {
-                                            "endPosition": "2848",
+                                            "endPosition": "3488",
                                             "kind": "IDENTIFIER",
                                             "name": "val",
-                                            "startPosition": "2845"
+                                            "startPosition": "3485"
                                           },
                                           "expression": {
-                                            "endPosition": "2848",
+                                            "endPosition": "3488",
                                             "kind": "IDENTIFIER",
                                             "name": "val",
-                                            "startPosition": "2845"
+                                            "startPosition": "3485"
                                           },
-                                          "endPosition": "2871",
+                                          "endPosition": "3511",
                                           "kind": "INSTANCE_OF",
                                           "rightOperand": {
                                             "identifier": "Enum",
                                             "expression": {
-                                              "endPosition": "2866",
+                                              "endPosition": "3506",
                                               "kind": "IDENTIFIER",
                                               "name": "Parser",
-                                              "startPosition": "2860"
+                                              "startPosition": "3500"
                                             },
-                                            "endPosition": "2871",
+                                            "endPosition": "3511",
                                             "kind": "MEMBER_SELECT",
-                                            "startPosition": "2860"
+                                            "startPosition": "3500"
                                           },
                                           "type": {
                                             "identifier": "Enum",
                                             "expression": {
-                                              "endPosition": "2866",
+                                              "endPosition": "3506",
                                               "kind": "IDENTIFIER",
                                               "name": "Parser",
-                                              "startPosition": "2860"
+                                              "startPosition": "3500"
                                             },
-                                            "endPosition": "2871",
+                                            "endPosition": "3511",
                                             "kind": "MEMBER_SELECT",
-                                            "startPosition": "2860"
+                                            "startPosition": "3500"
                                           },
-                                          "startPosition": "2845"
+                                          "startPosition": "3485"
                                         },
-                                        "startPosition": "2812"
+                                        "startPosition": "3452"
                                       },
-                                      "endPosition": "2945",
+                                      "endPosition": "3585",
                                       "kind": "IF",
-                                      "startPosition": "2808",
+                                      "startPosition": "3448",
                                       "thenStatement": {
-                                        "endPosition": "2945",
+                                        "endPosition": "3585",
                                         "kind": "BLOCK",
                                         "statements": [
                                           {
                                             "expression": {
                                               "expression": {
-                                                "endPosition": "2922",
+                                                "endPosition": "3562",
                                                 "kind": "FUNCTION_INVOCATION",
                                                 "functionSelect": {
-                                                  "endPosition": "2917",
+                                                  "endPosition": "3557",
                                                   "kind": "IDENTIFIER",
                                                   "name": "String",
-                                                  "startPosition": "2911"
+                                                  "startPosition": "3551"
                                                 },
                                                 "arguments": [
                                                   {
-                                                    "endPosition": "2921",
+                                                    "endPosition": "3561",
                                                     "kind": "IDENTIFIER",
                                                     "name": "val",
-                                                    "startPosition": "2918"
+                                                    "startPosition": "3558"
                                                   }
                                                 ],
-                                                "startPosition": "2911"
+                                                "startPosition": "3551"
                                               },
-                                              "endPosition": "2922",
+                                              "endPosition": "3562",
                                               "kind": "ASSIGNMENT",
                                               "variable": {
                                                 "expression": {
-                                                  "endPosition": "2905",
+                                                  "endPosition": "3545",
                                                   "kind": "IDENTIFIER",
                                                   "name": "result",
-                                                  "startPosition": "2899"
+                                                  "startPosition": "3539"
                                                 },
-                                                "endPosition": "2908",
+                                                "endPosition": "3548",
                                                 "kind": "ARRAY_ACCESS",
                                                 "index": {
-                                                  "endPosition": "2907",
+                                                  "endPosition": "3547",
                                                   "kind": "IDENTIFIER",
                                                   "name": "i",
-                                                  "startPosition": "2906"
+                                                  "startPosition": "3546"
                                                 },
-                                                "startPosition": "2899"
+                                                "startPosition": "3539"
                                               },
-                                              "startPosition": "2899"
+                                              "startPosition": "3539"
                                             },
-                                            "endPosition": "2922",
+                                            "endPosition": "3562",
                                             "kind": "EXPRESSION_STATEMENT",
-                                            "startPosition": "2899"
+                                            "startPosition": "3539"
                                           }
                                         ],
-                                        "startPosition": "2873"
+                                        "startPosition": "3513"
                                       }
                                     }
                                   ],
-                                  "startPosition": "2779"
+                                  "startPosition": "3419"
                                 }
                               ],
                               "expression": {
                                 "expression": {
-                                  "endPosition": "2593",
+                                  "endPosition": "3233",
                                   "kind": "IDENTIFIER",
                                   "name": "val",
-                                  "startPosition": "2590"
+                                  "startPosition": "3230"
                                 },
-                                "endPosition": "2593",
+                                "endPosition": "3233",
                                 "kind": "TYPEOF",
-                                "startPosition": "2583"
+                                "startPosition": "3223"
                               },
-                              "endPosition": "2959",
+                              "endPosition": "3599",
                               "kind": "SWITCH",
-                              "startPosition": "2575"
+                              "startPosition": "3215"
                             }
                           ],
-                          "startPosition": "2561"
+                          "startPosition": "3201"
                         },
-                        "endPosition": "2969",
+                        "endPosition": "3609",
                         "kind": "IF",
-                        "startPosition": "2343",
+                        "startPosition": "2983",
                         "thenStatement": {
-                          "endPosition": "2555",
+                          "endPosition": "3195",
                           "kind": "BLOCK",
                           "statements": [
                             {
-                              "endPosition": "2420",
+                              "endPosition": "3060",
                               "kind": "VARIABLE",
-                              "name": "arr",
-                              "startPosition": "2393",
+                              "binding": {
+                                "endPosition": "3036",
+                                "kind": "IDENTIFIER",
+                                "name": "arr",
+                                "startPosition": "3033"
+                              },
+                              "startPosition": "3029",
                               "initializer": {
                                 "constructorExpression": {
-                                  "endPosition": "2420",
+                                  "endPosition": "3060",
                                   "kind": "FUNCTION_INVOCATION",
                                   "functionSelect": {
-                                    "endPosition": "2408",
+                                    "endPosition": "3048",
                                     "kind": "IDENTIFIER",
                                     "name": "Array",
-                                    "startPosition": "2403"
+                                    "startPosition": "3043"
                                   },
                                   "arguments": [
                                     {
-                                      "endPosition": "2419",
+                                      "endPosition": "3059",
                                       "kind": "FUNCTION_INVOCATION",
                                       "functionSelect": {
                                         "identifier": "size",
                                         "expression": {
-                                          "endPosition": "2412",
+                                          "endPosition": "3052",
                                           "kind": "IDENTIFIER",
                                           "name": "val",
-                                          "startPosition": "2409"
+                                          "startPosition": "3049"
                                         },
-                                        "endPosition": "2417",
+                                        "endPosition": "3057",
                                         "kind": "MEMBER_SELECT",
-                                        "startPosition": "2409"
+                                        "startPosition": "3049"
                                       },
                                       "arguments": [],
-                                      "startPosition": "2409"
+                                      "startPosition": "3049"
                                     }
                                   ],
-                                  "startPosition": "2403"
+                                  "startPosition": "3043"
                                 },
-                                "endPosition": "2420",
+                                "endPosition": "3060",
                                 "kind": "NEW",
-                                "startPosition": "2399"
+                                "startPosition": "3039"
                               }
                             },
                             {
-                              "endPosition": "2444",
+                              "endPosition": "3084",
                               "kind": "VARIABLE",
-                              "name": "j",
-                              "startPosition": "2443"
+                              "binding": {
+                                "endPosition": "3084",
+                                "kind": "IDENTIFIER",
+                                "name": "j",
+                                "startPosition": "3083"
+                              },
+                              "startPosition": "3079"
                             },
                             {
                               "expression": {
-                                "endPosition": "2451",
+                                "endPosition": "3091",
                                 "kind": "IDENTIFIER",
                                 "name": "val",
-                                "startPosition": "2448"
+                                "startPosition": "3088"
                               },
-                              "endPosition": "2515",
+                              "endPosition": "3155",
                               "kind": "FOR_IN_LOOP",
                               "forEach": "false",
                               "variable": {
-                                "endPosition": "2444",
+                                "endPosition": "3084",
                                 "kind": "IDENTIFIER",
                                 "name": "j",
-                                "startPosition": "2443"
+                                "startPosition": "3083"
                               },
                               "statement": {
-                                "endPosition": "2515",
+                                "endPosition": "3155",
                                 "kind": "BLOCK",
                                 "statements": [
                                   {
                                     "expression": {
                                       "expression": {
-                                        "endPosition": "2500",
+                                        "endPosition": "3140",
                                         "kind": "FUNCTION_INVOCATION",
                                         "functionSelect": {
                                           "identifier": "convert",
                                           "expression": {
-                                            "endPosition": "2484",
+                                            "endPosition": "3124",
                                             "kind": "IDENTIFIER",
+                                            "this": "true",
                                             "name": "this",
-                                            "startPosition": "2480"
+                                            "startPosition": "3120"
                                           },
-                                          "endPosition": "2492",
+                                          "endPosition": "3132",
                                           "kind": "MEMBER_SELECT",
-                                          "startPosition": "2480"
+                                          "startPosition": "3120"
                                         },
                                         "arguments": [
                                           {
                                             "expression": {
-                                              "endPosition": "2496",
+                                              "endPosition": "3136",
                                               "kind": "IDENTIFIER",
                                               "name": "val",
-                                              "startPosition": "2493"
+                                              "startPosition": "3133"
                                             },
-                                            "endPosition": "2499",
+                                            "endPosition": "3139",
                                             "kind": "ARRAY_ACCESS",
                                             "index": {
-                                              "endPosition": "2498",
+                                              "endPosition": "3138",
                                               "kind": "IDENTIFIER",
                                               "name": "j",
-                                              "startPosition": "2497"
+                                              "startPosition": "3137"
                                             },
-                                            "startPosition": "2493"
+                                            "startPosition": "3133"
                                           }
                                         ],
-                                        "startPosition": "2480"
+                                        "startPosition": "3120"
                                       },
-                                      "endPosition": "2500",
+                                      "endPosition": "3140",
                                       "kind": "ASSIGNMENT",
                                       "variable": {
                                         "expression": {
-                                          "endPosition": "2474",
+                                          "endPosition": "3114",
                                           "kind": "IDENTIFIER",
                                           "name": "arr",
-                                          "startPosition": "2471"
+                                          "startPosition": "3111"
                                         },
-                                        "endPosition": "2477",
+                                        "endPosition": "3117",
                                         "kind": "ARRAY_ACCESS",
                                         "index": {
-                                          "endPosition": "2476",
+                                          "endPosition": "3116",
                                           "kind": "IDENTIFIER",
                                           "name": "j",
-                                          "startPosition": "2475"
+                                          "startPosition": "3115"
                                         },
-                                        "startPosition": "2471"
+                                        "startPosition": "3111"
                                       },
-                                      "startPosition": "2471"
+                                      "startPosition": "3111"
                                     },
-                                    "endPosition": "2500",
+                                    "endPosition": "3140",
                                     "kind": "EXPRESSION_STATEMENT",
-                                    "startPosition": "2471"
+                                    "startPosition": "3111"
                                   }
                                 ],
-                                "startPosition": "2453"
+                                "startPosition": "3093"
                               },
-                              "startPosition": "2434"
+                              "startPosition": "3074"
                             },
                             {
                               "expression": {
                                 "expression": {
-                                  "endPosition": "2544",
+                                  "endPosition": "3184",
                                   "kind": "IDENTIFIER",
                                   "name": "arr",
-                                  "startPosition": "2541"
+                                  "startPosition": "3181"
                                 },
-                                "endPosition": "2544",
+                                "endPosition": "3184",
                                 "kind": "ASSIGNMENT",
                                 "variable": {
                                   "expression": {
-                                    "endPosition": "2535",
+                                    "endPosition": "3175",
                                     "kind": "IDENTIFIER",
                                     "name": "result",
-                                    "startPosition": "2529"
+                                    "startPosition": "3169"
                                   },
-                                  "endPosition": "2538",
+                                  "endPosition": "3178",
                                   "kind": "ARRAY_ACCESS",
                                   "index": {
-                                    "endPosition": "2537",
+                                    "endPosition": "3177",
                                     "kind": "IDENTIFIER",
                                     "name": "i",
-                                    "startPosition": "2536"
+                                    "startPosition": "3176"
                                   },
-                                  "startPosition": "2529"
+                                  "startPosition": "3169"
                                 },
-                                "startPosition": "2529"
+                                "startPosition": "3169"
                               },
-                              "endPosition": "2544",
+                              "endPosition": "3184",
                               "kind": "EXPRESSION_STATEMENT",
-                              "startPosition": "2529"
+                              "startPosition": "3169"
                             }
                           ],
-                          "startPosition": "2375"
+                          "startPosition": "3015"
                         }
                       },
-                      "endPosition": "2969",
+                      "endPosition": "3609",
                       "kind": "IF",
-                      "startPosition": "2251",
+                      "startPosition": "2891",
                       "thenStatement": {
-                        "endPosition": "2337",
+                        "endPosition": "2977",
                         "kind": "BLOCK",
                         "statements": [
                           {
                             "expression": {
                               "expression": {
-                                "endPosition": "2326",
+                                "endPosition": "2966",
                                 "kind": "FUNCTION_INVOCATION",
                                 "functionSelect": {
                                   "identifier": "convert",
                                   "expression": {
-                                    "endPosition": "2313",
+                                    "endPosition": "2953",
                                     "kind": "IDENTIFIER",
+                                    "this": "true",
                                     "name": "this",
-                                    "startPosition": "2309"
+                                    "startPosition": "2949"
                                   },
-                                  "endPosition": "2321",
+                                  "endPosition": "2961",
                                   "kind": "MEMBER_SELECT",
-                                  "startPosition": "2309"
+                                  "startPosition": "2949"
                                 },
                                 "arguments": [
                                   {
-                                    "endPosition": "2325",
+                                    "endPosition": "2965",
                                     "kind": "IDENTIFIER",
                                     "name": "val",
-                                    "startPosition": "2322"
+                                    "startPosition": "2962"
                                   }
                                 ],
-                                "startPosition": "2309"
+                                "startPosition": "2949"
                               },
-                              "endPosition": "2326",
+                              "endPosition": "2966",
                               "kind": "ASSIGNMENT",
                               "variable": {
                                 "expression": {
-                                  "endPosition": "2303",
+                                  "endPosition": "2943",
                                   "kind": "IDENTIFIER",
                                   "name": "result",
-                                  "startPosition": "2297"
+                                  "startPosition": "2937"
                                 },
-                                "endPosition": "2306",
+                                "endPosition": "2946",
                                 "kind": "ARRAY_ACCESS",
                                 "index": {
-                                  "endPosition": "2305",
+                                  "endPosition": "2945",
                                   "kind": "IDENTIFIER",
                                   "name": "i",
-                                  "startPosition": "2304"
+                                  "startPosition": "2944"
                                 },
-                                "startPosition": "2297"
+                                "startPosition": "2937"
                               },
-                              "startPosition": "2297"
+                              "startPosition": "2937"
                             },
-                            "endPosition": "2326",
+                            "endPosition": "2966",
                             "kind": "EXPRESSION_STATEMENT",
-                            "startPosition": "2297"
+                            "startPosition": "2937"
                           }
                         ],
-                        "startPosition": "2283"
+                        "startPosition": "2923"
                       }
                     }
                   ],
@@ -6260,14 +6642,14 @@
               },
               {
                 "expression": {
-                  "endPosition": "2993",
+                  "endPosition": "3633",
                   "kind": "IDENTIFIER",
                   "name": "result",
-                  "startPosition": "2987"
+                  "startPosition": "3627"
                 },
-                "endPosition": "2994",
+                "endPosition": "3634",
                 "kind": "RETURN",
-                "startPosition": "2980"
+                "startPosition": "3620"
               }
             ],
             "startPosition": "2016"
@@ -6305,105 +6687,120 @@
         },
         "startPosition": "1974"
       },
-      "endPosition": "2996",
+      "endPosition": "3636",
       "kind": "EXPRESSION_STATEMENT",
       "startPosition": "1974"
     },
     {
-      "endPosition": "3726",
+      "endPosition": "4366",
       "kind": "FUNCTION",
-      "name": "processFiles",
+      "name": {
+        "endPosition": "3659",
+        "kind": "IDENTIFIER",
+        "name": "processFiles",
+        "startPosition": "3647"
+      },
       "body": {
-        "endPosition": "3724",
+        "endPosition": "4364",
         "kind": "BLOCK",
         "statements": [
           {
-            "endPosition": "3070",
+            "endPosition": "3710",
             "kind": "VARIABLE",
-            "name": "File",
-            "startPosition": "3038",
+            "binding": {
+              "endPosition": "3682",
+              "kind": "IDENTIFIER",
+              "name": "File",
+              "startPosition": "3678"
+            },
+            "startPosition": "3674",
             "initializer": {
-              "endPosition": "3070",
+              "endPosition": "3710",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "type",
                 "expression": {
-                  "endPosition": "3049",
+                  "endPosition": "3689",
                   "kind": "IDENTIFIER",
                   "name": "Java",
-                  "startPosition": "3045"
+                  "startPosition": "3685"
                 },
-                "endPosition": "3054",
+                "endPosition": "3694",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "3045"
+                "startPosition": "3685"
               },
               "arguments": [
                 {
-                  "endPosition": "3068",
+                  "endPosition": "3708",
                   "kind": "STRING_LITERAL",
                   "value": "java.io.File",
-                  "startPosition": "3056"
+                  "startPosition": "3696"
                 }
               ],
-              "startPosition": "3045"
+              "startPosition": "3685"
             }
           },
           {
-            "endPosition": "3126",
+            "endPosition": "3766",
             "kind": "VARIABLE",
-            "name": "files",
-            "startPosition": "3080",
+            "binding": {
+              "endPosition": "3725",
+              "kind": "IDENTIFIER",
+              "name": "files",
+              "startPosition": "3720"
+            },
+            "startPosition": "3716",
             "initializer": {
-              "endPosition": "3126",
+              "endPosition": "3766",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "listFiles",
                 "expression": {
                   "constructorExpression": {
-                    "endPosition": "3114",
+                    "endPosition": "3754",
                     "kind": "FUNCTION_INVOCATION",
                     "functionSelect": {
-                      "endPosition": "3096",
+                      "endPosition": "3736",
                       "kind": "IDENTIFIER",
                       "name": "File",
-                      "startPosition": "3092"
+                      "startPosition": "3732"
                     },
                     "arguments": [
                       {
                         "leftOperand": {
-                          "endPosition": "3104",
+                          "endPosition": "3744",
                           "kind": "IDENTIFIER",
                           "name": "__DIR__",
-                          "startPosition": "3097"
+                          "startPosition": "3737"
                         },
-                        "endPosition": "3113",
+                        "endPosition": "3753",
                         "kind": "PLUS",
                         "rightOperand": {
-                          "endPosition": "3113",
+                          "endPosition": "3753",
                           "kind": "IDENTIFIER",
                           "name": "subdir",
-                          "startPosition": "3107"
+                          "startPosition": "3747"
                         },
-                        "startPosition": "3097"
+                        "startPosition": "3737"
                       }
                     ],
-                    "startPosition": "3092"
+                    "startPosition": "3732"
                   },
-                  "endPosition": "3114",
+                  "endPosition": "3754",
                   "kind": "NEW",
-                  "startPosition": "3088"
+                  "startPosition": "3728"
                 },
-                "endPosition": "3124",
+                "endPosition": "3764",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "3088"
+                "startPosition": "3728"
               },
               "arguments": [],
-              "startPosition": "3088"
+              "startPosition": "3728"
             }
           },
           {
             "expression": {
-              "endPosition": "3160",
+              "endPosition": "3800",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "sort",
@@ -6412,751 +6809,786 @@
                   "expression": {
                     "identifier": "util",
                     "expression": {
-                      "endPosition": "3136",
+                      "endPosition": "3776",
                       "kind": "IDENTIFIER",
                       "name": "java",
-                      "startPosition": "3132"
+                      "startPosition": "3772"
                     },
-                    "endPosition": "3141",
+                    "endPosition": "3781",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "3132"
+                    "startPosition": "3772"
                   },
-                  "endPosition": "3148",
+                  "endPosition": "3788",
                   "kind": "MEMBER_SELECT",
-                  "startPosition": "3132"
+                  "startPosition": "3772"
                 },
-                "endPosition": "3153",
+                "endPosition": "3793",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "3132"
+                "startPosition": "3772"
               },
               "arguments": [
                 {
-                  "endPosition": "3159",
+                  "endPosition": "3799",
                   "kind": "IDENTIFIER",
                   "name": "files",
-                  "startPosition": "3154"
+                  "startPosition": "3794"
                 }
               ],
-              "startPosition": "3132"
+              "startPosition": "3772"
             },
-            "endPosition": "3160",
+            "endPosition": "3800",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3132"
+            "startPosition": "3772"
           },
           {
-            "endPosition": "3184",
+            "endPosition": "3824",
             "kind": "VARIABLE",
-            "name": "file",
-            "startPosition": "3180"
+            "binding": {
+              "endPosition": "3824",
+              "kind": "IDENTIFIER",
+              "name": "file",
+              "startPosition": "3820"
+            },
+            "startPosition": "3816"
           },
           {
             "expression": {
-              "endPosition": "3193",
+              "endPosition": "3833",
               "kind": "IDENTIFIER",
               "name": "files",
-              "startPosition": "3188"
+              "startPosition": "3828"
             },
-            "endPosition": "3724",
+            "endPosition": "4364",
             "kind": "FOR_IN_LOOP",
             "forEach": "true",
             "variable": {
-              "endPosition": "3184",
+              "endPosition": "3824",
               "kind": "IDENTIFIER",
               "name": "file",
-              "startPosition": "3180"
+              "startPosition": "3820"
             },
             "statement": {
-              "endPosition": "3724",
+              "endPosition": "4364",
               "kind": "BLOCK",
               "statements": [
                 {
                   "condition": {
-                    "endPosition": "3234",
+                    "endPosition": "3874",
                     "kind": "FUNCTION_INVOCATION",
                     "functionSelect": {
                       "identifier": "endsWith",
                       "expression": {
                         "identifier": "name",
                         "expression": {
-                          "endPosition": "3213",
+                          "endPosition": "3853",
                           "kind": "IDENTIFIER",
                           "name": "file",
-                          "startPosition": "3209"
+                          "startPosition": "3849"
                         },
-                        "endPosition": "3218",
+                        "endPosition": "3858",
                         "kind": "MEMBER_SELECT",
-                        "startPosition": "3209"
+                        "startPosition": "3849"
                       },
-                      "endPosition": "3227",
+                      "endPosition": "3867",
                       "kind": "MEMBER_SELECT",
-                      "startPosition": "3209"
+                      "startPosition": "3849"
                     },
                     "arguments": [
                       {
-                        "endPosition": "3232",
+                        "endPosition": "3872",
                         "kind": "STRING_LITERAL",
                         "value": ".js",
-                        "startPosition": "3229"
+                        "startPosition": "3869"
                       }
                     ],
-                    "startPosition": "3209"
+                    "startPosition": "3849"
                   },
-                  "endPosition": "3718",
+                  "endPosition": "4358",
                   "kind": "IF",
-                  "startPosition": "3205",
+                  "startPosition": "3845",
                   "thenStatement": {
-                    "endPosition": "3718",
+                    "endPosition": "4358",
                     "kind": "BLOCK",
                     "statements": [
                       {
-                        "endPosition": "3278",
+                        "endPosition": "3918",
                         "kind": "VARIABLE",
-                        "name": "script",
-                        "startPosition": "3254",
+                        "binding": {
+                          "endPosition": "3900",
+                          "kind": "IDENTIFIER",
+                          "name": "script",
+                          "startPosition": "3894"
+                        },
+                        "startPosition": "3890",
                         "initializer": {
-                          "endPosition": "3278",
+                          "endPosition": "3918",
                           "kind": "FUNCTION_INVOCATION",
                           "functionSelect": {
-                            "endPosition": "3272",
+                            "endPosition": "3912",
                             "kind": "IDENTIFIER",
                             "name": "readFully",
-                            "startPosition": "3263"
+                            "startPosition": "3903"
                           },
                           "arguments": [
                             {
-                              "endPosition": "3277",
+                              "endPosition": "3917",
                               "kind": "IDENTIFIER",
                               "name": "file",
-                              "startPosition": "3273"
+                              "startPosition": "3913"
                             }
                           ],
-                          "startPosition": "3263"
+                          "startPosition": "3903"
                         }
                       },
                       {
-                        "endPosition": "3317",
+                        "endPosition": "3957",
                         "kind": "VARIABLE",
-                        "name": "parser",
-                        "startPosition": "3296",
+                        "binding": {
+                          "endPosition": "3942",
+                          "kind": "IDENTIFIER",
+                          "name": "parser",
+                          "startPosition": "3936"
+                        },
+                        "startPosition": "3932",
                         "initializer": {
                           "constructorExpression": {
-                            "endPosition": "3317",
+                            "endPosition": "3957",
                             "kind": "FUNCTION_INVOCATION",
                             "functionSelect": {
-                              "endPosition": "3315",
+                              "endPosition": "3955",
                               "kind": "IDENTIFIER",
                               "name": "Parser",
-                              "startPosition": "3309"
+                              "startPosition": "3949"
                             },
                             "arguments": [],
-                            "startPosition": "3309"
+                            "startPosition": "3949"
                           },
-                          "endPosition": "3317",
+                          "endPosition": "3957",
                           "kind": "NEW",
-                          "startPosition": "3305"
+                          "startPosition": "3945"
                         }
                       },
                       {
-                        "endPosition": "3578",
+                        "endPosition": "4218",
                         "kind": "VARIABLE",
-                        "name": "tree",
-                        "startPosition": "3335",
+                        "binding": {
+                          "endPosition": "3979",
+                          "kind": "IDENTIFIER",
+                          "name": "tree",
+                          "startPosition": "3975"
+                        },
+                        "startPosition": "3971",
                         "initializer": {
-                          "endPosition": "3578",
+                          "endPosition": "4218",
                           "kind": "FUNCTION_INVOCATION",
                           "functionSelect": {
                             "identifier": "parse",
                             "expression": {
-                              "endPosition": "3348",
+                              "endPosition": "3988",
                               "kind": "IDENTIFIER",
                               "name": "parser",
-                              "startPosition": "3342"
+                              "startPosition": "3982"
                             },
-                            "endPosition": "3354",
+                            "endPosition": "3994",
                             "kind": "MEMBER_SELECT",
-                            "startPosition": "3342"
+                            "startPosition": "3982"
                           },
                           "arguments": [
                             {
                               "leftOperand": {
                                 "leftOperand": {
-                                  "endPosition": "3361",
+                                  "endPosition": "4001",
                                   "kind": "IDENTIFIER",
                                   "name": "subdir",
-                                  "startPosition": "3355"
+                                  "startPosition": "3995"
                                 },
-                                "endPosition": "3366",
+                                "endPosition": "4006",
                                 "kind": "PLUS",
                                 "rightOperand": {
-                                  "endPosition": "3366",
+                                  "endPosition": "4006",
                                   "kind": "STRING_LITERAL",
                                   "value": "/",
-                                  "startPosition": "3365"
+                                  "startPosition": "4005"
                                 },
-                                "startPosition": "3355"
+                                "startPosition": "3995"
                               },
-                              "endPosition": "3379",
+                              "endPosition": "4019",
                               "kind": "PLUS",
                               "rightOperand": {
                                 "identifier": "name",
                                 "expression": {
-                                  "endPosition": "3374",
+                                  "endPosition": "4014",
                                   "kind": "IDENTIFIER",
                                   "name": "file",
-                                  "startPosition": "3370"
+                                  "startPosition": "4010"
                                 },
-                                "endPosition": "3379",
+                                "endPosition": "4019",
                                 "kind": "MEMBER_SELECT",
-                                "startPosition": "3370"
+                                "startPosition": "4010"
                               },
-                              "startPosition": "3355"
+                              "startPosition": "3995"
                             },
                             {
-                              "endPosition": "3387",
+                              "endPosition": "4027",
                               "kind": "IDENTIFIER",
                               "name": "script",
-                              "startPosition": "3381"
+                              "startPosition": "4021"
                             },
                             {
-                              "endPosition": "3426",
+                              "endPosition": "4066",
                               "kind": "FUNCTION_EXPRESSION",
                               "body": {
-                                "endPosition": "3559",
+                                "endPosition": "4199",
                                 "kind": "BLOCK",
                                 "statements": [
                                   {
                                     "expression": {
-                                      "endPosition": "3526",
+                                      "endPosition": "4166",
                                       "kind": "FUNCTION_INVOCATION",
                                       "functionSelect": {
-                                        "endPosition": "3453",
+                                        "endPosition": "4093",
                                         "kind": "IDENTIFIER",
                                         "name": "print",
-                                        "startPosition": "3448"
+                                        "startPosition": "4088"
                                       },
                                       "arguments": [
                                         {
-                                          "endPosition": "3525",
+                                          "endPosition": "4165",
                                           "kind": "FUNCTION_INVOCATION",
                                           "functionSelect": {
                                             "identifier": "replace",
                                             "expression": {
-                                              "endPosition": "3505",
+                                              "endPosition": "4145",
                                               "kind": "FUNCTION_INVOCATION",
                                               "functionSelect": {
                                                 "identifier": "stringify",
                                                 "expression": {
-                                                  "endPosition": "3458",
+                                                  "endPosition": "4098",
                                                   "kind": "IDENTIFIER",
                                                   "name": "JSON",
-                                                  "startPosition": "3454"
+                                                  "startPosition": "4094"
                                                 },
-                                                "endPosition": "3468",
+                                                "endPosition": "4108",
                                                 "kind": "MEMBER_SELECT",
-                                                "startPosition": "3454"
+                                                "startPosition": "4094"
                                               },
                                               "arguments": [
                                                 {
-                                                  "endPosition": "3495",
+                                                  "endPosition": "4135",
                                                   "kind": "FUNCTION_INVOCATION",
                                                   "functionSelect": {
                                                     "identifier": "convert",
                                                     "expression": {
-                                                      "endPosition": "3475",
+                                                      "endPosition": "4115",
                                                       "kind": "IDENTIFIER",
                                                       "name": "parser",
-                                                      "startPosition": "3469"
+                                                      "startPosition": "4109"
                                                     },
-                                                    "endPosition": "3483",
+                                                    "endPosition": "4123",
                                                     "kind": "MEMBER_SELECT",
-                                                    "startPosition": "3469"
+                                                    "startPosition": "4109"
                                                   },
                                                   "arguments": [
                                                     {
-                                                      "endPosition": "3494",
+                                                      "endPosition": "4134",
                                                       "kind": "IDENTIFIER",
                                                       "name": "diagnostic",
-                                                      "startPosition": "3484"
+                                                      "startPosition": "4124"
                                                     }
                                                   ],
-                                                  "startPosition": "3469"
+                                                  "startPosition": "4109"
                                                 },
                                                 {
-                                                  "endPosition": "3501",
+                                                  "endPosition": "4141",
                                                   "kind": "NULL_LITERAL",
-                                                  "startPosition": "3497"
+                                                  "startPosition": "4137"
                                                 },
                                                 {
-                                                  "endPosition": "3504",
+                                                  "endPosition": "4144",
                                                   "kind": "NUMBER_LITERAL",
                                                   "value": "2",
-                                                  "startPosition": "3503"
+                                                  "startPosition": "4143"
                                                 }
                                               ],
-                                              "startPosition": "3454"
+                                              "startPosition": "4094"
                                             },
-                                            "endPosition": "3513",
+                                            "endPosition": "4153",
                                             "kind": "MEMBER_SELECT",
-                                            "startPosition": "3454"
+                                            "startPosition": "4094"
                                           },
                                           "arguments": [
                                             {
-                                              "endPosition": "3520",
+                                              "endPosition": "4160",
                                               "kind": "REGEXP_LITERAL",
                                               "options": "g",
                                               "pattern": "\\\\r",
-                                              "startPosition": "3514"
+                                              "startPosition": "4154"
                                             },
                                             {
-                                              "endPosition": "3523",
+                                              "endPosition": "4163",
                                               "kind": "STRING_LITERAL",
                                               "value": "",
-                                              "startPosition": "3523"
+                                              "startPosition": "4163"
                                             }
                                           ],
-                                          "startPosition": "3513"
+                                          "startPosition": "4153"
                                         }
                                       ],
-                                      "startPosition": "3448"
+                                      "startPosition": "4088"
                                     },
-                                    "endPosition": "3526",
+                                    "endPosition": "4166",
                                     "kind": "EXPRESSION_STATEMENT",
-                                    "startPosition": "3448"
+                                    "startPosition": "4088"
                                   },
                                   {
                                     "expression": {
-                                      "endPosition": "3558",
+                                      "endPosition": "4198",
                                       "kind": "FUNCTION_INVOCATION",
                                       "functionSelect": {
-                                        "endPosition": "3553",
+                                        "endPosition": "4193",
                                         "kind": "IDENTIFIER",
                                         "name": "print",
-                                        "startPosition": "3548"
+                                        "startPosition": "4188"
                                       },
                                       "arguments": [
                                         {
-                                          "endPosition": "3556",
+                                          "endPosition": "4196",
                                           "kind": "STRING_LITERAL",
                                           "value": ",",
-                                          "startPosition": "3555"
+                                          "startPosition": "4195"
                                         }
                                       ],
-                                      "startPosition": "3548"
+                                      "startPosition": "4188"
                                     },
-                                    "endPosition": "3558",
+                                    "endPosition": "4198",
                                     "kind": "EXPRESSION_STATEMENT",
-                                    "startPosition": "3548"
+                                    "startPosition": "4188"
                                   }
                                 ],
-                                "startPosition": "3426"
+                                "startPosition": "4066"
                               },
                               "strict": "false",
-                              "startPosition": "3426",
+                              "startPosition": "4066",
                               "parameters": [
                                 {
-                                  "endPosition": "3424",
+                                  "endPosition": "4064",
                                   "kind": "IDENTIFIER",
                                   "name": "diagnostic",
-                                  "startPosition": "3414"
+                                  "startPosition": "4054"
                                 }
                               ]
                             }
                           ],
-                          "startPosition": "3342"
+                          "startPosition": "3982"
                         }
                       },
                       {
                         "condition": {
                           "leftOperand": {
-                            "endPosition": "3601",
+                            "endPosition": "4241",
                             "kind": "IDENTIFIER",
                             "name": "tree",
-                            "startPosition": "3597"
+                            "startPosition": "4237"
                           },
-                          "endPosition": "3609",
+                          "endPosition": "4249",
                           "kind": "NOT_EQUAL_TO",
                           "rightOperand": {
-                            "endPosition": "3609",
+                            "endPosition": "4249",
                             "kind": "NULL_LITERAL",
-                            "startPosition": "3605"
+                            "startPosition": "4245"
                           },
-                          "startPosition": "3597"
+                          "startPosition": "4237"
                         },
-                        "endPosition": "3708",
+                        "endPosition": "4348",
                         "kind": "IF",
-                        "startPosition": "3593",
+                        "startPosition": "4233",
                         "thenStatement": {
-                          "endPosition": "3708",
+                          "endPosition": "4348",
                           "kind": "BLOCK",
                           "statements": [
                             {
                               "expression": {
-                                "endPosition": "3665",
+                                "endPosition": "4305",
                                 "kind": "FUNCTION_INVOCATION",
                                 "functionSelect": {
-                                  "endPosition": "3634",
+                                  "endPosition": "4274",
                                   "kind": "IDENTIFIER",
                                   "name": "print",
-                                  "startPosition": "3629"
+                                  "startPosition": "4269"
                                 },
                                 "arguments": [
                                   {
-                                    "endPosition": "3664",
+                                    "endPosition": "4304",
                                     "kind": "FUNCTION_INVOCATION",
                                     "functionSelect": {
                                       "identifier": "stringify",
                                       "expression": {
-                                        "endPosition": "3639",
+                                        "endPosition": "4279",
                                         "kind": "IDENTIFIER",
                                         "name": "JSON",
-                                        "startPosition": "3635"
+                                        "startPosition": "4275"
                                       },
-                                      "endPosition": "3649",
+                                      "endPosition": "4289",
                                       "kind": "MEMBER_SELECT",
-                                      "startPosition": "3635"
+                                      "startPosition": "4275"
                                     },
                                     "arguments": [
                                       {
-                                        "endPosition": "3654",
+                                        "endPosition": "4294",
                                         "kind": "IDENTIFIER",
                                         "name": "tree",
-                                        "startPosition": "3650"
+                                        "startPosition": "4290"
                                       },
                                       {
-                                        "endPosition": "3660",
+                                        "endPosition": "4300",
                                         "kind": "NULL_LITERAL",
-                                        "startPosition": "3656"
+                                        "startPosition": "4296"
                                       },
                                       {
-                                        "endPosition": "3663",
+                                        "endPosition": "4303",
                                         "kind": "NUMBER_LITERAL",
                                         "value": "2",
-                                        "startPosition": "3662"
+                                        "startPosition": "4302"
                                       }
                                     ],
-                                    "startPosition": "3635"
+                                    "startPosition": "4275"
                                   }
                                 ],
-                                "startPosition": "3629"
+                                "startPosition": "4269"
                               },
-                              "endPosition": "3665",
+                              "endPosition": "4305",
                               "kind": "EXPRESSION_STATEMENT",
-                              "startPosition": "3629"
+                              "startPosition": "4269"
                             },
                             {
                               "expression": {
-                                "endPosition": "3693",
+                                "endPosition": "4333",
                                 "kind": "FUNCTION_INVOCATION",
                                 "functionSelect": {
-                                  "endPosition": "3688",
+                                  "endPosition": "4328",
                                   "kind": "IDENTIFIER",
                                   "name": "print",
-                                  "startPosition": "3683"
+                                  "startPosition": "4323"
                                 },
                                 "arguments": [
                                   {
-                                    "endPosition": "3691",
+                                    "endPosition": "4331",
                                     "kind": "STRING_LITERAL",
                                     "value": ",",
-                                    "startPosition": "3690"
+                                    "startPosition": "4330"
                                   }
                                 ],
-                                "startPosition": "3683"
+                                "startPosition": "4323"
                               },
-                              "endPosition": "3693",
+                              "endPosition": "4333",
                               "kind": "EXPRESSION_STATEMENT",
-                              "startPosition": "3683"
+                              "startPosition": "4323"
                             }
                           ],
-                          "startPosition": "3611"
+                          "startPosition": "4251"
                         }
                       }
                     ],
-                    "startPosition": "3236"
+                    "startPosition": "3876"
                   }
                 }
               ],
-              "startPosition": "3195"
+              "startPosition": "3835"
             },
-            "startPosition": "3166"
+            "startPosition": "3806"
           }
         ],
-        "startPosition": "3028"
+        "startPosition": "3668"
       },
       "strict": "false",
-      "startPosition": "2998",
+      "startPosition": "3638",
       "parameters": [
         {
-          "endPosition": "3026",
+          "endPosition": "3666",
           "kind": "IDENTIFIER",
           "name": "subdir",
-          "startPosition": "3020"
+          "startPosition": "3660"
         }
       ]
     },
     {
-      "endPosition": "4070",
+      "endPosition": "4710",
       "kind": "FUNCTION",
-      "name": "main",
+      "name": {
+        "endPosition": "4421",
+        "kind": "IDENTIFIER",
+        "name": "main",
+        "startPosition": "4417"
+      },
       "body": {
-        "endPosition": "4068",
+        "endPosition": "4708",
         "kind": "BLOCK",
         "statements": [
           {
             "expression": {
-              "endPosition": "3800",
+              "endPosition": "4440",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3795",
+                "endPosition": "4435",
                 "kind": "IDENTIFIER",
                 "name": "print",
-                "startPosition": "3790"
+                "startPosition": "4430"
               },
               "arguments": [
                 {
-                  "endPosition": "3798",
+                  "endPosition": "4438",
                   "kind": "STRING_LITERAL",
                   "value": "[",
-                  "startPosition": "3797"
+                  "startPosition": "4437"
                 }
               ],
-              "startPosition": "3790"
+              "startPosition": "4430"
             },
-            "endPosition": "3800",
+            "endPosition": "4440",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3790"
+            "startPosition": "4430"
           },
           {
             "expression": {
-              "endPosition": "3834",
+              "endPosition": "4474",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3819",
+                "endPosition": "4459",
                 "kind": "IDENTIFIER",
                 "name": "processFiles",
-                "startPosition": "3807"
+                "startPosition": "4447"
               },
               "arguments": [
                 {
-                  "endPosition": "3832",
+                  "endPosition": "4472",
                   "kind": "STRING_LITERAL",
                   "value": "parsertests",
-                  "startPosition": "3821"
+                  "startPosition": "4461"
                 }
               ],
-              "startPosition": "3807"
+              "startPosition": "4447"
             },
-            "endPosition": "3834",
+            "endPosition": "4474",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3807"
+            "startPosition": "4447"
           },
           {
             "expression": {
-              "endPosition": "3875",
+              "endPosition": "4515",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3852",
+                "endPosition": "4492",
                 "kind": "IDENTIFIER",
                 "name": "processFiles",
-                "startPosition": "3840"
+                "startPosition": "4480"
               },
               "arguments": [
                 {
-                  "endPosition": "3873",
+                  "endPosition": "4513",
                   "kind": "STRING_LITERAL",
                   "value": "parsernegativetests",
-                  "startPosition": "3854"
+                  "startPosition": "4494"
                 }
               ],
-              "startPosition": "3840"
+              "startPosition": "4480"
             },
-            "endPosition": "3875",
+            "endPosition": "4515",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "3840"
+            "startPosition": "4480"
           },
           {
-            "endPosition": "3944",
+            "endPosition": "4584",
             "kind": "VARIABLE",
-            "name": "script",
-            "startPosition": "3916",
+            "binding": {
+              "endPosition": "4562",
+              "kind": "IDENTIFIER",
+              "name": "script",
+              "startPosition": "4556"
+            },
+            "startPosition": "4552",
             "initializer": {
-              "endPosition": "3944",
+              "endPosition": "4584",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "3934",
+                "endPosition": "4574",
                 "kind": "IDENTIFIER",
                 "name": "readFully",
-                "startPosition": "3925"
+                "startPosition": "4565"
               },
               "arguments": [
                 {
-                  "endPosition": "3943",
+                  "endPosition": "4583",
                   "kind": "IDENTIFIER",
                   "name": "__FILE__",
-                  "startPosition": "3935"
+                  "startPosition": "4575"
                 }
               ],
-              "startPosition": "3925"
+              "startPosition": "4565"
             }
           },
           {
-            "endPosition": "4009",
+            "endPosition": "4649",
             "kind": "VARIABLE",
-            "name": "tree",
-            "startPosition": "3954",
+            "binding": {
+              "endPosition": "4598",
+              "kind": "IDENTIFIER",
+              "name": "tree",
+              "startPosition": "4594"
+            },
+            "startPosition": "4590",
             "initializer": {
-              "endPosition": "4009",
+              "endPosition": "4649",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
                 "identifier": "parse",
                 "expression": {
                   "constructorExpression": {
-                    "endPosition": "3973",
+                    "endPosition": "4613",
                     "kind": "FUNCTION_INVOCATION",
                     "functionSelect": {
-                      "endPosition": "3971",
+                      "endPosition": "4611",
                       "kind": "IDENTIFIER",
                       "name": "Parser",
-                      "startPosition": "3965"
+                      "startPosition": "4605"
                     },
                     "arguments": [],
-                    "startPosition": "3965"
+                    "startPosition": "4605"
                   },
-                  "endPosition": "3973",
+                  "endPosition": "4613",
                   "kind": "NEW",
-                  "startPosition": "3961"
+                  "startPosition": "4601"
                 },
-                "endPosition": "3979",
+                "endPosition": "4619",
                 "kind": "MEMBER_SELECT",
-                "startPosition": "3961"
+                "startPosition": "4601"
               },
               "arguments": [
                 {
-                  "endPosition": "3993",
+                  "endPosition": "4633",
                   "kind": "STRING_LITERAL",
                   "value": "parserapi.js",
-                  "startPosition": "3981"
+                  "startPosition": "4621"
                 },
                 {
-                  "endPosition": "4002",
+                  "endPosition": "4642",
                   "kind": "IDENTIFIER",
                   "name": "script",
-                  "startPosition": "3996"
+                  "startPosition": "4636"
                 },
                 {
-                  "endPosition": "4008",
+                  "endPosition": "4648",
                   "kind": "NULL_LITERAL",
-                  "startPosition": "4004"
+                  "startPosition": "4644"
                 }
               ],
-              "startPosition": "3961"
+              "startPosition": "4601"
             }
           },
           {
             "expression": {
-              "endPosition": "4051",
+              "endPosition": "4691",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "4020",
+                "endPosition": "4660",
                 "kind": "IDENTIFIER",
                 "name": "print",
-                "startPosition": "4015"
+                "startPosition": "4655"
               },
               "arguments": [
                 {
-                  "endPosition": "4050",
+                  "endPosition": "4690",
                   "kind": "FUNCTION_INVOCATION",
                   "functionSelect": {
                     "identifier": "stringify",
                     "expression": {
-                      "endPosition": "4025",
+                      "endPosition": "4665",
                       "kind": "IDENTIFIER",
                       "name": "JSON",
-                      "startPosition": "4021"
+                      "startPosition": "4661"
                     },
-                    "endPosition": "4035",
+                    "endPosition": "4675",
                     "kind": "MEMBER_SELECT",
-                    "startPosition": "4021"
+                    "startPosition": "4661"
                   },
                   "arguments": [
                     {
-                      "endPosition": "4040",
+                      "endPosition": "4680",
                       "kind": "IDENTIFIER",
                       "name": "tree",
-                      "startPosition": "4036"
+                      "startPosition": "4676"
                     },
                     {
-                      "endPosition": "4046",
+                      "endPosition": "4686",
                       "kind": "NULL_LITERAL",
-                      "startPosition": "4042"
+                      "startPosition": "4682"
                     },
                     {
-                      "endPosition": "4049",
+                      "endPosition": "4689",
                       "kind": "NUMBER_LITERAL",
                       "value": "2",
-                      "startPosition": "4048"
+                      "startPosition": "4688"
                     }
                   ],
-                  "startPosition": "4021"
+                  "startPosition": "4661"
                 }
               ],
-              "startPosition": "4015"
+              "startPosition": "4655"
             },
-            "endPosition": "4051",
+            "endPosition": "4691",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "4015"
+            "startPosition": "4655"
           },
           {
             "expression": {
-              "endPosition": "4067",
+              "endPosition": "4707",
               "kind": "FUNCTION_INVOCATION",
               "functionSelect": {
-                "endPosition": "4062",
+                "endPosition": "4702",
                 "kind": "IDENTIFIER",
                 "name": "print",
-                "startPosition": "4057"
+                "startPosition": "4697"
               },
               "arguments": [
                 {
-                  "endPosition": "4065",
+                  "endPosition": "4705",
                   "kind": "STRING_LITERAL",
                   "value": "]",
-                  "startPosition": "4064"
+                  "startPosition": "4704"
                 }
               ],
-              "startPosition": "4057"
+              "startPosition": "4697"
             },
-            "endPosition": "4067",
+            "endPosition": "4707",
             "kind": "EXPRESSION_STATEMENT",
-            "startPosition": "4057"
+            "startPosition": "4697"
           }
         ],
-        "startPosition": "3784"
+        "startPosition": "4424"
       },
       "strict": "false",
-      "startPosition": "3768",
+      "startPosition": "4408",
       "parameters": []
     },
     {
       "expression": {
-        "endPosition": "4078",
+        "endPosition": "4718",
         "kind": "FUNCTION_INVOCATION",
         "functionSelect": {
-          "endPosition": "4076",
+          "endPosition": "4716",
           "kind": "IDENTIFIER",
           "name": "main",
-          "startPosition": "4072"
+          "startPosition": "4712"
         },
         "arguments": [],
-        "startPosition": "4072"
-      },
-      "endPosition": "4078",
+        "startPosition": "4712"
+      },
+      "endPosition": "4718",
       "kind": "EXPRESSION_STATEMENT",
-      "startPosition": "4072"
+      "startPosition": "4712"
     }
   ],
   "sourceName": "parserapi.js",
   "strict": "false",
   "startPosition": "1136"
-}
-]
+}
+]
--- a/nashorn/test/script/nosecurity/parservisitor.js	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/test/script/nosecurity/parservisitor.js	Tue Jul 12 21:18:13 2016 +0530
@@ -202,7 +202,7 @@
 parse("funcdecl.js", "function func() {}", 
     new (Java.extend(SimpleTreeVisitor))() {
         visitFunctionDeclaration: function(fd) {
-            print("in visitFunctionDeclaration " + fd.name);
+            print("in visitFunctionDeclaration " + fd.name.name);
         }
     });
 
@@ -361,7 +361,7 @@
 parse("var.js", "var x = 34;", 
     new (Java.extend(SimpleTreeVisitor))() {
         visitVariable: function(vn) {
-            print("in visitVariable " + vn.name + " = " + vn.initializer.value);
+            print("in visitVariable " + vn.binding.name + " = " + vn.initializer.value);
         }
     });
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/arrow.js	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+/**
+ * Tests to check representation of ES6 arrows.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+load(__DIR__ + "utils.js")
+
+var code = <<EOF
+
+var f = x=>x*2;
+[].map(v => v + 1);
+
+EOF
+
+parse("arrow.js", code, "--language=es6", new (Java.extend(visitor_es6, {
+    visitVariable : function (node, obj) {
+        obj.push(convert(node))
+    },
+    visitExpressionStatement : function (node, obj) {
+        obj.push(convert(node))
+    }
+})))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/arrow.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,103 @@
+[
+  {
+    "endPosition": "15",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "6",
+      "kind": "IDENTIFIER",
+      "name": "f",
+      "startPosition": "5"
+    },
+    "startPosition": "1",
+    "initializer": {
+      "endPosition": "12",
+      "arrow": "true",
+      "kind": "FUNCTION_EXPRESSION",
+      "name": "null",
+      "body": {
+        "leftOperand": {
+          "endPosition": "13",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "12"
+        },
+        "endPosition": "15",
+        "kind": "MULTIPLY",
+        "rightOperand": {
+          "endPosition": "15",
+          "kind": "NUMBER_LITERAL",
+          "value": "2",
+          "startPosition": "14"
+        },
+        "startPosition": "12"
+      },
+      "strict": "false",
+      "startPosition": "12",
+      "parameters": [
+        {
+          "endPosition": "10",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "9"
+        }
+      ]
+    }
+  },
+  {
+    "expression": {
+      "endPosition": "35",
+      "kind": "FUNCTION_INVOCATION",
+      "functionSelect": {
+        "identifier": "map",
+        "expression": {
+          "endPosition": "19",
+          "kind": "ARRAY_LITERAL",
+          "elements": [],
+          "startPosition": "17"
+        },
+        "endPosition": "23",
+        "kind": "MEMBER_SELECT",
+        "startPosition": "17"
+      },
+      "arguments": [
+        {
+          "endPosition": "29",
+          "arrow": "true",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": "null",
+          "body": {
+            "leftOperand": {
+              "endPosition": "30",
+              "kind": "IDENTIFIER",
+              "name": "v",
+              "startPosition": "29"
+            },
+            "endPosition": "34",
+            "kind": "PLUS",
+            "rightOperand": {
+              "endPosition": "34",
+              "kind": "NUMBER_LITERAL",
+              "value": "1",
+              "startPosition": "33"
+            },
+            "startPosition": "29"
+          },
+          "strict": "false",
+          "startPosition": "29",
+          "parameters": [
+            {
+              "endPosition": "25",
+              "kind": "IDENTIFIER",
+              "name": "v",
+              "startPosition": "24"
+            }
+          ]
+        }
+      ],
+      "startPosition": "17"
+    },
+    "endPosition": "35",
+    "kind": "EXPRESSION_STATEMENT",
+    "startPosition": "17"
+  }
+]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/arrow_params.js	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+/**
+ * Tests to check representation of ES6 arrow params.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+load(__DIR__ + "utils.js")
+
+var code = <<EOF
+
+var f1 = (x=2)=>x*3;
+var f2 = ({x, y})=>x*y;
+var f3 = ([x, y])=>x+y;
+var f4 = ({x, y}={y: 4, x: 5})=>x*y;
+var f5 = ([x, y]=[3, 6])=>x+y;
+
+EOF
+
+parse("arrow_params.js", code, "--language=es6", new (Java.extend(visitor_es6, {
+    visitVariable : function (node, obj) {
+        obj.push(convert(node))
+    }
+})))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/arrow_params.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,411 @@
+[
+  {
+    "endPosition": "20",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "7",
+      "kind": "IDENTIFIER",
+      "name": "f1",
+      "startPosition": "5"
+    },
+    "startPosition": "1",
+    "initializer": {
+      "endPosition": "17",
+      "arrow": "true",
+      "kind": "FUNCTION_EXPRESSION",
+      "name": "null",
+      "body": {
+        "leftOperand": {
+          "endPosition": "18",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "17"
+        },
+        "endPosition": "20",
+        "kind": "MULTIPLY",
+        "rightOperand": {
+          "endPosition": "20",
+          "kind": "NUMBER_LITERAL",
+          "value": "3",
+          "startPosition": "19"
+        },
+        "startPosition": "17"
+      },
+      "strict": "false",
+      "startPosition": "17",
+      "parameters": [
+        {
+          "expression": {
+            "endPosition": "14",
+            "kind": "NUMBER_LITERAL",
+            "value": "2",
+            "startPosition": "13"
+          },
+          "endPosition": "14",
+          "kind": "ASSIGNMENT",
+          "variable": {
+            "endPosition": "12",
+            "kind": "IDENTIFIER",
+            "name": "x",
+            "startPosition": "11"
+          },
+          "startPosition": "11"
+        }
+      ]
+    }
+  },
+  {
+    "endPosition": "44",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "28",
+      "kind": "IDENTIFIER",
+      "name": "f2",
+      "startPosition": "26"
+    },
+    "startPosition": "22",
+    "initializer": {
+      "endPosition": "41",
+      "arrow": "true",
+      "kind": "FUNCTION_EXPRESSION",
+      "name": "null",
+      "body": {
+        "leftOperand": {
+          "endPosition": "42",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "41"
+        },
+        "endPosition": "44",
+        "kind": "MULTIPLY",
+        "rightOperand": {
+          "endPosition": "44",
+          "kind": "IDENTIFIER",
+          "name": "y",
+          "startPosition": "43"
+        },
+        "startPosition": "41"
+      },
+      "strict": "false",
+      "startPosition": "41",
+      "parameters": [
+        {
+          "endPosition": "38",
+          "kind": "OBJECT_LITERAL",
+          "startPosition": "32",
+          "properties": [
+            {
+              "getter": "null",
+              "endPosition": "34",
+              "kind": "PROPERTY",
+              "setter": "null",
+              "value": {
+                "endPosition": "34",
+                "kind": "IDENTIFIER",
+                "name": "x",
+                "startPosition": "33"
+              },
+              "startPosition": "33",
+              "key": {
+                "endPosition": "34",
+                "kind": "IDENTIFIER",
+                "name": "x",
+                "startPosition": "33"
+              }
+            },
+            {
+              "getter": "null",
+              "endPosition": "37",
+              "kind": "PROPERTY",
+              "setter": "null",
+              "value": {
+                "endPosition": "37",
+                "kind": "IDENTIFIER",
+                "name": "y",
+                "startPosition": "36"
+              },
+              "startPosition": "36",
+              "key": {
+                "endPosition": "37",
+                "kind": "IDENTIFIER",
+                "name": "y",
+                "startPosition": "36"
+              }
+            }
+          ]
+        }
+      ]
+    }
+  },
+  {
+    "endPosition": "68",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "52",
+      "kind": "IDENTIFIER",
+      "name": "f3",
+      "startPosition": "50"
+    },
+    "startPosition": "46",
+    "initializer": {
+      "endPosition": "65",
+      "arrow": "true",
+      "kind": "FUNCTION_EXPRESSION",
+      "name": "null",
+      "body": {
+        "leftOperand": {
+          "endPosition": "66",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "65"
+        },
+        "endPosition": "68",
+        "kind": "PLUS",
+        "rightOperand": {
+          "endPosition": "68",
+          "kind": "IDENTIFIER",
+          "name": "y",
+          "startPosition": "67"
+        },
+        "startPosition": "65"
+      },
+      "strict": "false",
+      "startPosition": "65",
+      "parameters": [
+        {
+          "endPosition": "62",
+          "kind": "ARRAY_LITERAL",
+          "elements": [
+            {
+              "endPosition": "58",
+              "kind": "IDENTIFIER",
+              "name": "x",
+              "startPosition": "57"
+            },
+            {
+              "endPosition": "61",
+              "kind": "IDENTIFIER",
+              "name": "y",
+              "startPosition": "60"
+            }
+          ],
+          "startPosition": "56"
+        }
+      ]
+    }
+  },
+  {
+    "endPosition": "105",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "76",
+      "kind": "IDENTIFIER",
+      "name": "f4",
+      "startPosition": "74"
+    },
+    "startPosition": "70",
+    "initializer": {
+      "endPosition": "102",
+      "arrow": "true",
+      "kind": "FUNCTION_EXPRESSION",
+      "name": "null",
+      "body": {
+        "leftOperand": {
+          "endPosition": "103",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "102"
+        },
+        "endPosition": "105",
+        "kind": "MULTIPLY",
+        "rightOperand": {
+          "endPosition": "105",
+          "kind": "IDENTIFIER",
+          "name": "y",
+          "startPosition": "104"
+        },
+        "startPosition": "102"
+      },
+      "strict": "false",
+      "startPosition": "102",
+      "parameters": [
+        {
+          "expression": {
+            "endPosition": "99",
+            "kind": "OBJECT_LITERAL",
+            "startPosition": "87",
+            "properties": [
+              {
+                "getter": "null",
+                "endPosition": "92",
+                "kind": "PROPERTY",
+                "setter": "null",
+                "value": {
+                  "endPosition": "92",
+                  "kind": "NUMBER_LITERAL",
+                  "value": "4",
+                  "startPosition": "91"
+                },
+                "startPosition": "88",
+                "key": {
+                  "endPosition": "89",
+                  "kind": "IDENTIFIER",
+                  "name": "y",
+                  "startPosition": "88"
+                }
+              },
+              {
+                "getter": "null",
+                "endPosition": "98",
+                "kind": "PROPERTY",
+                "setter": "null",
+                "value": {
+                  "endPosition": "98",
+                  "kind": "NUMBER_LITERAL",
+                  "value": "5",
+                  "startPosition": "97"
+                },
+                "startPosition": "94",
+                "key": {
+                  "endPosition": "95",
+                  "kind": "IDENTIFIER",
+                  "name": "x",
+                  "startPosition": "94"
+                }
+              }
+            ]
+          },
+          "endPosition": "99",
+          "kind": "ASSIGNMENT",
+          "variable": {
+            "endPosition": "86",
+            "kind": "OBJECT_LITERAL",
+            "startPosition": "80",
+            "properties": [
+              {
+                "getter": "null",
+                "endPosition": "82",
+                "kind": "PROPERTY",
+                "setter": "null",
+                "value": {
+                  "endPosition": "82",
+                  "kind": "IDENTIFIER",
+                  "name": "x",
+                  "startPosition": "81"
+                },
+                "startPosition": "81",
+                "key": {
+                  "endPosition": "82",
+                  "kind": "IDENTIFIER",
+                  "name": "x",
+                  "startPosition": "81"
+                }
+              },
+              {
+                "getter": "null",
+                "endPosition": "85",
+                "kind": "PROPERTY",
+                "setter": "null",
+                "value": {
+                  "endPosition": "85",
+                  "kind": "IDENTIFIER",
+                  "name": "y",
+                  "startPosition": "84"
+                },
+                "startPosition": "84",
+                "key": {
+                  "endPosition": "85",
+                  "kind": "IDENTIFIER",
+                  "name": "y",
+                  "startPosition": "84"
+                }
+              }
+            ]
+          },
+          "startPosition": "80"
+        }
+      ]
+    }
+  },
+  {
+    "endPosition": "136",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "113",
+      "kind": "IDENTIFIER",
+      "name": "f5",
+      "startPosition": "111"
+    },
+    "startPosition": "107",
+    "initializer": {
+      "endPosition": "133",
+      "arrow": "true",
+      "kind": "FUNCTION_EXPRESSION",
+      "name": "null",
+      "body": {
+        "leftOperand": {
+          "endPosition": "134",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "133"
+        },
+        "endPosition": "136",
+        "kind": "PLUS",
+        "rightOperand": {
+          "endPosition": "136",
+          "kind": "IDENTIFIER",
+          "name": "y",
+          "startPosition": "135"
+        },
+        "startPosition": "133"
+      },
+      "strict": "false",
+      "startPosition": "133",
+      "parameters": [
+        {
+          "expression": {
+            "endPosition": "130",
+            "kind": "ARRAY_LITERAL",
+            "elements": [
+              {
+                "endPosition": "126",
+                "kind": "NUMBER_LITERAL",
+                "value": "3",
+                "startPosition": "125"
+              },
+              {
+                "endPosition": "129",
+                "kind": "NUMBER_LITERAL",
+                "value": "6",
+                "startPosition": "128"
+              }
+            ],
+            "startPosition": "124"
+          },
+          "endPosition": "130",
+          "kind": "ASSIGNMENT",
+          "variable": {
+            "endPosition": "123",
+            "kind": "ARRAY_LITERAL",
+            "elements": [
+              {
+                "endPosition": "119",
+                "kind": "IDENTIFIER",
+                "name": "x",
+                "startPosition": "118"
+              },
+              {
+                "endPosition": "122",
+                "kind": "IDENTIFIER",
+                "name": "y",
+                "startPosition": "121"
+              }
+            ],
+            "startPosition": "117"
+          },
+          "startPosition": "117"
+        }
+      ]
+    }
+  }
+]
--- a/nashorn/test/script/nosecurity/treeapi/assignment.js.EXPECTED	Wed Jul 05 21:57:11 2017 +0200
+++ b/nashorn/test/script/nosecurity/treeapi/assignment.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -146,4 +146,4 @@
     },
     "startPosition": "61"
   }
-]
+]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/class.js	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,91 @@
+/*
+ * 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.
+ */
+
+/**
+ * Tests to check representation of ES6 class.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+load(__DIR__ + "utils.js")
+
+var code = <<EOF
+
+class Shape {
+    constructor() {
+        Shape.numShapes++;
+    }
+
+    static get numShapes() {
+        return !this.count_ ? 0 : this.count_
+    }
+
+    static set numShapes(val) {
+         this.count_ = val
+    }
+}
+
+class Circle extends Shape {
+    constructor(radius) {
+        super();
+        this.radius_ = radius
+        Circle.numCircles++
+    }
+
+    static draw(circle, canvas) {
+        // drawing code
+    }
+
+    static get numCircles() {
+        return !this.count_ ? 0 : this.count_
+    }
+
+    static set numCircles(val) {
+         this.count_ = val
+    }
+
+    area() {
+        return Math.pow(this.radius, 2) * Math.PI
+    }
+
+    get radius() {
+        return this.radius_
+    }
+
+    set radius(radius) {
+        if (!Number.isInteger(radius))
+            throw new TypeError("Circle radius is not an int");
+        this.radius_ = radius
+    }
+}
+
+EOF
+
+parse("class.js", code, "--language=es6", new (Java.extend(visitor_es6, {
+    visitClassDeclaration : function (node, obj) {
+        obj.push(convert(node))
+    }
+})))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/class.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,751 @@
+[
+  {
+    "classElements": [
+      {
+        "getter": {
+          "endPosition": "96",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": "null",
+          "body": {
+            "endPosition": "143",
+            "kind": "BLOCK",
+            "statements": [
+              {
+                "expression": {
+                  "condition": {
+                    "expression": {
+                      "identifier": "count_",
+                      "expression": {
+                        "endPosition": "118",
+                        "kind": "IDENTIFIER",
+                        "this": "true",
+                        "name": "this",
+                        "startPosition": "114"
+                      },
+                      "endPosition": "125",
+                      "kind": "MEMBER_SELECT",
+                      "startPosition": "114"
+                    },
+                    "endPosition": "125",
+                    "kind": "LOGICAL_COMPLEMENT",
+                    "startPosition": "113"
+                  },
+                  "endPosition": "143",
+                  "kind": "CONDITIONAL_EXPRESSION",
+                  "trueExpression": {
+                    "endPosition": "129",
+                    "kind": "NUMBER_LITERAL",
+                    "value": "0",
+                    "startPosition": "128"
+                  },
+                  "falseExpression": {
+                    "identifier": "count_",
+                    "expression": {
+                      "endPosition": "136",
+                      "kind": "IDENTIFIER",
+                      "this": "true",
+                      "name": "this",
+                      "startPosition": "132"
+                    },
+                    "endPosition": "143",
+                    "kind": "MEMBER_SELECT",
+                    "startPosition": "132"
+                  },
+                  "startPosition": "126"
+                },
+                "endPosition": "143",
+                "kind": "RETURN",
+                "startPosition": "106"
+              }
+            ],
+            "startPosition": "96"
+          },
+          "strict": "true",
+          "startPosition": "96",
+          "parameters": []
+        },
+        "static": "true",
+        "endPosition": "149",
+        "kind": "PROPERTY",
+        "setter": {
+          "endPosition": "181",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": "null",
+          "body": {
+            "endPosition": "209",
+            "kind": "BLOCK",
+            "statements": [
+              {
+                "expression": {
+                  "expression": {
+                    "endPosition": "209",
+                    "kind": "IDENTIFIER",
+                    "name": "val",
+                    "startPosition": "206"
+                  },
+                  "endPosition": "209",
+                  "kind": "ASSIGNMENT",
+                  "variable": {
+                    "identifier": "count_",
+                    "expression": {
+                      "endPosition": "196",
+                      "kind": "IDENTIFIER",
+                      "this": "true",
+                      "name": "this",
+                      "startPosition": "192"
+                    },
+                    "endPosition": "203",
+                    "kind": "MEMBER_SELECT",
+                    "startPosition": "192"
+                  },
+                  "startPosition": "192"
+                },
+                "endPosition": "209",
+                "kind": "EXPRESSION_STATEMENT",
+                "startPosition": "192"
+              }
+            ],
+            "startPosition": "181"
+          },
+          "strict": "true",
+          "startPosition": "181",
+          "parameters": [
+            {
+              "endPosition": "179",
+              "kind": "IDENTIFIER",
+              "name": "val",
+              "startPosition": "176"
+            }
+          ]
+        },
+        "value": "null",
+        "startPosition": "80",
+        "key": {
+          "endPosition": "93",
+          "kind": "IDENTIFIER",
+          "name": "numShapes",
+          "startPosition": "84"
+        }
+      }
+    ],
+    "endPosition": "12",
+    "kind": "CLASS",
+    "classHeritage": "null",
+    "name": {
+      "endPosition": "12",
+      "kind": "IDENTIFIER",
+      "name": "Shape",
+      "startPosition": "7"
+    },
+    "constructor": {
+      "getter": "null",
+      "endPosition": "67",
+      "kind": "PROPERTY",
+      "setter": "null",
+      "value": {
+        "endPosition": "33",
+        "kind": "FUNCTION_EXPRESSION",
+        "name": {
+          "endPosition": "30",
+          "kind": "IDENTIFIER",
+          "name": "constructor",
+          "startPosition": "19"
+        },
+        "body": {
+          "endPosition": "61",
+          "kind": "BLOCK",
+          "statements": [
+            {
+              "expression": {
+                "expression": {
+                  "identifier": "numShapes",
+                  "expression": {
+                    "endPosition": "48",
+                    "kind": "IDENTIFIER",
+                    "name": "Shape",
+                    "startPosition": "43"
+                  },
+                  "endPosition": "58",
+                  "kind": "MEMBER_SELECT",
+                  "startPosition": "43"
+                },
+                "endPosition": "60",
+                "kind": "POSTFIX_INCREMENT",
+                "startPosition": "43"
+              },
+              "endPosition": "60",
+              "kind": "EXPRESSION_STATEMENT",
+              "startPosition": "43"
+            }
+          ],
+          "startPosition": "33"
+        },
+        "strict": "true",
+        "startPosition": "33",
+        "parameters": []
+      },
+      "startPosition": "19",
+      "key": {
+        "endPosition": "30",
+        "kind": "IDENTIFIER",
+        "name": "constructor",
+        "startPosition": "19"
+      }
+    },
+    "startPosition": "1"
+  },
+  {
+    "classElements": [
+      {
+        "getter": "null",
+        "static": "true",
+        "endPosition": "419",
+        "kind": "PROPERTY",
+        "setter": "null",
+        "value": {
+          "endPosition": "388",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": {
+            "endPosition": "371",
+            "kind": "IDENTIFIER",
+            "name": "draw",
+            "startPosition": "367"
+          },
+          "body": {
+            "endPosition": "389",
+            "kind": "BLOCK",
+            "statements": [],
+            "startPosition": "388"
+          },
+          "strict": "true",
+          "startPosition": "388",
+          "parameters": [
+            {
+              "endPosition": "378",
+              "kind": "IDENTIFIER",
+              "name": "circle",
+              "startPosition": "372"
+            },
+            {
+              "endPosition": "386",
+              "kind": "IDENTIFIER",
+              "name": "canvas",
+              "startPosition": "380"
+            }
+          ]
+        },
+        "startPosition": "367",
+        "key": {
+          "endPosition": "371",
+          "kind": "IDENTIFIER",
+          "name": "draw",
+          "startPosition": "367"
+        }
+      },
+      {
+        "getter": {
+          "endPosition": "449",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": "null",
+          "body": {
+            "endPosition": "496",
+            "kind": "BLOCK",
+            "statements": [
+              {
+                "expression": {
+                  "condition": {
+                    "expression": {
+                      "identifier": "count_",
+                      "expression": {
+                        "endPosition": "471",
+                        "kind": "IDENTIFIER",
+                        "this": "true",
+                        "name": "this",
+                        "startPosition": "467"
+                      },
+                      "endPosition": "478",
+                      "kind": "MEMBER_SELECT",
+                      "startPosition": "467"
+                    },
+                    "endPosition": "478",
+                    "kind": "LOGICAL_COMPLEMENT",
+                    "startPosition": "466"
+                  },
+                  "endPosition": "496",
+                  "kind": "CONDITIONAL_EXPRESSION",
+                  "trueExpression": {
+                    "endPosition": "482",
+                    "kind": "NUMBER_LITERAL",
+                    "value": "0",
+                    "startPosition": "481"
+                  },
+                  "falseExpression": {
+                    "identifier": "count_",
+                    "expression": {
+                      "endPosition": "489",
+                      "kind": "IDENTIFIER",
+                      "this": "true",
+                      "name": "this",
+                      "startPosition": "485"
+                    },
+                    "endPosition": "496",
+                    "kind": "MEMBER_SELECT",
+                    "startPosition": "485"
+                  },
+                  "startPosition": "479"
+                },
+                "endPosition": "496",
+                "kind": "RETURN",
+                "startPosition": "459"
+              }
+            ],
+            "startPosition": "449"
+          },
+          "strict": "true",
+          "startPosition": "449",
+          "parameters": []
+        },
+        "static": "true",
+        "endPosition": "502",
+        "kind": "PROPERTY",
+        "setter": {
+          "endPosition": "535",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": "null",
+          "body": {
+            "endPosition": "563",
+            "kind": "BLOCK",
+            "statements": [
+              {
+                "expression": {
+                  "expression": {
+                    "endPosition": "563",
+                    "kind": "IDENTIFIER",
+                    "name": "val",
+                    "startPosition": "560"
+                  },
+                  "endPosition": "563",
+                  "kind": "ASSIGNMENT",
+                  "variable": {
+                    "identifier": "count_",
+                    "expression": {
+                      "endPosition": "550",
+                      "kind": "IDENTIFIER",
+                      "this": "true",
+                      "name": "this",
+                      "startPosition": "546"
+                    },
+                    "endPosition": "557",
+                    "kind": "MEMBER_SELECT",
+                    "startPosition": "546"
+                  },
+                  "startPosition": "546"
+                },
+                "endPosition": "563",
+                "kind": "EXPRESSION_STATEMENT",
+                "startPosition": "546"
+              }
+            ],
+            "startPosition": "535"
+          },
+          "strict": "true",
+          "startPosition": "535",
+          "parameters": [
+            {
+              "endPosition": "533",
+              "kind": "IDENTIFIER",
+              "name": "val",
+              "startPosition": "530"
+            }
+          ]
+        },
+        "value": "null",
+        "startPosition": "432",
+        "key": {
+          "endPosition": "446",
+          "kind": "IDENTIFIER",
+          "name": "numCircles",
+          "startPosition": "436"
+        }
+      },
+      {
+        "getter": "null",
+        "endPosition": "639",
+        "kind": "PROPERTY",
+        "setter": "null",
+        "value": {
+          "endPosition": "582",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": {
+            "endPosition": "579",
+            "kind": "IDENTIFIER",
+            "name": "area",
+            "startPosition": "575"
+          },
+          "body": {
+            "endPosition": "633",
+            "kind": "BLOCK",
+            "statements": [
+              {
+                "expression": {
+                  "leftOperand": {
+                    "endPosition": "623",
+                    "kind": "FUNCTION_INVOCATION",
+                    "functionSelect": {
+                      "identifier": "pow",
+                      "expression": {
+                        "endPosition": "603",
+                        "kind": "IDENTIFIER",
+                        "name": "Math",
+                        "startPosition": "599"
+                      },
+                      "endPosition": "607",
+                      "kind": "MEMBER_SELECT",
+                      "startPosition": "599"
+                    },
+                    "arguments": [
+                      {
+                        "identifier": "radius",
+                        "expression": {
+                          "endPosition": "612",
+                          "kind": "IDENTIFIER",
+                          "this": "true",
+                          "name": "this",
+                          "startPosition": "608"
+                        },
+                        "endPosition": "619",
+                        "kind": "MEMBER_SELECT",
+                        "startPosition": "608"
+                      },
+                      {
+                        "endPosition": "622",
+                        "kind": "NUMBER_LITERAL",
+                        "value": "2",
+                        "startPosition": "621"
+                      }
+                    ],
+                    "startPosition": "599"
+                  },
+                  "endPosition": "633",
+                  "kind": "MULTIPLY",
+                  "rightOperand": {
+                    "identifier": "PI",
+                    "expression": {
+                      "endPosition": "630",
+                      "kind": "IDENTIFIER",
+                      "name": "Math",
+                      "startPosition": "626"
+                    },
+                    "endPosition": "633",
+                    "kind": "MEMBER_SELECT",
+                    "startPosition": "626"
+                  },
+                  "startPosition": "599"
+                },
+                "endPosition": "633",
+                "kind": "RETURN",
+                "startPosition": "592"
+              }
+            ],
+            "startPosition": "582"
+          },
+          "strict": "true",
+          "startPosition": "582",
+          "parameters": []
+        },
+        "startPosition": "575",
+        "key": {
+          "endPosition": "579",
+          "kind": "IDENTIFIER",
+          "name": "area",
+          "startPosition": "575"
+        }
+      },
+      {
+        "getter": {
+          "endPosition": "658",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": "null",
+          "body": {
+            "endPosition": "687",
+            "kind": "BLOCK",
+            "statements": [
+              {
+                "expression": {
+                  "identifier": "radius_",
+                  "expression": {
+                    "endPosition": "679",
+                    "kind": "IDENTIFIER",
+                    "this": "true",
+                    "name": "this",
+                    "startPosition": "675"
+                  },
+                  "endPosition": "687",
+                  "kind": "MEMBER_SELECT",
+                  "startPosition": "675"
+                },
+                "endPosition": "687",
+                "kind": "RETURN",
+                "startPosition": "668"
+              }
+            ],
+            "startPosition": "658"
+          },
+          "strict": "true",
+          "startPosition": "658",
+          "parameters": []
+        },
+        "endPosition": "693",
+        "kind": "PROPERTY",
+        "setter": {
+          "endPosition": "718",
+          "kind": "FUNCTION_EXPRESSION",
+          "name": "null",
+          "body": {
+            "endPosition": "852",
+            "kind": "BLOCK",
+            "statements": [
+              {
+                "condition": {
+                  "expression": {
+                    "endPosition": "757",
+                    "kind": "FUNCTION_INVOCATION",
+                    "functionSelect": {
+                      "identifier": "isInteger",
+                      "expression": {
+                        "endPosition": "739",
+                        "kind": "IDENTIFIER",
+                        "name": "Number",
+                        "startPosition": "733"
+                      },
+                      "endPosition": "749",
+                      "kind": "MEMBER_SELECT",
+                      "startPosition": "733"
+                    },
+                    "arguments": [
+                      {
+                        "endPosition": "756",
+                        "kind": "IDENTIFIER",
+                        "name": "radius",
+                        "startPosition": "750"
+                      }
+                    ],
+                    "startPosition": "733"
+                  },
+                  "endPosition": "757",
+                  "kind": "LOGICAL_COMPLEMENT",
+                  "startPosition": "732"
+                },
+                "elseStatement": "null",
+                "endPosition": "822",
+                "kind": "IF",
+                "startPosition": "728",
+                "thenStatement": {
+                  "expression": {
+                    "constructorExpression": {
+                      "endPosition": "821",
+                      "kind": "FUNCTION_INVOCATION",
+                      "functionSelect": {
+                        "endPosition": "790",
+                        "kind": "IDENTIFIER",
+                        "name": "TypeError",
+                        "startPosition": "781"
+                      },
+                      "arguments": [
+                        {
+                          "endPosition": "819",
+                          "kind": "STRING_LITERAL",
+                          "value": "Circle radius is not an int",
+                          "startPosition": "792"
+                        }
+                      ],
+                      "startPosition": "781"
+                    },
+                    "endPosition": "821",
+                    "kind": "NEW",
+                    "startPosition": "777"
+                  },
+                  "endPosition": "822",
+                  "kind": "THROW",
+                  "startPosition": "771"
+                }
+              },
+              {
+                "expression": {
+                  "expression": {
+                    "endPosition": "852",
+                    "kind": "IDENTIFIER",
+                    "name": "radius",
+                    "startPosition": "846"
+                  },
+                  "endPosition": "852",
+                  "kind": "ASSIGNMENT",
+                  "variable": {
+                    "identifier": "radius_",
+                    "expression": {
+                      "endPosition": "835",
+                      "kind": "IDENTIFIER",
+                      "this": "true",
+                      "name": "this",
+                      "startPosition": "831"
+                    },
+                    "endPosition": "843",
+                    "kind": "MEMBER_SELECT",
+                    "startPosition": "831"
+                  },
+                  "startPosition": "831"
+                },
+                "endPosition": "852",
+                "kind": "EXPRESSION_STATEMENT",
+                "startPosition": "831"
+              }
+            ],
+            "startPosition": "718"
+          },
+          "strict": "true",
+          "startPosition": "718",
+          "parameters": [
+            {
+              "endPosition": "716",
+              "kind": "IDENTIFIER",
+              "name": "radius",
+              "startPosition": "710"
+            }
+          ]
+        },
+        "value": "null",
+        "startPosition": "645",
+        "key": {
+          "endPosition": "655",
+          "kind": "IDENTIFIER",
+          "name": "radius",
+          "startPosition": "649"
+        }
+      }
+    ],
+    "endPosition": "231",
+    "kind": "CLASS",
+    "classHeritage": {
+      "endPosition": "245",
+      "kind": "IDENTIFIER",
+      "name": "Shape",
+      "startPosition": "240"
+    },
+    "name": {
+      "endPosition": "231",
+      "kind": "IDENTIFIER",
+      "name": "Circle",
+      "startPosition": "225"
+    },
+    "constructor": {
+      "getter": "null",
+      "endPosition": "354",
+      "kind": "PROPERTY",
+      "setter": "null",
+      "value": {
+        "endPosition": "272",
+        "kind": "FUNCTION_EXPRESSION",
+        "name": {
+          "endPosition": "263",
+          "kind": "IDENTIFIER",
+          "name": "constructor",
+          "startPosition": "252"
+        },
+        "body": {
+          "endPosition": "348",
+          "kind": "BLOCK",
+          "statements": [
+            {
+              "expression": {
+                "endPosition": "289",
+                "kind": "FUNCTION_INVOCATION",
+                "functionSelect": {
+                  "super": "true",
+                  "endPosition": "287",
+                  "kind": "IDENTIFIER",
+                  "name": "super",
+                  "startPosition": "282"
+                },
+                "arguments": [],
+                "startPosition": "282"
+              },
+              "endPosition": "289",
+              "kind": "EXPRESSION_STATEMENT",
+              "startPosition": "282"
+            },
+            {
+              "expression": {
+                "expression": {
+                  "endPosition": "320",
+                  "kind": "IDENTIFIER",
+                  "name": "radius",
+                  "startPosition": "314"
+                },
+                "endPosition": "320",
+                "kind": "ASSIGNMENT",
+                "variable": {
+                  "identifier": "radius_",
+                  "expression": {
+                    "endPosition": "303",
+                    "kind": "IDENTIFIER",
+                    "this": "true",
+                    "name": "this",
+                    "startPosition": "299"
+                  },
+                  "endPosition": "311",
+                  "kind": "MEMBER_SELECT",
+                  "startPosition": "299"
+                },
+                "startPosition": "299"
+              },
+              "endPosition": "320",
+              "kind": "EXPRESSION_STATEMENT",
+              "startPosition": "299"
+            },
+            {
+              "expression": {
+                "expression": {
+                  "identifier": "numCircles",
+                  "expression": {
+                    "endPosition": "335",
+                    "kind": "IDENTIFIER",
+                    "name": "Circle",
+                    "startPosition": "329"
+                  },
+                  "endPosition": "346",
+                  "kind": "MEMBER_SELECT",
+                  "startPosition": "329"
+                },
+                "endPosition": "348",
+                "kind": "POSTFIX_INCREMENT",
+                "startPosition": "329"
+              },
+              "endPosition": "348",
+              "kind": "EXPRESSION_STATEMENT",
+              "startPosition": "329"
+            }
+          ],
+          "startPosition": "272"
+        },
+        "strict": "true",
+        "startPosition": "272",
+        "parameters": [
+          {
+            "endPosition": "270",
+            "kind": "IDENTIFIER",
+            "name": "radius",
+            "startPosition": "264"
+          }
+        ]
+      },
+      "startPosition": "252",
+      "key": {
+        "endPosition": "263",
+        "kind": "IDENTIFIER",
+        "name": "constructor",
+        "startPosition": "252"
+      }
+    },
+    "startPosition": "219"
+  }
+]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/const.js	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+/**
+ * Tests to check representation of ES6 consts.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+load(__DIR__ + "utils.js")
+
+var code = <<EOF
+
+const PI = 3.14;
+
+EOF
+
+parse("generator.js", code, "--language=es6", new (Java.extend(visitor_es6, {
+    visitVariable : function (node, obj) {
+        obj.push(convert(node))
+    }
+})))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/const.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,20 @@
+[
+  {
+    "const": "true",
+    "endPosition": "16",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "9",
+      "kind": "IDENTIFIER",
+      "name": "PI",
+      "startPosition": "7"
+    },
+    "startPosition": "1",
+    "initializer": {
+      "endPosition": "16",
+      "kind": "NUMBER_LITERAL",
+      "value": "3.14",
+      "startPosition": "12"
+    }
+  }
+]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/defaultparams.js	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+/**
+ * Tests to check representation of ES6 default parameters.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+load(__DIR__ + "utils.js")
+
+var code = <<EOF
+
+function func(x = 3, y) {
+    return x + y;
+}
+
+var f = function (x = 4, y = 5) { return x * y }
+
+EOF
+
+parse("defaultparams.js", code, "--language=es6", new (Java.extend(visitor_es6, {
+    visitFunctionDeclaration : function (node, obj) {
+        obj.push(convert(node))
+    },
+    visitVariable : function (node, obj) {
+        obj.push(convert(node))
+    }
+})))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/defaultparams.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,151 @@
+[
+  {
+    "endPosition": "46",
+    "kind": "FUNCTION",
+    "name": {
+      "endPosition": "14",
+      "kind": "IDENTIFIER",
+      "name": "func",
+      "startPosition": "10"
+    },
+    "body": {
+      "endPosition": "44",
+      "kind": "BLOCK",
+      "statements": [
+        {
+          "expression": {
+            "leftOperand": {
+              "endPosition": "39",
+              "kind": "IDENTIFIER",
+              "name": "x",
+              "startPosition": "38"
+            },
+            "endPosition": "43",
+            "kind": "PLUS",
+            "rightOperand": {
+              "endPosition": "43",
+              "kind": "IDENTIFIER",
+              "name": "y",
+              "startPosition": "42"
+            },
+            "startPosition": "38"
+          },
+          "endPosition": "44",
+          "kind": "RETURN",
+          "startPosition": "31"
+        }
+      ],
+      "startPosition": "25"
+    },
+    "strict": "false",
+    "startPosition": "1",
+    "parameters": [
+      {
+        "expression": {
+          "endPosition": "20",
+          "kind": "NUMBER_LITERAL",
+          "value": "3",
+          "startPosition": "19"
+        },
+        "endPosition": "20",
+        "kind": "ASSIGNMENT",
+        "variable": {
+          "endPosition": "16",
+          "kind": "IDENTIFIER",
+          "name": "x",
+          "startPosition": "15"
+        },
+        "startPosition": "15"
+      },
+      {
+        "endPosition": "23",
+        "kind": "IDENTIFIER",
+        "name": "y",
+        "startPosition": "22"
+      }
+    ]
+  },
+  {
+    "endPosition": "96",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "53",
+      "kind": "IDENTIFIER",
+      "name": "f",
+      "startPosition": "52"
+    },
+    "startPosition": "48",
+    "initializer": {
+      "endPosition": "80",
+      "kind": "FUNCTION_EXPRESSION",
+      "name": "null",
+      "body": {
+        "endPosition": "94",
+        "kind": "BLOCK",
+        "statements": [
+          {
+            "expression": {
+              "leftOperand": {
+                "endPosition": "90",
+                "kind": "IDENTIFIER",
+                "name": "x",
+                "startPosition": "89"
+              },
+              "endPosition": "94",
+              "kind": "MULTIPLY",
+              "rightOperand": {
+                "endPosition": "94",
+                "kind": "IDENTIFIER",
+                "name": "y",
+                "startPosition": "93"
+              },
+              "startPosition": "89"
+            },
+            "endPosition": "94",
+            "kind": "RETURN",
+            "startPosition": "82"
+          }
+        ],
+        "startPosition": "80"
+      },
+      "strict": "false",
+      "startPosition": "80",
+      "parameters": [
+        {
+          "expression": {
+            "endPosition": "71",
+            "kind": "NUMBER_LITERAL",
+            "value": "4",
+            "startPosition": "70"
+          },
+          "endPosition": "71",
+          "kind": "ASSIGNMENT",
+          "variable": {
+            "endPosition": "67",
+            "kind": "IDENTIFIER",
+            "name": "x",
+            "startPosition": "66"
+          },
+          "startPosition": "66"
+        },
+        {
+          "expression": {
+            "endPosition": "78",
+            "kind": "NUMBER_LITERAL",
+            "value": "5",
+            "startPosition": "77"
+          },
+          "endPosition": "78",
+          "kind": "ASSIGNMENT",
+          "variable": {
+            "endPosition": "74",
+            "kind": "IDENTIFIER",
+            "name": "y",
+            "startPosition": "73"
+          },
+          "startPosition": "73"
+        }
+      ]
+    }
+  }
+]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/destructuring_assign.js	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+/**
+ * Tests to check representation of ES6 destructuring assignments.
+ *
+ * @test
+ * @option -scripting
+ * @run
+ */
+
+load(__DIR__ + "utils.js")
+
+var code = <<EOF
+
+var a, b;
+[a, b] = [1, 2];
+({a, b} = {a:11, b:12});
+
+EOF
+
+parse("destructuring_assign.js", code, "--language=es6", new (Java.extend(visitor_es6, {
+    visitAssignment : function (node, obj) {
+        obj.push(convert(node))
+    },
+    visitVariable : function (node, obj) {
+        obj.push(convert(node))
+    }
+})))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nashorn/test/script/nosecurity/treeapi/destructuring_assign.js.EXPECTED	Tue Jul 12 21:18:13 2016 +0530
@@ -0,0 +1,164 @@
+[
+  {
+    "endPosition": "6",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "6",
+      "kind": "IDENTIFIER",
+      "name": "a",
+      "startPosition": "5"
+    },
+    "startPosition": "1",
+    "initializer": "null"
+  },
+  {
+    "endPosition": "9",
+    "kind": "VARIABLE",
+    "binding": {
+      "endPosition": "9",
+      "kind": "IDENTIFIER",
+      "name": "b",
+      "startPosition": "8"
+    },
+    "startPosition": "1",
+    "initializer": "null"
+  },
+  {
+    "expression": {
+      "endPosition": "26",
+      "kind": "ARRAY_LITERAL",
+      "elements": [
+        {
+          "endPosition": "22",
+          "kind": "NUMBER_LITERAL",
+          "value": "1",
+          "startPosition": "21"
+        },
+        {
+          "endPosition": "25",
+          "kind": "NUMBER_LITERAL",
+          "value": "2",
+          "startPosition": "24"
+        }
+      ],
+      "startPosition": "20"
+    },
+    "endPosition": "26",
+    "kind": "ASSIGNMENT",
+    "variable": {
+      "endPosition": "17",
+      "kind": "ARRAY_LITERAL",
+      "elements": [
+        {
+          "endPosition": "13",
+          "kind": "IDENTIFIER",
+          "name": "a",
+          "startPosition": "12"
+        },
+        {
+          "endPosition": "16",
+          "kind": "IDENTIFIER",
+          "name": "b",
+          "startPosition": "15"
+        }
+      ],
+      "startPosition": "11"
+    },
+    "startPosition": "11"
+  },
+  {
+    "