(
callNode: TSNode,
code: string,
ctx: EdgeParseContext,
functionText: string
)
| 432 | * Parse edge creation call (create_edge, edge_from_entry, edge_to_exit, etc.) |
| 433 | */ |
| 434 | export function parseEdgeCreation( |
| 435 | callNode: TSNode, |
| 436 | code: string, |
| 437 | ctx: EdgeParseContext, |
| 438 | functionText: string |
| 439 | ): void { |
| 440 | const argsNode = callNode.childForFieldName('arguments'); |
| 441 | if (!argsNode) {return;} |
| 442 | |
| 443 | const args = argsNode.namedChildren.filter((n): n is TSNode => !!n && n.type !== 'comment'); |
| 444 | const lineOffset = ctx.lineOffset || 0; |
| 445 | const lineNumber = callNode.startPosition.row + 1 + lineOffset; |
| 446 | |
| 447 | let parsed: ParsedEdgeInfo | null = null; |
| 448 | for (const rule of EDGE_PARSE_RULES) { |
| 449 | if (functionText.endsWith(rule.suffix)) { |
| 450 | parsed = rule.parse(args, code, ctx, functionText); |
| 451 | break; |
| 452 | } |
| 453 | } |
| 454 | |
| 455 | const sender = parsed?.sender || ''; |
| 456 | const receiver = parsed?.receiver || ''; |
| 457 | const keys = parsed?.keys || []; |
| 458 | const keysDetails = parsed?.keysDetails; |
| 459 | |
| 460 | // Add edge if both sender and receiver are valid |
| 461 | if (sender && receiver) { |
| 462 | ctx.edges.push({ |
| 463 | from: sender, |
| 464 | to: receiver, |
| 465 | keys: keys, |
| 466 | keysDetails: keysDetails, |
| 467 | lineNumber: lineNumber |
| 468 | }); |
| 469 | console.log(`[Parser] Found edge: ${sender} -> ${receiver}`); |
| 470 | } else { |
| 471 | console.log(`[Parser] Warning: Incomplete edge at line ${lineNumber}: sender=${sender}, receiver=${receiver}`); |
| 472 | } |
| 473 | } |
| 474 | |
| 475 | /** |
| 476 | * Resolve node reference (variable name to node name) |
no test coverage detected