Make babel-types type checking functions 36% faster (#7685)
* Precompile 25% faster type checking functions * Pre-fetch type-check function when generating NodePath methods Additional ~11% speed improvement. * Slightly faster assert calls
This commit is contained in:
parent
637bfe76b1
commit
6a8c4ab433
@ -170,12 +170,13 @@ Object.assign(
|
|||||||
|
|
||||||
for (const type of (t.TYPES: Array<string>)) {
|
for (const type of (t.TYPES: Array<string>)) {
|
||||||
const typeKey = `is${type}`;
|
const typeKey = `is${type}`;
|
||||||
|
const fn = t[typeKey];
|
||||||
NodePath.prototype[typeKey] = function(opts) {
|
NodePath.prototype[typeKey] = function(opts) {
|
||||||
return t[typeKey](this.node, opts);
|
return fn(this.node, opts);
|
||||||
};
|
};
|
||||||
|
|
||||||
NodePath.prototype[`assert${type}`] = function(opts) {
|
NodePath.prototype[`assert${type}`] = function(opts) {
|
||||||
if (!this[typeKey](opts)) {
|
if (!fn(this.node, opts)) {
|
||||||
throw new TypeError(`Expected node path of type ${type}`);
|
throw new TypeError(`Expected node path of type ${type}`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,9 +1,31 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
const definitions = require("../../lib/definitions");
|
const definitions = require("../../lib/definitions");
|
||||||
|
|
||||||
function addIsHelper(type) {
|
function addIsHelper(type, aliasKeys, deprecated) {
|
||||||
|
const targetType = JSON.stringify(type);
|
||||||
|
let aliasSource = "";
|
||||||
|
if (aliasKeys) {
|
||||||
|
aliasSource =
|
||||||
|
" || " +
|
||||||
|
aliasKeys.map(JSON.stringify).join(" === nodeType || ") +
|
||||||
|
" === nodeType";
|
||||||
|
}
|
||||||
|
|
||||||
return `export function is${type}(node: Object, opts?: Object): boolean {
|
return `export function is${type}(node: Object, opts?: Object): boolean {
|
||||||
return is("${type}", node, opts) }
|
${deprecated || ""}
|
||||||
|
if (!node) return false;
|
||||||
|
|
||||||
|
const nodeType = node.type;
|
||||||
|
if (nodeType === ${targetType}${aliasSource}) {
|
||||||
|
if (typeof opts === "undefined") {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return shallowEqual(node, opts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -13,22 +35,20 @@ module.exports = function generateValidators() {
|
|||||||
* This file is auto-generated! Do not modify it directly.
|
* This file is auto-generated! Do not modify it directly.
|
||||||
* To re-generate run 'make build'
|
* To re-generate run 'make build'
|
||||||
*/
|
*/
|
||||||
import is from "../is";\n\n`;
|
import shallowEqual from "../../utils/shallowEqual";\n\n`;
|
||||||
|
|
||||||
Object.keys(definitions.VISITOR_KEYS).forEach(type => {
|
Object.keys(definitions.VISITOR_KEYS).forEach(type => {
|
||||||
output += addIsHelper(type);
|
output += addIsHelper(type);
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.keys(definitions.FLIPPED_ALIAS_KEYS).forEach(type => {
|
Object.keys(definitions.FLIPPED_ALIAS_KEYS).forEach(type => {
|
||||||
output += addIsHelper(type);
|
output += addIsHelper(type, definitions.FLIPPED_ALIAS_KEYS[type]);
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.keys(definitions.DEPRECATED_KEYS).forEach(type => {
|
Object.keys(definitions.DEPRECATED_KEYS).forEach(type => {
|
||||||
const newType = definitions.DEPRECATED_KEYS[type];
|
const newType = definitions.DEPRECATED_KEYS[type];
|
||||||
output += `export function is${type}(node: Object, opts: Object): boolean {
|
const deprecated = `console.trace("The node type ${type} has been renamed to ${newType}");`;
|
||||||
console.trace("The node type ${type} has been renamed to ${newType}");
|
output += addIsHelper(type, null, deprecated);
|
||||||
return is("${type}", node, opts);
|
|
||||||
}\n`;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user