{
  "version": 3,
  "sources": ["../../../src/parser/formatter.ts"],
  "sourcesContent": [
    "import { indexToColumn } from \"../core/utils.cjs\";\nimport { type CellValue, type SerializedCellValue } from \"../core/types.cjs\";\nimport { parseOpenEndedRange, parseInfiniteRange } from \"./grammar.cjs\";\nimport type {\n  ArrayNode,\n  ASTNode,\n  BinaryOpNode,\n  FunctionNode,\n  NamedExpressionNode,\n  RangeNode,\n  ReferenceNode,\n  StructuredReferenceNode,\n  ThreeDRangeNode,\n  UnaryOpNode,\n  ValueNode,\n} from \"./ast.cjs\";\nimport { getOperatorPrecedence, getOperatorAssociativity } from \"./grammar.cjs\";\nimport { parseFormula } from \"./parser.cjs\";\n\nexport function astToString(ast: ASTNode): string {\n  switch (ast.type) {\n    case \"value\":\n      return formatValue(ast.value);\n\n    case \"reference\":\n      return formatReference(ast);\n\n    case \"range\":\n      return formatRange(ast);\n\n    case \"function\":\n      return formatFunction(ast);\n\n    case \"unary-op\":\n      return formatUnaryOp(ast);\n\n    case \"binary-op\":\n      return formatBinaryOp(ast);\n\n    case \"array\":\n      return formatArray(ast);\n\n    case \"named-expression\":\n      return formatNamedExpression(ast);\n\n    case \"error\":\n      return ast.error;\n\n    case \"empty\":\n      return \"\";\n\n    case \"3d-range\":\n      return formatThreeDRange(ast);\n\n    case \"structured-reference\":\n      return formatStructuredReference(ast);\n\n    case \"infinity\":\n      return \"INFINITY\";\n\n    default:\n      throw new Error(`Unknown AST node type: ${(ast as any).type}`);\n  }\n}\n\nfunction formatValue(value: CellValue): string {\n  if (value.type === \"string\") {\n    // Escape quotes by doubling them and wrap in quotes\n    return `\"${value.value.replace(/\"/g, '\"\"')}\"`;\n  } else if (value.type === \"boolean\") {\n    return value.value ? \"TRUE\" : \"FALSE\";\n  } else if (value.type === \"number\") {\n    return value.value.toString();\n  }\n  return String(value);\n}\n\nfunction formatReference(ast: ReferenceNode): string {\n  const { address, isAbsolute, sheetName, workbookName } = ast;\n  const colLetter = indexToColumn(address.colIndex);\n  const rowNumber = address.rowIndex + 1; // Convert from 0-based to 1-based\n\n  const colRef = isAbsolute.col ? `$${colLetter}` : colLetter;\n  const rowRef = isAbsolute.row ? `$${rowNumber}` : rowNumber.toString();\n\n  const cellRef = `${colRef}${rowRef}`;\n\n  let result = cellRef;\n\n  if (sheetName) {\n    const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n    result = `${quotedSheet}!${cellRef}`;\n  }\n\n  if (workbookName) {\n    result = `[${workbookName}]${result}`;\n  }\n\n  return result;\n}\n\nfunction formatRange(ast: RangeNode): string {\n  const { range, isAbsolute, sheetName, workbookName } = ast;\n\n  // Handle infinite ranges\n  if (range.end.col.type === \"infinity\" || range.end.row.type === \"infinity\") {\n    return formatInfiniteRange(ast);\n  }\n\n  // Regular range\n  const startCol = indexToColumn(range.start.col);\n  const startRow = range.start.row + 1;\n  const endCol = indexToColumn(range.end.col.value);\n  const endRow = range.end.row.value + 1;\n\n  const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n  const startRowRef = isAbsolute.start.row\n    ? `$${startRow}`\n    : startRow.toString();\n  const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n  const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n  const rangeRef = `${startColRef}${startRowRef}:${endColRef}${endRowRef}`;\n\n  let result = rangeRef;\n\n  if (sheetName) {\n    const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n    result = `${quotedSheet}!${rangeRef}`;\n  }\n\n  if (workbookName) {\n    result = `[${workbookName}]${result}`;\n  }\n\n  return result;\n}\n\nfunction formatInfiniteRange(ast: RangeNode): string {\n  const { range, isAbsolute, sheetName, workbookName } = ast;\n\n  let rangeRef: string;\n\n  // Canonical formatting rules:\n  // 1. Start is always explicit cell (A5, $A$5, etc.)\n  // 2. End varies by openness:\n  //    - Open→: A5:10 (row-bounded)\n  //    - Open↓: A5:D (column-bounded)\n  //    - Open both: A5:INFINITY\n  // 3. Excel compatibility: whole rows/columns use canonical cell form\n  //    - 5:5 → A5:5, A:A → A1:A\n\n  const startCol = indexToColumn(range.start.col);\n  const startRow = range.start.row + 1;\n\n  const startColRef = isAbsolute.start.col ? `$${startCol}` : startCol;\n  const startRowRef = isAbsolute.start.row\n    ? `$${startRow}`\n    : startRow.toString();\n\n  if (range.end.col.type === \"infinity\" && range.end.row.type === \"infinity\") {\n    // Open both: A5:INFINITY\n    rangeRef = `${startColRef}${startRowRef}:INFINITY`;\n  } else if (range.end.col.type === \"infinity\") {\n    // Open→ (row-bounded): A5:10\n    if (range.end.row.type !== \"number\") {\n      throw new Error(\"Expected finite row for infinite column range\");\n    }\n\n    const endRow = range.end.row.value + 1;\n    const endRowRef = isAbsolute.end.row ? `$${endRow}` : endRow.toString();\n\n    // Always use canonical cell form: A5:10 (not 5:10)\n    rangeRef = `${startColRef}${startRowRef}:${endRowRef}`;\n  } else if (range.end.row.type === \"infinity\") {\n    // Open↓ (column-bounded): A5:D\n    if (range.end.col.type !== \"number\") {\n      throw new Error(\"Expected finite column for infinite row range\");\n    }\n\n    const endCol = indexToColumn(range.end.col.value);\n    const endColRef = isAbsolute.end.col ? `$${endCol}` : endCol;\n\n    // Always use canonical cell form: A1:D (not A:D)\n    rangeRef = `${startColRef}${startRowRef}:${endColRef}`;\n  } else {\n    throw new Error(\n      \"Expected at least one infinite dimension for infinite range\"\n    );\n  }\n\n  let result = rangeRef;\n\n  if (sheetName) {\n    const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n    result = `${quotedSheet}!${rangeRef}`;\n  }\n\n  if (workbookName) {\n    result = `[${workbookName}]${result}`;\n  }\n\n  return result;\n}\n\nfunction formatFunction(ast: FunctionNode): string {\n  const { name, args } = ast;\n  const formattedArgs = args.map((arg: ASTNode) => astToString(arg)).join(\",\");\n  return `${name}(${formattedArgs})`;\n}\n\nfunction formatUnaryOp(ast: UnaryOpNode): string {\n  const { operator, operand } = ast;\n  const operandStr = astToString(operand);\n\n  if (operator === \"%\") {\n    return `${operandStr}%`;\n  } else {\n    return `${operator}${operandStr}`;\n  }\n}\n\nfunction formatBinaryOp(ast: BinaryOpNode): string {\n  const { operator, left, right } = ast;\n\n  // Determine if we need parentheses for left and right operands\n  const leftNeedsParens = needsParentheses(left, ast, \"left\");\n  const rightNeedsParens = needsParentheses(right, ast, \"right\");\n\n  const leftStr = leftNeedsParens\n    ? `(${astToString(left)})`\n    : astToString(left);\n  const rightStr = rightNeedsParens\n    ? `(${astToString(right)})`\n    : astToString(right);\n\n  return `${leftStr}${operator}${rightStr}`;\n}\n\nfunction needsParentheses(\n  child: ASTNode,\n  parent: ASTNode,\n  position: \"left\" | \"right\"\n): boolean {\n  if (child.type !== \"binary-op\") {\n    return false;\n  }\n\n  // Only binary operations need precedence checking\n  if (parent.type !== \"binary-op\") {\n    return false;\n  }\n\n  const childPrecedence = getOperatorPrecedence(child.operator);\n  const parentPrecedence = getOperatorPrecedence(parent.operator);\n\n  // Lower precedence always needs parentheses\n  if (childPrecedence < parentPrecedence) {\n    return true;\n  }\n\n  // For same precedence, check associativity\n  if (childPrecedence === parentPrecedence) {\n    const associativity = getOperatorAssociativity(parent.operator);\n\n    // For left-associative operators, right side needs parentheses\n    // For right-associative operators, left side needs parentheses\n    if (associativity === \"left\" && position === \"right\") {\n      return true;\n    } else if (associativity === \"right\" && position === \"left\") {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction formatArray(ast: ArrayNode): string {\n  const { elements } = ast;\n  const rows = elements.map((row: ASTNode[]) =>\n    row.map((cell: ASTNode) => astToString(cell)).join(\",\")\n  );\n  return `{${rows.join(\";\")}}`;\n}\n\nfunction formatNamedExpression(ast: NamedExpressionNode): string {\n  const { name, sheetName, workbookName } = ast;\n\n  let result = name;\n\n  if (sheetName !== undefined) {\n    // Sheet-scoped named expression\n    const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n    result = `${quotedSheet}!${name}`;\n  }\n\n  if (workbookName) {\n    result = `[${workbookName}]${result}`;\n  }\n\n  return result;\n}\n\nfunction formatThreeDRange(ast: ThreeDRangeNode): string {\n  const { startSheet, endSheet, workbookName, reference } = ast;\n  const refStr = astToString(reference);\n\n  // Remove sheet name and workbook name from reference if present (since we're adding the 3D range prefix)\n  let cleanRef = refStr;\n  if (cleanRef.includes(\"!\")) {\n    cleanRef = cleanRef.split(\"!\")[1]!;\n  }\n  // Remove workbook prefix if present\n  if (cleanRef.startsWith(\"[\") && cleanRef.includes(\"]\")) {\n    const bracketEnd = cleanRef.indexOf(\"]\");\n    cleanRef = cleanRef.substring(bracketEnd + 1);\n  }\n\n  const quotedStartSheet = startSheet.includes(\" \")\n    ? `'${startSheet}'`\n    : startSheet;\n  const quotedEndSheet = endSheet.includes(\" \") ? `'${endSheet}'` : endSheet;\n\n  let result = `${quotedStartSheet}:${quotedEndSheet}!${cleanRef}`;\n\n  if (workbookName) {\n    result = `[${workbookName}]${result}`;\n  }\n\n  return result;\n}\n\n/**\n * Check if a column name contains special characters that require double bracket syntax\n */\nfunction needsColumnBrackets(columnName: string): boolean {\n  // Column names need extra brackets if they contain spaces or special characters\n  // Note: Colons are NOT included here since they can be part of column names\n  // Column ranges must use explicit double-bracket syntax: [[Col1]:[Col2]]\n  return /[\\s\\[\\]#@,=/]/.test(columnName);\n}\n\nfunction formatStructuredReference(ast: StructuredReferenceNode): string {\n  const { tableName, sheetName, workbookName, cols, selector, isCurrentRow } =\n    ast;\n\n  if (!tableName && isCurrentRow) {\n    // Current row reference like [@Column] or @Column\n    if (cols && cols.startCol) {\n      return `[@${cols.startCol}]`;\n    }\n    return \"@\";\n  }\n\n  if (!tableName && !isCurrentRow) {\n    // Bare column reference like [Column] or [#Data]\n    if (selector) {\n      return `[${selector}]`;\n    } else if (cols) {\n      const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n\n      if (cols.startCol === cols.endCol) {\n        // Single column\n        if (startNeedsBrackets) {\n          return `[[${cols.startCol}]]`;\n        } else {\n          return `[${cols.startCol}]`;\n        }\n      } else {\n        // Column range - always use double-bracket syntax to avoid ambiguity\n        // with column names that contain colons\n        return `[[${cols.startCol}]:[${cols.endCol}]]`;\n      }\n    }\n    return \"[]\"; // Empty bare reference (shouldn't happen)\n  }\n\n  let result = \"\";\n\n  if (workbookName) {\n    result += `[${workbookName}]!`;\n  } else if (sheetName) {\n    const quotedSheet = sheetName.includes(\" \") ? `'${sheetName}'` : sheetName;\n    result += `${quotedSheet}!`;\n  }\n\n  result += tableName;\n\n  if (selector && cols) {\n    // Complex syntax like Table1[[#Headers],[Column1]] or Table1[[#Headers],[Col1]:[Col2]]\n    const colRef =\n      cols.startCol === cols.endCol\n        ? `[${cols.startCol}]`  // Single column: [Column]\n        : `[${cols.startCol}]:[${cols.endCol}]`;  // Range: [Col1]:[Col2]\n    result += `[[${selector}],${colRef}]`;\n  } else if (selector) {\n    // Simple selector like Table1[#Data]\n    result += `[${selector}]`;\n  } else if (cols) {\n    const startNeedsBrackets = needsColumnBrackets(cols.startCol);\n    const endNeedsBrackets =\n      cols.startCol !== cols.endCol && needsColumnBrackets(cols.endCol);\n    const anyNeedsBrackets = startNeedsBrackets || endNeedsBrackets;\n\n    if (isCurrentRow) {\n      // Current row references\n      if (cols.startCol === cols.endCol) {\n        // Single column - always use simple format [@ColumnName]\n        // No need for double brackets even if column name has spaces\n        result += `[@${cols.startCol}]`;\n      } else {\n        // Column range - always use double-bracket syntax to avoid ambiguity\n        // with column names that contain colons\n        result += `[@[${cols.startCol}]:[${cols.endCol}]]`;\n      }\n    } else {\n      // Regular column references\n      if (cols.startCol === cols.endCol) {\n        // Single column - always use single brackets for table references\n        result += `[${cols.startCol}]`;\n      } else {\n        // Column range - always use double-bracket syntax to avoid ambiguity\n        // with column names that contain colons\n        result += `[[${cols.startCol}]:[${cols.endCol}]]`;\n      }\n    }\n  }\n\n  return result;\n}\n\nexport function formatFormula(formula: string): string {\n  return astToString(parseFormula(formula));\n}\n\nexport function normalizeSerializedCellValue(\n  value: SerializedCellValue\n): SerializedCellValue {\n  if (value === undefined || (typeof value === \"string\" && value === \"\"))\n    return \"\";\n\n  if (typeof value === \"string\" && value.startsWith(\"=\")) {\n    return `=${formatFormula(value.slice(1))}`;\n  }\n\n  return value;\n}\n\nexport function isSerializedCellValueEqual(\n  a: SerializedCellValue,\n  b: SerializedCellValue\n): boolean {\n  const normalizedA = normalizeSerializedCellValue(a);\n  const normalizedB = normalizeSerializedCellValue(b);\n\n  return normalizedA === normalizedB;\n}\n"
  ],
  "mappings": "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",
  "debugId": "1755F00DD1DD7AC364756E2164756E21",
  "names": []
}