From 8c310eef6f120b45da00349bf0f5eea959bff70d Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Wed, 14 Jan 2026 03:00:25 +0800 Subject: [PATCH] Refactor `handleCommentInEmptyParens` (#18624) --- src/language-js/comments/handle-comments.js | 50 ++++++++++++------- .../utilities/get-text-without-comments.js | 6 +-- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/language-js/comments/handle-comments.js b/src/language-js/comments/handle-comments.js index 7bed1a1c0..5583f715c 100644 --- a/src/language-js/comments/handle-comments.js +++ b/src/language-js/comments/handle-comments.js @@ -618,8 +618,19 @@ function handleCommentAfterArrowParams({ comment, enclosingNode, text }) { } function isInArgumentOrParameterParentheses(node, comment, options) { + const commentStart = locStart(comment); + const nodeEnd = locEnd(node); + if (commentStart >= nodeEnd) { + return false; + } + + const commentEnd = locEnd(comment); const nodeStart = locStart(node); - const nodeText = getTextWithoutComments(options, nodeStart, locEnd(node)); + if (commentEnd <= nodeStart) { + return false; + } + + const nodeText = getTextWithoutComments(options, nodeStart, nodeEnd); return ( nodeText @@ -638,31 +649,36 @@ function handleCommentInEmptyParens({ comment, enclosingNode, options }) { return false; } - // This condition should be removed, but excluded for function parameters in #18615 to make PRs smaller - const isRemainingComment = comment.placement === "remaining"; - - // Only add dangling comments to fix the case when no params are present, - // i.e. a function without any argument. if ( - ((isRemainingComment && - isRealFunctionLikeNode(enclosingNode) && - getFunctionParameters(enclosingNode).length === 0) || - (isCallLikeExpression(enclosingNode) && - getCallArguments(enclosingNode).length === 0)) && + isCallLikeExpression(enclosingNode) && + getCallArguments(enclosingNode).length === 0 && isInArgumentOrParameterParentheses(enclosingNode, comment, options) ) { addDanglingComment(enclosingNode, comment); return true; } + // This condition should be removed, but excluded for function parameters in #18615 to make PRs smaller + if (comment.placement !== "remaining") { + return false; + } + + // Only add dangling comments to fix the case when no params are present, + // i.e. a function without any argument. + + const functionNode = isRealFunctionLikeNode(enclosingNode) + ? enclosingNode + : enclosingNode.type === "MethodDefinition" || + enclosingNode.type === "TSAbstractMethodDefinition" + ? enclosingNode.value + : undefined; + if ( - isRemainingComment && - (enclosingNode.type === "MethodDefinition" || - enclosingNode.type === "TSAbstractMethodDefinition") && - getFunctionParameters(enclosingNode.value).length === 0 && - isInArgumentOrParameterParentheses(enclosingNode, comment, options) + functionNode && + getFunctionParameters(functionNode).length === 0 && + isInArgumentOrParameterParentheses(functionNode, comment, options) ) { - addDanglingComment(enclosingNode.value, comment); + addDanglingComment(functionNode, comment); return true; } diff --git a/src/language-js/utilities/get-text-without-comments.js b/src/language-js/utilities/get-text-without-comments.js index b79ba97e7..e6109685d 100644 --- a/src/language-js/utilities/get-text-without-comments.js +++ b/src/language-js/utilities/get-text-without-comments.js @@ -7,16 +7,16 @@ function getTextWithoutComments(options, start, end) { for (const comment of options[Symbol.for("comments")]) { const commentStart = locStart(comment); // Comments are sorted, we can escape if the comment is after the range - if (commentStart > end) { + if (commentStart >= end) { break; } const commentEnd = locEnd(comment); - if (commentEnd < start) { + if (commentEnd <= start) { continue; } - const startIndex = commentStart - start; + const startIndex = Math.max(commentStart - start, 0); const endIndex = commentEnd - start; text =