41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
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)
|
|
}
|