diff --git a/lib/6to5/util.js b/lib/6to5/util.js index 3b0eb565c5..510fcec17e 100644 --- a/lib/6to5/util.js +++ b/lib/6to5/util.js @@ -88,6 +88,7 @@ var templateVisitor = { node = node.expression; } if (t.isIdentifier(node) && has(nodes, node.name)) { + this.skip(); return nodes[node.name]; } } diff --git a/test/util.js b/test/util.js index bc1a467bb2..80b80f5b7a 100644 --- a/test/util.js +++ b/test/util.js @@ -1,5 +1,6 @@ var assert = require("assert"); var util = require("../lib/6to5/util"); +var parse = require("../lib/6to5/helpers/parse"); var t = require("../lib/6to5/types"); suite("util", function () { @@ -9,6 +10,23 @@ suite("util", function () { }, /unknown template/); }); + test("templates do not recurse", function () { + var key = __filename; + var KEY = parse({ loc: key }, "replacedKey").program.body[0].expression; + var VALUE = parse({ loc: key }, "+KEY").program.body[0].expression; + + util.templates[key] = util.parseTemplate(key, "KEY = VALUE;"); + var result = util.template(key, {KEY: KEY, VALUE: VALUE}); + delete util.templates[key]; + + assert.strictEqual( + result.right.argument.name, + "KEY", + "template should not recurse into replaced nodes, " + + "replacing KEY inside VALUE" + ); + }); + test("canCompile", function () { assert.ok(util.canCompile("test.js")); assert.ok(util.canCompile("/test.js"));