remove declarations transformer and instead do it whenever we push a generated declaration, better for perf and removes shitty bugs - fixes #1268

This commit is contained in:
Sebastian McKenzie 2015-04-26 15:46:06 +01:00
parent 68bfafe745
commit f4611469b4
20 changed files with 88 additions and 107 deletions

View File

@ -41,10 +41,11 @@ export default class File {
this.dynamicImportIds = {};
this.dynamicImports = [];
this.usedHelpers = {};
this.dynamicData = {};
this.data = {};
this.uids = {};
this.declarations = {};
this.usedHelpers = {};
this.dynamicData = {};
this.data = {};
this.uids = {};
this.log = new Logger(this, opts.filename || "unknown");
this.opts = this.normalizeOptions(opts);
@ -395,8 +396,8 @@ export default class File {
var program = this.ast.program;
var declar = program._declarations && program._declarations[name];
if (declar) return declar.id;
var declar = this.declarations[name];
if (declar) return declar;
this.usedHelpers[name] = true;
@ -413,11 +414,11 @@ export default class File {
var ref = util.template("helper-" + name);
ref._compact = true;
var uid = this.scope.generateUidIdentifier(name);
var uid = this.declarations[name] = this.scope.generateUidIdentifier(name);
this.scope.push({
key: name,
id: uid,
init: ref
init: ref,
unique: true
});
return uid;
}

View File

@ -21,3 +21,7 @@ export function UnaryExpression(node, parent, scope, file) {
}
}
}
export function VariableDeclaration(node) {
if (node._generated) this.skip();
}

View File

@ -94,8 +94,6 @@ export default {
"spec.protoToAssign": require("./spec/proto-to-assign"),
_declarations: require("./internal/declarations"),
_shadowFunctions: require("./internal/shadow-functions"),
"es7.doExpressions": require("./es7/do-expressions"),

View File

@ -1,37 +0,0 @@
import * as strict from "../../helpers/strict";
import * as t from "../../../types";
export var metadata = {
secondPass: true
};
export function BlockStatement(node, parent, scope, file) {
if (!node._declarations) return;
strict.wrap(node, function () {
var kinds = {};
var kind;
for (var i in node._declarations) {
var declar = node._declarations[i];
kind = declar.kind || "var";
var declarNode = t.variableDeclarator(declar.id, declar.init);
if (declar.init) {
node.body.unshift(file.attachAuxiliaryComment(t.variableDeclaration(kind, [declarNode])));
} else {
kinds[kind] ||= [];
kinds[kind].push(declarNode);
}
}
for (kind in kinds) {
node.body.unshift(file.attachAuxiliaryComment(t.variableDeclaration(kind, kinds[kind])));
}
node._declarations = null;
});
}
export { BlockStatement as Program };

View File

@ -76,7 +76,7 @@ traverse.node = function (node, opts, scope, state, parentPath) {
const CLEAR_KEYS = [
"trailingComments", "leadingComments", "extendedRange",
"_declarations", "_scopeInfo" ,"_paths",
"_scopeInfo" ,"_paths",
"tokens", "range", "start", "end", "loc", "raw"
];

View File

@ -516,23 +516,35 @@ export default class Scope {
*/
push(opts: Object) {
var block = this.block;
var path = this.path;
if (t.isLoop(block) || t.isCatchClause(block) || t.isFunction(block)) {
t.ensureBlock(block);
block = block.body;
if (path.isLoop() || path.isCatchClause() || path.isFunction()) {
t.ensureBlock(path.node);
path = path.get("body");
}
if (!t.isBlockStatement(block) && !t.isProgram(block)) {
block = this.getBlockParent().block;
if (!path.isBlockStatement() && !path.isProgram()) {
path = this.getBlockParent().path;
}
block._declarations ||= {};
block._declarations[opts.key || opts.id.name] = {
kind: opts.kind || "var",
id: opts.id,
init: opts.init
};
var unique = opts.unique;
var kind = opts.kind || "var";
var dataKey = `declaration:${kind}`;
var declar = !unique && path.getData(dataKey);
if (!declar) {
declar = t.variableDeclaration(opts.kind || "var", []);
declar._generated = true;
declar._blockHoist = 2;
this.file.attachAuxiliaryComment(declar);
path.get("body")[0]._containerInsertBefore([declar]);
if (!unique) path.setData(dataKey, declar);
}
declar.declarations.push(t.variableDeclarator(opts.id, opts.init));
}
/**

View File

@ -282,12 +282,11 @@ export function inheritsComments(child: Object, parent: Object): Object {
export function inherits(child: Object, parent: Object): Object {
if (!child || !parent) return child;
child._declarations = parent._declarations;
child._scopeInfo = parent._scopeInfo;
child.range = parent.range;
child.start = parent.start;
child.loc = parent.loc;
child.end = parent.end;
child._scopeInfo = parent._scopeInfo;
child.range = parent.range;
child.start = parent.start;
child.loc = parent.loc;
child.end = parent.end;
child.typeAnnotation = parent.typeAnnotation;
child.returnType = parent.returnType;

View File

@ -29,4 +29,4 @@ define(["exports", "module"], function (exports, module) {
module.exports = Foo;
module.exports = foo;
});
});

View File

@ -1,14 +1,14 @@
define(["exports", "foo"], function (exports, _foo) {
"use strict";
var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } };
var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } };
var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; };
_defaults(exports, _interopRequireWildcard(_foo));
Object.defineProperty(exports, "foo", {

View File

@ -1,11 +1,12 @@
define(["exports"], function (exports) {
"use strict";
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
exports.foo7 = foo7;
var foo = 1;
exports.foo = foo;
@ -31,4 +32,4 @@ define(["exports"], function (exports) {
};
exports.foo8 = foo8;
});
});

View File

@ -1,12 +1,12 @@
define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports, _foo, _fooBar, _directoryFooBar) {
"use strict";
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
var _foo2 = _interopRequire(_foo);
exports.test = test;
@ -19,4 +19,4 @@ define(["exports", "foo", "foo-bar", "./directory/foo-bar"], function (exports,
_foo;
_foo.bar;
_foo.foo;
});
});

View File

@ -1,10 +1,11 @@
"use strict";
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
exports["default"] = foo;
exports["default"] = 42;
exports["default"] = {};

View File

@ -1,13 +1,13 @@
"use strict";
var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } };
var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } };
var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; };
var _foo = require("foo");
_defaults(exports, _interopRequireWildcard(_foo));

View File

@ -1,10 +1,11 @@
"use strict";
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
exports.foo7 = foo7;
var foo = 1;
exports.foo = foo;
@ -29,4 +30,4 @@ var foo8 = function foo8() {
_classCallCheck(this, foo8);
};
exports.foo8 = foo8;
exports.foo8 = foo8;

View File

@ -1,5 +1,7 @@
System.register([], function (_export) {
var _classCallCheck, _default, Foo;
var _default, Foo;
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
_export("default", foo);
@ -10,8 +12,6 @@ System.register([], function (_export) {
execute: function () {
"use strict";
_classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
_export("default", 42);
_export("default", {});
@ -39,4 +39,4 @@ System.register([], function (_export) {
_export("default", Foo);
}
};
});
});

View File

@ -1,5 +1,7 @@
System.register([], function (_export) {
var _classCallCheck, foo, foo2, foo3, foo4, foo5, foo6, foo8;
var foo, foo2, foo3, foo4, foo5, foo6, foo8;
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
_export("foo7", foo7);
@ -10,8 +12,6 @@ System.register([], function (_export) {
execute: function () {
"use strict";
_classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
foo = 1;
_export("foo", foo);
@ -43,4 +43,4 @@ System.register([], function (_export) {
_export("foo3", foo3 = 5);
}
};
});
});

View File

@ -13,14 +13,14 @@
})(this, function (exports, _foo) {
"use strict";
var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } };
var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _interopRequireWildcard = function (obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (typeof obj === "object" && obj !== null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } };
var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; };
_defaults(exports, _interopRequireWildcard(_foo));
Object.defineProperty(exports, "foo", {

View File

@ -13,11 +13,12 @@
})(this, function (exports) {
"use strict";
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } };
exports.foo7 = foo7;
var foo = 1;
exports.foo = foo;

View File

@ -13,12 +13,12 @@
})(this, function (exports, _foo, _fooBar, _directoryFooBar) {
"use strict";
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
Object.defineProperty(exports, "__esModule", {
value: true
});
var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; };
var _foo2 = _interopRequire(_foo);
exports.test = test;
@ -29,4 +29,4 @@
_foo.bar;
_foo.foo;
});
});

View File

@ -1,11 +1,11 @@
"use strict";
var _foo, _foo$bar, _foo$bar2;
var _defaults = function (obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; };
var _foo, _foo$bar, _foo$bar2;
console.log((_foo = foo, _defaults(_foo, bar), _foo));
console.log((_foo$bar = foo[bar], _defaults(_foo$bar, bar), _foo$bar));
console.log((_foo$bar2 = foo[bar()], _defaults(_foo$bar2, bar), _foo$bar2));
console.log((_foo$bar2 = foo[bar()], _defaults(_foo$bar2, bar), _foo$bar2));