import { Tree, TreeCursor } from '@lezer/common' import { assertNever } from '#utils/utils' import { type Value, fromValue } from 'reefvm' export const treeToString = (tree: Tree, input: string): string => { const lines: string[] = [] const addNode = (cursor: TreeCursor, depth: number) => { if (!cursor.name) return const indent = ' '.repeat(depth) const text = input.slice(cursor.from, cursor.to) const nodeName = cursor.name // Save the node name before moving cursor if (cursor.firstChild()) { lines.push(`${indent}${nodeName}`) do { addNode(cursor, depth + 1) } while (cursor.nextSibling()) cursor.parent() } else { const cleanText = nodeName === 'String' ? text.slice(1, -1) : text lines.push(`${indent}${nodeName} ${cleanText}`) } } const cursor = tree.cursor() if (cursor.firstChild()) { do { addNode(cursor, 0) } while (cursor.nextSibling()) } return lines.join('\n') } export const VMResultToValue = (result: Value): unknown => { if (result.type === 'function') return Function else return fromValue(result) }