{
  "version": 3,
  "sources": ["../../../src/core/ast-traverser.ts"],
  "sourcesContent": [
    "import type { ASTNode } from \"../parser/ast.cjs\";\n\n/**\n * Visitor function type for AST traversal\n */\nexport type ASTVisitor<T = void> = (node: ASTNode, parent?: ASTNode) => T;\n\n/**\n * Traverses an AST node and all its children, calling the visitor function for each node\n * @param node - The AST node to traverse\n * @param visitor - Function called for each node during traversal\n * @param parent - The parent node (used internally for recursion)\n */\nexport function traverseAST<T = void>(\n  node: ASTNode,\n  visitor: ASTVisitor<T>,\n  parent?: ASTNode\n): void {\n  // Visit the current node\n  visitor(node, parent);\n\n  // Recursively traverse children based on node type\n  switch (node.type) {\n    case \"binary-op\":\n      traverseAST(node.left, visitor, node);\n      traverseAST(node.right, visitor, node);\n      break;\n\n    case \"unary-op\":\n      traverseAST(node.operand, visitor, node);\n      break;\n\n    case \"function\":\n      node.args.forEach((arg) => traverseAST(arg, visitor, node));\n      break;\n\n    case \"array\":\n      node.elements.forEach((row) =>\n        row.forEach((element) => traverseAST(element, visitor, node))\n      );\n      break;\n\n    case \"range\":\n      // Range nodes don't have start/end child nodes in this AST structure\n      // They have a range property with coordinates\n      break;\n\n    case \"3d-range\":\n      traverseAST(node.reference, visitor, node);\n      break;\n\n    case \"structured-reference\":\n    case \"reference\":\n    case \"value\":\n    case \"named-expression\":\n    case \"error\":\n    case \"empty\":\n    case \"infinity\":\n      // These are leaf nodes, no children to traverse\n      break;\n\n    default:\n      // Handle any unknown node types gracefully\n      console.warn(`Unknown AST node type: ${(node as any).type}`);\n      break;\n  }\n}\n\n/**\n * Finds all nodes of a specific type in an AST\n * @param node - The root AST node to search\n * @param nodeType - The type of nodes to find\n * @returns Array of nodes matching the specified type\n */\nexport function findNodesByType<T extends ASTNode[\"type\"]>(\n  node: ASTNode,\n  nodeType: T\n): Extract<ASTNode, { type: T }>[] {\n  const results: Extract<ASTNode, { type: T }>[] = [];\n\n  traverseAST(node, (currentNode) => {\n    if (currentNode.type === nodeType) {\n      results.push(currentNode as Extract<ASTNode, { type: T }>);\n    }\n  });\n\n  return results;\n}\n\n/**\n * Transforms an AST by applying a transformation function to each node\n * @param node - The AST node to transform\n * @param transformer - Function that transforms each node\n * @returns The transformed AST\n */\nexport function transformAST(\n  node: ASTNode,\n  transformer: (node: ASTNode, parent?: ASTNode) => ASTNode\n): ASTNode {\n  const transform = (currentNode: ASTNode, parent?: ASTNode): ASTNode => {\n    // First transform children\n    let transformedNode: ASTNode;\n\n    switch (currentNode.type) {\n      case \"binary-op\":\n        transformedNode = {\n          ...currentNode,\n          left: transform(currentNode.left, currentNode),\n          right: transform(currentNode.right, currentNode),\n        };\n        break;\n\n      case \"unary-op\":\n        transformedNode = {\n          ...currentNode,\n          operand: transform(currentNode.operand, currentNode),\n        };\n        break;\n\n      case \"function\":\n        transformedNode = {\n          ...currentNode,\n          args: currentNode.args.map((arg) => transform(arg, currentNode)),\n        };\n        break;\n\n      case \"array\":\n        transformedNode = {\n          ...currentNode,\n          elements: currentNode.elements.map((row) =>\n            row.map((element) => transform(element, currentNode))\n          ),\n        };\n        break;\n\n      case \"3d-range\":\n        transformedNode = {\n          ...currentNode,\n          reference: transform(currentNode.reference, currentNode) as typeof currentNode.reference,\n        };\n        break;\n\n      default:\n        // Leaf nodes or unknown types - return as is\n        transformedNode = { ...currentNode };\n        break;\n    }\n\n    // Then apply the transformer to the current node\n    return transformer(transformedNode, parent);\n  };\n\n  return transform(node);\n}\n"
  ],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAAS,WAAqB,CACnC,MACA,SACA,QACM;AAAA,EAEN,QAAQ,MAAM,MAAM;AAAA,EAGpB,QAAQ,KAAK;AAAA,SACN;AAAA,MACH,YAAY,KAAK,MAAM,SAAS,IAAI;AAAA,MACpC,YAAY,KAAK,OAAO,SAAS,IAAI;AAAA,MACrC;AAAA,SAEG;AAAA,MACH,YAAY,KAAK,SAAS,SAAS,IAAI;AAAA,MACvC;AAAA,SAEG;AAAA,MACH,KAAK,KAAK,QAAQ,CAAC,QAAQ,YAAY,KAAK,SAAS,IAAI,CAAC;AAAA,MAC1D;AAAA,SAEG;AAAA,MACH,KAAK,SAAS,QAAQ,CAAC,QACrB,IAAI,QAAQ,CAAC,YAAY,YAAY,SAAS,SAAS,IAAI,CAAC,CAC9D;AAAA,MACA;AAAA,SAEG;AAAA,MAGH;AAAA,SAEG;AAAA,MACH,YAAY,KAAK,WAAW,SAAS,IAAI;AAAA,MACzC;AAAA,SAEG;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,SACA;AAAA,MAEH;AAAA;AAAA,MAIA,QAAQ,KAAK,0BAA2B,KAAa,MAAM;AAAA,MAC3D;AAAA;AAAA;AAUC,SAAS,eAA0C,CACxD,MACA,UACiC;AAAA,EACjC,MAAM,UAA2C,CAAC;AAAA,EAElD,YAAY,MAAM,CAAC,gBAAgB;AAAA,IACjC,IAAI,YAAY,SAAS,UAAU;AAAA,MACjC,QAAQ,KAAK,WAA4C;AAAA,IAC3D;AAAA,GACD;AAAA,EAED,OAAO;AAAA;AASF,SAAS,YAAY,CAC1B,MACA,aACS;AAAA,EACT,MAAM,YAAY,CAAC,aAAsB,WAA8B;AAAA,IAErE,IAAI;AAAA,IAEJ,QAAQ,YAAY;AAAA,WACb;AAAA,QACH,kBAAkB;AAAA,aACb;AAAA,UACH,MAAM,UAAU,YAAY,MAAM,WAAW;AAAA,UAC7C,OAAO,UAAU,YAAY,OAAO,WAAW;AAAA,QACjD;AAAA,QACA;AAAA,WAEG;AAAA,QACH,kBAAkB;AAAA,aACb;AAAA,UACH,SAAS,UAAU,YAAY,SAAS,WAAW;AAAA,QACrD;AAAA,QACA;AAAA,WAEG;AAAA,QACH,kBAAkB;AAAA,aACb;AAAA,UACH,MAAM,YAAY,KAAK,IAAI,CAAC,QAAQ,UAAU,KAAK,WAAW,CAAC;AAAA,QACjE;AAAA,QACA;AAAA,WAEG;AAAA,QACH,kBAAkB;AAAA,aACb;AAAA,UACH,UAAU,YAAY,SAAS,IAAI,CAAC,QAClC,IAAI,IAAI,CAAC,YAAY,UAAU,SAAS,WAAW,CAAC,CACtD;AAAA,QACF;AAAA,QACA;AAAA,WAEG;AAAA,QACH,kBAAkB;AAAA,aACb;AAAA,UACH,WAAW,UAAU,YAAY,WAAW,WAAW;AAAA,QACzD;AAAA,QACA;AAAA;AAAA,QAIA,kBAAkB,KAAK,YAAY;AAAA,QACnC;AAAA;AAAA,IAIJ,OAAO,YAAY,iBAAiB,MAAM;AAAA;AAAA,EAG5C,OAAO,UAAU,IAAI;AAAA;",
  "debugId": "E8318324D7793CBA64756E2164756E21",
  "names": []
}