|
1 | 1 | import { util, type AstPath, type Doc } from "prettier"; |
2 | 2 | import { builders } from "prettier/doc"; |
3 | | -import { SyntaxType, type CommentNode, type SyntaxNode } from "./node-types.ts"; |
| 3 | +import { |
| 4 | + SyntaxType, |
| 5 | + type ArrayAccessNode, |
| 6 | + type CommentNode, |
| 7 | + type FieldAccessNode, |
| 8 | + type MethodInvocationNode, |
| 9 | + type SyntaxNode |
| 10 | +} from "./node-types.ts"; |
4 | 11 | import parser from "./parser.ts"; |
5 | 12 | import printer from "./printer.ts"; |
6 | 13 | import { |
@@ -190,18 +197,20 @@ function handleLabeledStatementComments(commentNode: CommentNode) { |
190 | 197 | function handleMemberChainComments(commentNode: CommentNode) { |
191 | 198 | const { enclosingNode, precedingNode, followingNode } = commentNode; |
192 | 199 | if ( |
| 200 | + precedingNode && |
193 | 201 | (enclosingNode?.type === SyntaxType.FieldAccess || |
194 | 202 | (enclosingNode?.type === SyntaxType.MethodInvocation && |
195 | | - precedingNode?.end.row !== commentNode.start.row)) && |
196 | | - (followingNode?.type === SyntaxType.Identifier || |
197 | | - followingNode?.type === SyntaxType.TypeArguments) |
| 203 | + precedingNode.end.row < commentNode.start.row)) && |
| 204 | + precedingNode === enclosingNode.objectNode |
198 | 205 | ) { |
199 | 206 | util.addLeadingComment(enclosingNode, commentNode); |
200 | 207 | return true; |
201 | 208 | } else if ( |
202 | 209 | followingNode && |
203 | 210 | isMember(followingNode) && |
204 | | - precedingNode !== enclosingNode && |
| 211 | + (!precedingNode || |
| 212 | + (precedingNode !== getMemberObject(followingNode) && |
| 213 | + precedingNode.end.row < commentNode.start.row)) && |
205 | 214 | !isPrettierIgnore(commentNode) |
206 | 215 | ) { |
207 | 216 | util.addDanglingComment(followingNode, commentNode, undefined); |
@@ -291,6 +300,14 @@ function isMember(node: SyntaxNode) { |
291 | 300 | ); |
292 | 301 | } |
293 | 302 |
|
| 303 | +function getMemberObject( |
| 304 | + node: ArrayAccessNode | FieldAccessNode | MethodInvocationNode |
| 305 | +) { |
| 306 | + return node.type === SyntaxType.ArrayAccess |
| 307 | + ? node.arrayNode |
| 308 | + : node.objectNode; |
| 309 | +} |
| 310 | + |
294 | 311 | const binaryOperators = new Set([ |
295 | 312 | "<<", |
296 | 313 | ">>", |
|
0 commit comments