From 906837dc9092554d0f484a6fb7b4ee3ea1565e0b Mon Sep 17 00:00:00 2001 From: jchbh Date: Wed, 20 May 2015 11:24:35 -0700 Subject: [PATCH] add let support --- lib/ast.js | 4 ++++ lib/output.js | 3 +++ lib/parse.js | 15 ++++++++++++++- 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/ast.js b/lib/ast.js index 1892a30a..65a236e7 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -547,6 +547,10 @@ var AST_Const = DEFNODE("Const", null, { $documentation: "A `const` statement" }, AST_Definitions); +var AST_Let = DEFNODE("Let", null, { + $documentation: "A `let` statement" +}, AST_Definitions); + var AST_VarDef = DEFNODE("VarDef", "name value", { $documentation: "A variable declaration; only appears in a AST_Definitions node", $propdoc: { diff --git a/lib/output.js b/lib/output.js index 2a8cc201..c424a632 100644 --- a/lib/output.js +++ b/lib/output.js @@ -934,6 +934,9 @@ function OutputStream(options) { DEFPRINT(AST_Const, function(self, output){ self._do_print(output, "const"); }); + DEFPRINT(AST_Let, function(self, output){ + self._do_print(output, "let"); + }); function parenthesize_for_noin(node, output, noin) { if (!noin) node.print(output); diff --git a/lib/parse.js b/lib/parse.js index 2d8a1a3a..edeea0fa 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -844,6 +844,9 @@ function parse($TEXT, options) { case "var": return tmp = var_(), semicolon(), tmp; + case "let": + return tmp = let_(), semicolon(), tmp; + case "const": return tmp = const_(), semicolon(), tmp; @@ -916,7 +919,9 @@ function parse($TEXT, options) { if (!is("punc", ";")) { init = is("keyword", "var") ? (next(), var_(true)) - : expression(true, true); + : is("keyword", "let") + ? (next(), let_(true)) + :expression(true, true); if (is("operator", "in")) { if (init instanceof AST_Var && init.definitions.length > 1) croak("Only one variable declaration allowed in for..in loop"); @@ -1111,6 +1116,14 @@ function parse($TEXT, options) { }); }; + var let_ = function(no_in) { + return new AST_Let({ + start : prev(), + definitions : vardefs(no_in, false), + end : prev() + }); + }; + var new_ = function() { var start = S.token; expect_token("operator", "new");