From 5f8f9e35d798e64875de5ec3a051efc5b39769ec Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Fri, 23 Jan 2015 23:03:41 +1100 Subject: [PATCH] better categorisation of transformers --- .../transformers/es6/block-scoping-tdz.js | 48 +++++++++++++++++++ .../temporal-dead-zone/options.json | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 lib/6to5/transformation/transformers/es6/block-scoping-tdz.js diff --git a/lib/6to5/transformation/transformers/es6/block-scoping-tdz.js b/lib/6to5/transformation/transformers/es6/block-scoping-tdz.js new file mode 100644 index 0000000000..b97f49ebb0 --- /dev/null +++ b/lib/6to5/transformation/transformers/es6/block-scoping-tdz.js @@ -0,0 +1,48 @@ +var traverse = require("../../../traverse"); +var t = require("../../../types"); + +var visitor = { + enter: function (node, parent, scope, context, state) { + if (!t.isReferencedIdentifier(node, parent)) return; + + var declared = state.letRefs[node.name]; + if (!declared) return; + + // declared node is different in this scope + if (scope.get(node.name, true) !== declared) return; + + var declaredLoc = declared.loc; + var referenceLoc = node.loc; + + if (!declaredLoc || !referenceLoc) return; + + // does this reference appear on a line before the declaration? + var before = referenceLoc.start.line < declaredLoc.start.line; + + if (referenceLoc.start.line === declaredLoc.start.line) { + // this reference appears on the same line + // check it appears before the declaration + before = referenceLoc.start.col < declaredLoc.start.col; + } + + if (before) { + throw state.file.errorWithNode(node, "Temporal dead zone - accessing a variable before it's initialized"); + } + } +}; + +exports.optional = true; + +exports.Loop = +exports.Program = +exports.BlockStatement = function (node, parent, scope, context, file) { + var letRefs = node._letReferences; + if (!letRefs) return; + + var state = { + letRefs: letRefs, + file: file + }; + + traverse(node, visitor, scope, state); +}; diff --git a/test/fixtures/transformation/es6-block-scoping/temporal-dead-zone/options.json b/test/fixtures/transformation/es6-block-scoping/temporal-dead-zone/options.json index bcd3d8f6e2..47e8262e80 100644 --- a/test/fixtures/transformation/es6-block-scoping/temporal-dead-zone/options.json +++ b/test/fixtures/transformation/es6-block-scoping/temporal-dead-zone/options.json @@ -1,4 +1,4 @@ { "throws": "Temporal dead zone - accessing a variable before it's initialized", - "optional": ["blockScopingTDZ"] + "optional": ["es6.blockScopingTDZ"] }