diff --git a/src/comments.ts b/src/comments.ts index 05b3f7f5..612dd340 100644 --- a/src/comments.ts +++ b/src/comments.ts @@ -1,6 +1,13 @@ import { util, type AstPath, type Doc } from "prettier"; import { builders } from "prettier/doc"; -import { SyntaxType, type CommentNode, type SyntaxNode } from "./node-types.ts"; +import { + SyntaxType, + type ArrayAccessNode, + type CommentNode, + type FieldAccessNode, + type MethodInvocationNode, + type SyntaxNode +} from "./node-types.ts"; import parser from "./parser.ts"; import printer from "./printer.ts"; import { @@ -190,18 +197,20 @@ function handleLabeledStatementComments(commentNode: CommentNode) { function handleMemberChainComments(commentNode: CommentNode) { const { enclosingNode, precedingNode, followingNode } = commentNode; if ( + precedingNode && (enclosingNode?.type === SyntaxType.FieldAccess || (enclosingNode?.type === SyntaxType.MethodInvocation && - precedingNode?.end.row !== commentNode.start.row)) && - (followingNode?.type === SyntaxType.Identifier || - followingNode?.type === SyntaxType.TypeArguments) + precedingNode.end.row < commentNode.start.row)) && + precedingNode === enclosingNode.objectNode ) { util.addLeadingComment(enclosingNode, commentNode); return true; } else if ( followingNode && isMember(followingNode) && - precedingNode !== enclosingNode && + (!precedingNode || + (precedingNode !== getMemberObject(followingNode) && + precedingNode.end.row < commentNode.start.row)) && !isPrettierIgnore(commentNode) ) { util.addDanglingComment(followingNode, commentNode, undefined); @@ -291,6 +300,14 @@ function isMember(node: SyntaxNode) { ); } +function getMemberObject( + node: ArrayAccessNode | FieldAccessNode | MethodInvocationNode +) { + return node.type === SyntaxType.ArrayAccess + ? node.arrayNode + : node.objectNode; +} + const binaryOperators = new Set([ "<<", ">>", diff --git a/test/unit-test/member_chain/_input.java b/test/unit-test/member_chain/_input.java index 2d6e70a4..ff3c7116 100644 --- a/test/unit-test/member_chain/_input.java +++ b/test/unit-test/member_chain/_input.java @@ -175,5 +175,28 @@ void argumentComment() { a( b.c() // comment ); + + a( + b, // comment + c.d + ); + + a( + b, // comment + c.d[0] + ); + + a( + b, // comment + c.d() + ); + } + + void prettierIgnore() { + a -> + // prettier-ignore + b + .c().d() + .e().f(); } } diff --git a/test/unit-test/member_chain/_output.java b/test/unit-test/member_chain/_output.java index 349d1bcc..0ac4314a 100644 --- a/test/unit-test/member_chain/_output.java +++ b/test/unit-test/member_chain/_output.java @@ -230,5 +230,28 @@ void argumentComment() { a( b.c() // comment ); + + a( + b, // comment + c.d + ); + + a( + b, // comment + c.d[0] + ); + + a( + b, // comment + c.d() + ); + } + + void prettierIgnore() { + a -> + // prettier-ignore + b + .c().d() + .e().f(); } }