From 74f831bd39ffb0674ca86161c4843fc47c23d153 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 29 Sep 2014 12:24:21 +1000 Subject: [PATCH] implement constants --- README.md | 2 +- lib/6to5/transformers/block-binding.js | 24 +++++++++------ lib/6to5/transformers/constants.js | 41 ++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0d2369e792..21e9943d38 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ | [Modules](FEATURES.md#modules) | ✓ | | [Property name shorthand](FEATURES.md#property-name-shorthand) | ✓ | | [Computed property names](FEATURES.md#computed-property-names) | ✓ | -| [Constants](FEATURES.md#constants) | | +| [Constants](FEATURES.md#constants) | ✓ | | [Destructuring assignment](FEATURES.md#destructuring-assignment) | | | [Array comprehension](FEATURES.md#array-comprehension) | | | [Generators](FEATURES.md#generators) | | diff --git a/lib/6to5/transformers/block-binding.js b/lib/6to5/transformers/block-binding.js index 84c33e8690..bd1a8e00a5 100644 --- a/lib/6to5/transformers/block-binding.js +++ b/lib/6to5/transformers/block-binding.js @@ -9,20 +9,26 @@ var isLet = function (node) { } }; +var hasLet = function (nodes) { + var has = false; + + _.each(nodes, function (node) { + if (isLet(node)) has = true; + }); + + return has; +}; + exports.Program = function (node) { - _.each(node.body, isLet); + if (hasLet(node.body)) { + node.body = [buildNode(node.body)]; + } }; exports.BlockStatement = function (node, parent) { - var hasLet = false; + if (!hasLet(node.body)) return; - _.each(node.body, function (bodyNode) { - if (isLet(bodyNode)) hasLet = true; - }); - - if (!hasLet) return; - - // ignore if we're direct children of a closure already + // ignore if we're the body of a closure already if (parent.type === "FunctionExpression") return; node.body = [buildNode(node.body)]; diff --git a/lib/6to5/transformers/constants.js b/lib/6to5/transformers/constants.js index e69de29bb2..485285d047 100644 --- a/lib/6to5/transformers/constants.js +++ b/lib/6to5/transformers/constants.js @@ -0,0 +1,41 @@ +var traverse = require("../traverse"); +var util = require("../util"); +var _ = require("lodash"); + +exports.Program = +exports.BlockStatement = +exports.ForInStatement = +exports.ForStatement = function (node) { + var constants = []; + + var check = function (node, name) { + if (constants.indexOf(name) >= 0) { + throw util.errorWithNode(node, name + " is read-only"); + } + }; + + _.each(node.body, function (child) { + if (child.type === "VariableDeclaration" && child.kind === "const") { + _.each(child.declarations, function (declar) { + var name = declar.id.name; + check(declar, name); + + declar._ignoreConstant = true; + constants.push(name); + }); + child.kind = "let"; + } + }); + + if (!constants.length) return; + + traverse(node, function (child) { + if (child._ignoreConstant) return; + + if (child.type === "VariableDeclarator") { + check(child, child.id.name); + } else if (child.type === "AssignmentExpression") { + check(child, child.left.name); + } + }); +};