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>)) {
|
||||
const typeKey = `is${type}`;
|
||||
const fn = t[typeKey];
|
||||
NodePath.prototype[typeKey] = function(opts) {
|
||||
return t[typeKey](this.node, opts);
|
||||
return fn(this.node, 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}`);
|
||||
}
|
||||
};
|
||||
|
||||
@ -1,9 +1,31 @@
|
||||
"use strict";
|
||||
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 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.
|
||||
* 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 => {
|
||||
output += addIsHelper(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 => {
|
||||
const newType = definitions.DEPRECATED_KEYS[type];
|
||||
output += `export function is${type}(node: Object, opts: Object): boolean {
|
||||
console.trace("The node type ${type} has been renamed to ${newType}");
|
||||
return is("${type}", node, opts);
|
||||
}\n`;
|
||||
const deprecated = `console.trace("The node type ${type} has been renamed to ${newType}");`;
|
||||
output += addIsHelper(type, null, deprecated);
|
||||
});
|
||||
|
||||
return output;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user