From 7e0ed3d8b465cf29506f19d4c45ad32a7ec37c81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Mon, 4 Oct 2021 21:09:27 +0200 Subject: [PATCH] Fix perf --- packages/babel-parser/src/parser/comments.js | 55 ++++++++++++------- .../babel-parser/src/parser/expression.js | 8 ++- 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/packages/babel-parser/src/parser/comments.js b/packages/babel-parser/src/parser/comments.js index 801cfd68672d..c304cf0d1268 100644 --- a/packages/babel-parser/src/parser/comments.js +++ b/packages/babel-parser/src/parser/comments.js @@ -27,24 +27,21 @@ export type CommentWhitespace = { containingNode: Node | null, }; +type Comments = Array; + /** - * Merge comments with node's ${type}Comments or assign comments to be - * ${type}Comments. New comments will be placed before old comments + * Merge comments with node's leadingComments or assign comments to be + * leadingComments. New comments will be placed before old comments * because the commentStack is enumerated reversely. * - * @param {"leading" | "inner" | "trailing"} position * @param {Node} node * @param {Array} comments */ -function setComments( - position: "leading" | "inner" | "trailing", - node: Node, - comments: Array, -) { - if (node[`${position}Comments`] === undefined) { - node[`${position}Comments`] = comments; +function setLeadingComments(node: Node, comments: Comments) { + if (node.leadingComments === undefined) { + node.leadingComments = comments; } else { - node[`${position}Comments`].unshift(...comments); + node.leadingComments.unshift(...comments); } } @@ -56,9 +53,27 @@ function setComments( * @param {Node} node * @param {Array} comments */ -export function setInnerComments(node: Node, comments: Array | void) { - if (comments) { - setComments("inner", node, comments); +export function setInnerComments(node: Node, comments: Comments) { + if (node.innerComments === undefined) { + node.innerComments = comments; + } else { + node.innerComments.unshift(...comments); + } +} + +/** + * Merge comments with node's trailingComments or assign comments to be + * trailingComments. New comments will be placed before old comments + * because the commentStack is enumerated reversely. + * + * @param {Node} node + * @param {Array} comments + */ +function setTrailingComments(node: Node, comments: Comments) { + if (node.trailingComments === undefined) { + node.trailingComments = comments; + } else { + node.trailingComments.unshift(...comments); } } @@ -82,9 +97,9 @@ function adjustInnerComments( lastElement = elements[--i]; } if (lastElement === null || lastElement.start > commentWS.start) { - setComments("inner", node, commentWS.comments); + setInnerComments(node, commentWS.comments); } else { - setComments("trailing", lastElement, commentWS.comments); + setTrailingComments(lastElement, commentWS.comments); } } @@ -150,10 +165,10 @@ export default class CommentsParser extends BaseParser { const { comments } = commentWS; if (commentWS.leadingNode !== null || commentWS.trailingNode !== null) { if (commentWS.leadingNode !== null) { - setComments("trailing", commentWS.leadingNode, comments); + setTrailingComments(commentWS.leadingNode, comments); } if (commentWS.trailingNode !== null) { - setComments("leading", commentWS.trailingNode, comments); + setLeadingComments(commentWS.trailingNode, comments); } } else { /*:: invariant(commentWS.containingNode !== null) */ @@ -190,11 +205,11 @@ export default class CommentsParser extends BaseParser { adjustInnerComments(node, node.specifiers, commentWS); break; default: { - setComments("inner", node, comments); + setInnerComments(node, comments); } } } else { - setComments("inner", node, comments); + setInnerComments(node, comments); } } } diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index f33316cc5d61..4dcd64a5d6e7 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1023,9 +1023,13 @@ export default class ExpressionParser extends LValParser { call.extra?.trailingComma, ); // mark inner comments of `async()` as inner comments of `async () =>` - setInnerComments(node, call.innerComments); + if (call.innerComments) { + setInnerComments(node, call.innerComments); + } // mark trailing comments of `async` to be inner comments - setInnerComments(node, call.callee.trailingComments); + if (call.callee.trailingComments) { + setInnerComments(node, call.callee.trailingComments); + } return node; }