From 930d98a0ffd4a77a24b67b714653df2903211d8a Mon Sep 17 00:00:00 2001 From: rgthree Date: Sat, 19 Jul 2025 21:54:33 -0400 Subject: [PATCH] Add initial code for a conductor node plus tree sitter. --- __build__.py | 5 + package-lock.json | 9 +- package.json | 3 +- src_web/comfyui/constants.ts | 16 +- src_web/comfyui/power_conductor.ts | 553 ++++ src_web/lib/tree-sitter-python.wasm | Bin 0 -> 457796 bytes src_web/lib/tree-sitter.js | 3978 ++++++++++++++++++++++++++ src_web/lib/tree-sitter.wasm | Bin 0 -> 205491 bytes src_web/scripts_comfy/widgets.ts | 11 +- src_web/typings/web-tree-sitter.d.ts | 1 + tsconfig.json | 4 + web/comfyui/constants.js | 12 +- web/comfyui/power_conductor.js | 453 +++ web/lib/tree-sitter-python.wasm | Bin 0 -> 457796 bytes web/lib/tree-sitter.js | 3978 ++++++++++++++++++++++++++ web/lib/tree-sitter.wasm | Bin 0 -> 205491 bytes 16 files changed, 9008 insertions(+), 15 deletions(-) create mode 100644 src_web/comfyui/power_conductor.ts create mode 100644 src_web/lib/tree-sitter-python.wasm create mode 100644 src_web/lib/tree-sitter.js create mode 100644 src_web/lib/tree-sitter.wasm create mode 100644 src_web/typings/web-tree-sitter.d.ts create mode 100644 web/comfyui/power_conductor.js create mode 100644 web/lib/tree-sitter-python.wasm create mode 100644 web/lib/tree-sitter.js create mode 100644 web/lib/tree-sitter.wasm diff --git a/__build__.py b/__build__.py index 2410ab8..532ddda 100644 --- a/__build__.py +++ b/__build__.py @@ -122,9 +122,14 @@ def build(without_tests = True, fix = False): if rel_path.startswith('comfyui'): filedata = re.sub(r'(from\s+["\'])rgthree/', f'\\1{"../" * (num + 1)}rgthree/', filedata) filedata = re.sub(r'(from\s+["\'])scripts/', f'\\1{"../" * (num + 1)}scripts/', filedata) + # Dynamic Imports + filedata = re.sub(r'(import\(["\'])rgthree/', f'\\1{"../" * (num + 1)}rgthree/', filedata) else: filedata = re.sub(r'(from\s+["\'])rgthree/', f'\\1{"../" * num}', filedata) filedata = re.sub(r'(from\s+["\'])scripts/', f'\\1{"../" * (num + 1)}scripts/', filedata) + # Dynamic Imports + filedata = re.sub(r'(import\(["\'])rgthree/', f'\\1{"../" * num}', filedata) + filedata, n = re.subn(r'(\s*from [\'"](?!.*[.]js[\'"]).*?)([\'"];)', '\\1.js\\2', filedata) if n > 0: filename = os.path.basename(file) diff --git a/package-lock.json b/package-lock.json index 1f74417..56570c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "@comfyorg/litegraph": "^0.11.3", "prettier": "^3.3.3", "sass": "^1.77.8", - "typescript": "^5.5.4" + "typescript": "^5.5.4", + "web-tree-sitter": "0.25.6" } }, "node_modules/@babel/helper-string-parser": { @@ -557,6 +558,12 @@ } } }, + "node_modules/web-tree-sitter": { + "version": "0.25.6", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.25.6.tgz", + "integrity": "sha512-WG+/YGbxw8r+rLlzzhV+OvgiOJCWdIpOucG3qBf3RCBFMkGDb1CanUi2BxCxjnkpzU3/hLWPT8VO5EKsMk9Fxg==", + "dev": true + }, "node_modules/zod": { "version": "3.24.2", "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", diff --git a/package.json b/package.json index bd37504..dda2bf6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "typescript": "^5.5.4", "sass": "^1.77.8", "@comfyorg/litegraph": "^0.11.3", - "@comfyorg/comfyui-frontend-types": "^1.15.5" + "@comfyorg/comfyui-frontend-types": "^1.15.5", + "web-tree-sitter": "0.25.6" }, "scripts": { "build": "./__build__.py || python .\\__build__.py" diff --git a/src_web/comfyui/constants.ts b/src_web/comfyui/constants.ts index dbff91e..4e6a13f 100644 --- a/src_web/comfyui/constants.ts +++ b/src_web/comfyui/constants.ts @@ -33,6 +33,7 @@ export const NodeTypesString = { POWER_PROMPT: addRgthree("Power Prompt"), POWER_PROMPT_SIMPLE: addRgthree("Power Prompt - Simple"), POWER_PUTER: addRgthree("Power Puter"), + POWER_CONDUCTOR: addRgthree("Power Conductor"), SDXL_EMPTY_LATENT_IMAGE: addRgthree("SDXL Empty Latent Image"), SDXL_POWER_PROMPT_POSITIVE: addRgthree("SDXL Power Prompt - Positive"), SDXL_POWER_PROMPT_NEGATIVE: addRgthree("SDXL Power Prompt - Simple / Negative"), @@ -47,18 +48,23 @@ export const NodeTypesString = { IMAGE_INSET_CROP: addRgthree("Image Inset Crop"), }; +const UNRELEASED_KEYS = { + [NodeTypesString.DYNAMIC_CONTEXT]: "dynamic_context", + [NodeTypesString.DYNAMIC_CONTEXT_SWITCH]: "dynamic_context", + [NodeTypesString.POWER_CONDUCTOR]: "power_conductor", +}; + + /** * Gets the list of nodes from NoteTypeString above, filtering any that are not applicable. */ export function getNodeTypeStrings() { + const unreleasedKeys = Object.keys(UNRELEASED_KEYS); return Object.values(NodeTypesString) .map((i) => stripRgthree(i)) .filter((i) => { - if ( - i.startsWith("Dynamic Context") && - !CONFIG_SERVICE.getConfigValue("unreleased.dynamic_context.enabled") - ) { - return false; + if (unreleasedKeys.includes(i)) { + return !!CONFIG_SERVICE.getConfigValue(`unreleased.${UNRELEASED_KEYS[i]}.enabled`) } return true; }) diff --git a/src_web/comfyui/power_conductor.ts b/src_web/comfyui/power_conductor.ts new file mode 100644 index 0000000..51bd52b --- /dev/null +++ b/src_web/comfyui/power_conductor.ts @@ -0,0 +1,553 @@ +import type {Parser, Node, Tree} from "web-tree-sitter"; +import type {IStringWidget} from "@comfyorg/litegraph/dist/types/widgets"; + +import {app} from "scripts/app.js"; +import {RgthreeBaseVirtualNode} from "./base_node.js"; +import {RgthreeBetterButtonWidget} from "./utils_widgets.js"; +import {NodeTypesString} from "./constants.js"; +import {ComfyWidgets} from "scripts/widgets.js"; +import {SERVICE as CONFIG_SERVICE} from "./services/config_service.js"; + +class RgthreePowerConductor extends RgthreeBaseVirtualNode { + static override title = NodeTypesString.POWER_CONDUCTOR; + static override type = NodeTypesString.POWER_CONDUCTOR; + override comfyClass = NodeTypesString.POWER_CONDUCTOR; + + private codeWidget: IStringWidget; + private buttonWidget: RgthreeBetterButtonWidget; + + constructor(title = RgthreePowerConductor.title) { + super(title); + + this.codeWidget = ComfyWidgets.STRING(this, "", ["STRING", {multiline: true}], app).widget; + this.addCustomWidget(this.codeWidget); + + (this.buttonWidget = new RgthreeBetterButtonWidget("Run", (...args: any[]) => { + this.execute(); + })), + this.addCustomWidget(this.buttonWidget); + + this.onConstructed(); + } + + private execute() { + const executor = new Executor(); + executor.execute(this.codeWidget.value); + } +} + +const NODE_CLASS = RgthreePowerConductor; + +let parser: Parser | null = null; + +async function getParser(): Promise { + if (parser) { + return parser; + } + + // @ts-ignore - Path is rewritten. + const TreeSitter = (await import("rgthree/lib/tree-sitter.js")) as TreeSitter; + await TreeSitter.Parser.init(); + const lang = await TreeSitter.Language.load("rgthree/lib/tree-sitter-python.wasm"); + parser = new TreeSitter.Parser() as Parser; + parser.setLanguage(lang); + return parser; +} + +async function parse(code: string): Promise { + parser = await getParser(); + return parser.parse(code)!; +} + +function check(value: any, msg = ""): asserts value { + if (!value) { + throw new Error(msg || "Error"); + } +} + +type NodeType = SimpleNode; + +class PyTuple { + protected list: any[]; + constructor(...args: any[]) { + if (args.length === 1 && args[0] instanceof PyTuple) { + args = args[0].__unwrap__(); + } + this.list = [...args]; + } + count(v: any) { + // TODO + } + index() { + // TODO + } + + __unwrap__() { + const l = [...this.list]; + for (let i = 0; i < l.length; i++) { + l[i] = l[i]?.__unwrap__ ? l[i].__unwrap__() : l[i]; + } + return l; + } + + __len__() { + return this.list.length; + } + + __add__(v: any) { + if (!(v instanceof PyTuple)) { + throw new Error("Can only concatenate tuple to tuple."); + } + return new PyTuple(this.__unwrap__().concat(v.__unwrap__())); + } +} + +class PyList extends PyTuple { + append(...args: any[]) { + this.list.push(...args); + } + + clear() { + this.list.length = 0; + } + + insert() { + // TODO + } + pop() { + // TODO + } + remove() { + // TODO + } + reverse() { + // TODO + } + sort() { + // TODO + } + + override __add__(v: any) { + if (!(v instanceof PyList)) { + throw new Error("Can only concatenate list to list."); + } + return new PyList(this.__unwrap__().concat(v.__unwrap__())); + } +} + +class PyInt {} + +function __unwrap__(...args: any[]) { + for (let i = 0; i < args.length; i++) { + args[i] = args[i]?.__unwrap__ ? args[i].__unwrap__() : args[i]; + } + return args; +} + +const BUILT_INS = new Map([ + ["round", (n: any) => Math.round(Number(n))], + ["floor", (n: any) => Math.floor(Number(n))], + ["ceil", (n: any) => Math.ceil(Number(n))], + ["len", (n: any) => n?.length ?? n?.__len__?.()], + ["print", (...args: any[]) => console.log(...__unwrap__(...args))], + ["log", (...args: any[]) => console.log(...__unwrap__(...args))], + // Types + ["int", (n: any) => Math.floor(Number(n))], + ["float", Number], + ["list", (...args: any[]) => new PyList(...args)], + ["tuple", (...args: any[]) => new PyTuple([...args])], +]); + +class SimpleNode { + type: string; + text: string; + children: SimpleNode[]; + private node: Node; + + constructor(node: Node) { + this.type = node.type; + this.text = node.text; + if (this.type === "ERROR") { + throw new Error(`Error found in parsing near "${this.text}"`); + } + this.children = []; + for (const child of node.children) { + this.children.push(new SimpleNode(child!)); + } + this.node = node; + } + + child(index: number): SimpleNode { + const child = this.children[index]; + if (!child) throw Error(`No child at index ${index}.`); + return child; + } + + log(tab = "", showNode = false) { + console.log(`${tab}--- SimpleNode`); + console.log(`${tab} type: ${this.type}`); + console.log(`${tab} text: ${this.text}`); + console.log(`${tab} children:`, this.children); + if (showNode) { + console.log(`${tab} node:`, this.node); + } + } +} + +class Executor { + private readonly typeToHandler = new Map([ + ["module", this.handleChildren.bind(this)], + ["expression_statement", this.handleChildren.bind(this)], + ["comment", this.handleSwallow.bind(this)], + ["return_statement", this.handleReturn.bind(this)], + + ["assignment", this.handleAssignment.bind(this)], + ["named_expression", this.handleNamedExpression.bind(this)], + + ["identifier", this.handleIdentifier.bind(this)], + ["attribute", this.handleAttribute.bind(this)], + + ["call", this.handleCall.bind(this)], + ["argument_list", this.handleArgumentsList.bind(this)], + + ["list_comprehension", this.handleListComprehension.bind(this)], + // ["for_in_clause", this.handleForInClause.bind(this)], + // ["if_clause", this.handleIfClause.bind(this)], + + ["comparison_operator", this.handleComparisonOperator.bind(this)], + ["boolean_operator", this.handleBooleanOperator.bind(this)], + ["not_operator", this.handleNotOperator.bind(this)], + ["binary_operator", this.handleBinaryOperator.bind(this)], + + // Types + ["integer", this.handleNumber.bind(this)], + ["float", this.handleNumber.bind(this)], + ["string", this.handleString.bind(this)], + ["tuple", this.handleList.bind(this)], + ["list", this.handleList.bind(this)], + ["dictionary", this.handleDictionary.bind(this)], + ["pair", this.handleDictionaryPair.bind(this)], + ]); + + private ctx: {[k: string]: any} = {}; + private readonly ctxInitial: Executor["ctx"] = {}; + private isEvaluating = false; + + constructor(ctx: Executor["ctx"] | null = null) { + this.ctxInitial = ctx || {}; + } + + async execute(code: string) { + if (this.isEvaluating) { + console.log("Already executing..."); + return; + } + this.isEvaluating = true; + const root = (await parse(code)).rootNode; + + this.ctx = !!window.structuredClone ? structuredClone(this.ctxInitial) : {...this.ctxInitial}; + + const value = await this.handleNode(new SimpleNode(root), this.ctx); + + console.log("====="); + console.log(`value`, value?.__unwrap__?.() ?? value); + console.log("context", this.ctx); + } + + /** + * The generic node handler, calls out to specific handlers based on the node type. + */ + private async handleNode(node: NodeType, ctx: Executor["ctx"], tab = ""): Promise { + const type = node.type as string; + + if (ctx.hasOwnProperty("__returned__")) return ctx["__returned__"]; + + console.log(`${tab}-----`); + console.log(`${tab}eval_node`); + console.log(`${tab}type: ${type}`); + console.log(`${tab}text: ${node.text}`); + console.log(`${tab}children: ${node.children?.length ?? 0}`); + console.log(ctx); + console.log(node); + + const handler = this.typeToHandler.get(type); + check(handler, "Unhandled type: " + type); + return handler(node, ctx, tab); + } + + private async handleSwallow(node: NodeType, ctx = this.ctx, tab = "") { + // No op + } + + private async handleReturn(node: NodeType, ctx = this.ctx, tab = "") { + const value = node.children.length > 1 ? this.handleNode(node.child(1), ctx, tab) : undefined; + // Mark that we have a return value, as we may be deeper in evaluation, like going through an + // if condition's body. + ctx["__returned__"] = value; + return value; + } + + /** + * Generic handler to loop over children of a node, and evaluate each. + */ + private async handleChildren(node: NodeType, ctx = this.ctx, tab = "") { + let lastValue = null; + for (const child of node.children) { + if (!child) continue; + lastValue = await this.handleNode(child, ctx, tab + " "); + } + return lastValue; + } + + /** + * Handles the retrieval of a variable identifier, already be set in the context. + */ + private async handleIdentifier(node: NodeType, ctx = this.ctx, tab = "") { + let value = ctx[node.text]; + if (!value) { + value = BUILT_INS.get(node.text); + } + return value; + } + + private async handleAttribute(node: NodeType, ctx = this.ctx, tab = "") { + check( + node.children.length === 3, + "Expected 3 children for attr, identifier/attr, period, and identifier.", + ); + const inst = await this.handleNode(node.child(0), ctx, tab); + check(node.child(1)?.text === ".", "Expected period separating parts of attribute."); + // const attr = await this.handleNode(node.child(2), inst, tab); + // console.log('handleAttribute', inst, attr); + const attr = node.child(2)!.text; + check(!attr.startsWith("__") && !attr.endsWith("__"), `"${attr}" is not accessible.`); + let attribute = inst[attr]; + check(attribute !== undefined, `"${attr}" not found on instance of type ${typeof inst}.`); + // If the attribute is a function, then bind it to the instance. + return typeof attribute === "function" ? attribute.bind(inst) : attribute; + } + + /** + * Handles the assignment to identifier(s). + */ + private async handleAssignment(node: NodeType, ctx: Executor["ctx"], tab = "") { + const vars = []; + let value: any = null; + for (const child of node.children) { + if (!child) continue; + if (child.type === "identifier") { + vars.push(child.text); + } else if (child.type === "=") { + continue; + } else { + value = await this.handleNode(child, ctx, tab + " "); + } + } + check(vars.length, "No vars for assignment"); + check(vars.length === 1, "Not yet handling multiple vars"); + ctx[vars[0]!] = value; + return value; + } + + /** + * Handles a named expression, like assigning a var in a list comprehension with: + * `[name for node in node_list if (name := node.name)]` + */ + private async handleNamedExpression(node: NodeType, ctx: Executor["ctx"], tab = "") { + check(node.children.length === 3, "Expected three children for named expression."); + check(node.child(0).type === "identifier", "Expected identifier first in named expression."); + const varName = node.child(0).text; + ctx[varName] = await this.handleNode(node.child(2), ctx, tab); + return ctx[varName]; + } + + /** + * Handles a function call. + */ + private async handleCall(node: NodeType, ctx: Executor["ctx"], tab = "") { + check(node.children.length === 2, "Expected 2 children for call, identifier and arguments."); + const fn = await this.handleNode(node.children[0]!, ctx, tab); + const args = await this.handleNode(node.children[1]!, ctx, tab); + console.log("handleCall", fn, args); + return fn(...args); + } + + private async handleArgumentsList(node: NodeType, ctx: Executor["ctx"], tab = "") { + return [(await this.handleList(node, ctx, tab)).__unwrap__()]; + } + + private async handleListComprehension(node: NodeType, ctx: Executor["ctx"], tab = "") { + // Create a new context that we don't want to pollute our outer one. + const finalList = new PyList(); + const newCtx = {...ctx}; + + let finalEntryNode; + const loopNodes: {forIn: NodeType; if?: NodeType}[] = []; + + for (const child of node.children) { + if (!child || ["[", "]"].includes(child.type)) continue; + if (child.type === "identifier" || child.type === "attribute") { + if (finalEntryNode) { + throw Error("Already have a list comprehension finalEntryNode."); + } + finalEntryNode = child; + } else if (child.type === "for_in_clause") { + loopNodes.push({forIn: child}); + } else if (child.type === "if_clause") { + loopNodes[loopNodes.length - 1]!["if"] = child; + } + } + if (!finalEntryNode) { + throw Error("No list comprehension finalEntryNode."); + } + // loopNodes.push(finalEntryNode); + + console.log(`${tab}handleListComprehension.loopNodes`, loopNodes); + + const handleLoop = async (loopNodes: {forIn: NodeType; if?: NodeType}[]) => { + const loopNode = loopNodes.shift()!; + console.log(`${tab}handleLoop`, loopNode); + const identifierNode = loopNode.forIn.child(1)!; + check(identifierNode.type === "identifier"); + const loopId = identifierNode.text; + const iterable = (await this.handleNode(loopNode.forIn.child(3)!, newCtx, tab)).__unwrap__(); + console.log(`${tab}handleLoop.iterable`, iterable); + + for (const item of iterable) { + const ifCtx = {...newCtx}; + // TODO: Handle tuple for dict + ifCtx[loopId] = item; + if (loopNode.if) { + const ifNode = loopNode.if; + check(ifNode.children.length === 2, "Expected 2 children for if_clause."); + check(ifNode.child(0).text === "if", "Expected first child to be 'if'."); + const good = await this.handleNode(ifNode.child(1), ifCtx, tab); + if (!good) continue; + } + Object.assign(newCtx, ifCtx); + // newCtx[loopId] = item; + if (loopNodes.length) { + await handleLoop(loopNodes); + } else { + finalList.append(await this.handleNode(finalEntryNode, newCtx, tab)); + } + } + loopNodes.unshift(loopNode); + }; + + await handleLoop(loopNodes); + + return finalList; + + /// ..whoa + } + + // private async handleForInClause(node: NodeType, ctx: Executor["ctx"], tab = "") { + // check( + // node.children.length === 4, + // "Expected 4 children for for-in (for, identifier, in, identifier).", + // ); + // const varName = node.child(1)!.text; + // const list = (await this.handleNode(node.child(3)!, ctx, tab)).__unwrap__(); + // return list; + // } + + private async handleNumber(node: NodeType, ctx = this.ctx, tab = "") { + return Number(node.text); + } + + private async handleString(node: NodeType, ctx = this.ctx, tab = "") { + check(node.children.length === 3, "Expected 3 children for str (quotes and value)."); + return String(node.child(1)!.text); + } + + private async handleList(node: NodeType, ctx = this.ctx, tab = "") { + const list = []; + for (const child of node.children) { + if (!child || ["(", "[", ",", "]", ")"].includes(child.type)) continue; + list.push(await this.handleNode(child, ctx, tab + " ")); + } + if (node.type === "tuple") { + return new PyTuple(...list); + } + return new PyList(...list); + } + + private async handleComparisonOperator(node: NodeType, ctx = this.ctx, tab = "") { + const op = node.child(1).text; + const left = await this.handleNode(node.child(0), ctx, tab); + const right = await this.handleNode(node.child(2), ctx, tab); + if (op === "==") return left === right; // Python '==' is equiv to '===' in JS. + if (op === "!=") return left !== right; + if (op === ">") return left > right; + if (op === ">=") return left >= right; + if (op === "<") return left < right; + if (op === "<=") return left <= right; + if (op === "in") return (right.__unwrap__ ? right.__unwrap__() : right).includes(left); + throw new Error(`Comparison not handled: "${op}"`); + } + private async handleBooleanOperator(node: NodeType, ctx = this.ctx, tab = "") { + const op = node.child(1).text; + const left = await this.handleNode(node.child(0), ctx, tab); + if (!left && op === "or") return left; + const right = await this.handleNode(node.child(2), ctx, tab); + if (op === "and") return left && right; + if (op === "or") return left || right; + } + + private async handleNotOperator(node: NodeType, ctx = this.ctx, tab = "") { + check(node.children.length === 2, "Expected 2 children for not operator."); + check(node.child(0).text === "not", "Expected first child to be 'not'."); + const value = await this.handleNode(node.child(1), ctx, tab); + return !value; + } + + private async handleBinaryOperator(node: NodeType, ctx = this.ctx, tab = "") { + const op = node.child(1).text; + const left = await this.handleNode(node.child(0), ctx, tab); + const right = await this.handleNode(node.child(2), ctx, tab); + if (left.constructor !== right.constructor) { + throw new Error(`Can only run ${op} operator on same type.`); + } + if (op === "+") return left.__add__ ? left.__add__(right) : left + right; + if (op === "-") return left - right; + if (op === "/") return left / right; + if (op === "//") return Math.floor(left / right); + if (op === "*") return left * right; + if (op === "%") return left % right; + if (op === "&") return left & right; + if (op === "|") return left | right; + if (op === "^") return left ^ right; + if (op === "<<") return left << right; + if (op === ">>") return left >> right; + throw new Error(`Comparison not handled: "${op}"`); + } + + private async handleDictionary(node: NodeType, ctx = this.ctx, tab = "") { + const dict = {}; + for (const child of node.children) { + if (!child || ["{", "}"].includes(child.type)) continue; + const pair = await this.handleNode(child, ctx, tab + " "); + Object.assign(dict, pair); + } + return dict; + } + + private async handleDictionaryPair(node: NodeType, ctx = this.ctx, tab = "") { + check(node.children.length === 3, "Expected 3 children for dict pair."); + let varName = await this.handleNode(node.child(0)!, ctx, tab + " "); + let varValue = await this.handleNode(node.child(2)!, ctx, tab + " "); + check(typeof varName === "string", "Expected varname to be string."); + return {[varName]: varValue}; + } +} + +/** Register the node. */ +app.registerExtension({ + name: "rgthree.PowerConductor", + registerCustomNodes() { + if (CONFIG_SERVICE.getConfigValue("unreleased.power_conductor.enabled")) { + NODE_CLASS.setUp(); + } + }, +}); diff --git a/src_web/lib/tree-sitter-python.wasm b/src_web/lib/tree-sitter-python.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ebd96b5db34ec49ca6993c854f0fa70a2eb664c2 GIT binary patch literal 457796 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�YAVxkI-gdG`t3tGeow6Q{jI20y;d3yIupKH^H0G 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 z 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 H$#AppaTL __defProp(target, "name", { value, configurable: true }); + +// src/constants.ts +var SIZE_OF_SHORT = 2; +var SIZE_OF_INT = 4; +var SIZE_OF_CURSOR = 4 * SIZE_OF_INT; +var SIZE_OF_NODE = 5 * SIZE_OF_INT; +var SIZE_OF_POINT = 2 * SIZE_OF_INT; +var SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT; +var ZERO_POINT = { row: 0, column: 0 }; +var INTERNAL = Symbol("INTERNAL"); +function assertInternal(x) { + if (x !== INTERNAL) throw new Error("Illegal constructor"); +} +__name(assertInternal, "assertInternal"); +function isPoint(point) { + return !!point && typeof point.row === "number" && typeof point.column === "number"; +} +__name(isPoint, "isPoint"); +function setModule(module2) { + C = module2; +} +__name(setModule, "setModule"); +var C; + +// src/lookahead_iterator.ts +var LookaheadIterator = class { + static { + __name(this, "LookaheadIterator"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + language; + /** @internal */ + constructor(internal, address, language) { + assertInternal(internal); + this[0] = address; + this.language = language; + } + /** Get the current symbol of the lookahead iterator. */ + get currentTypeId() { + return C._ts_lookahead_iterator_current_symbol(this[0]); + } + /** Get the current symbol name of the lookahead iterator. */ + get currentType() { + return this.language.types[this.currentTypeId] || "ERROR"; + } + /** Delete the lookahead iterator, freeing its resources. */ + delete() { + C._ts_lookahead_iterator_delete(this[0]); + this[0] = 0; + } + /** + * Reset the lookahead iterator. + * + * This returns `true` if the language was set successfully and `false` + * otherwise. + */ + reset(language, stateId) { + if (C._ts_lookahead_iterator_reset(this[0], language[0], stateId)) { + this.language = language; + return true; + } + return false; + } + /** + * Reset the lookahead iterator to another state. + * + * This returns `true` if the iterator was reset to the given state and + * `false` otherwise. + */ + resetState(stateId) { + return Boolean(C._ts_lookahead_iterator_reset_state(this[0], stateId)); + } + /** + * Returns an iterator that iterates over the symbols of the lookahead iterator. + * + * The iterator will yield the current symbol name as a string for each step + * until there are no more symbols to iterate over. + */ + [Symbol.iterator]() { + return { + next: /* @__PURE__ */ __name(() => { + if (C._ts_lookahead_iterator_next(this[0])) { + return { done: false, value: this.currentType }; + } + return { done: true, value: "" }; + }, "next") + }; + } +}; + +// src/tree.ts +function getText(tree, startIndex, endIndex, startPosition) { + const length = endIndex - startIndex; + let result = tree.textCallback(startIndex, startPosition); + if (result) { + startIndex += result.length; + while (startIndex < endIndex) { + const string = tree.textCallback(startIndex, startPosition); + if (string && string.length > 0) { + startIndex += string.length; + result += string; + } else { + break; + } + } + if (startIndex > endIndex) { + result = result.slice(0, length); + } + } + return result ?? ""; +} +__name(getText, "getText"); +var Tree = class _Tree { + static { + __name(this, "Tree"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + textCallback; + /** The language that was used to parse the syntax tree. */ + language; + /** @internal */ + constructor(internal, address, language, textCallback) { + assertInternal(internal); + this[0] = address; + this.language = language; + this.textCallback = textCallback; + } + /** Create a shallow copy of the syntax tree. This is very fast. */ + copy() { + const address = C._ts_tree_copy(this[0]); + return new _Tree(INTERNAL, address, this.language, this.textCallback); + } + /** Delete the syntax tree, freeing its resources. */ + delete() { + C._ts_tree_delete(this[0]); + this[0] = 0; + } + /** Get the root node of the syntax tree. */ + get rootNode() { + C._ts_tree_root_node_wasm(this[0]); + return unmarshalNode(this); + } + /** + * Get the root node of the syntax tree, but with its position shifted + * forward by the given offset. + */ + rootNodeWithOffset(offsetBytes, offsetExtent) { + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, offsetBytes, "i32"); + marshalPoint(address + SIZE_OF_INT, offsetExtent); + C._ts_tree_root_node_with_offset_wasm(this[0]); + return unmarshalNode(this); + } + /** + * Edit the syntax tree to keep it in sync with source code that has been + * edited. + * + * You must describe the edit both in terms of byte offsets and in terms of + * row/column coordinates. + */ + edit(edit) { + marshalEdit(edit); + C._ts_tree_edit_wasm(this[0]); + } + /** Create a new {@link TreeCursor} starting from the root of the tree. */ + walk() { + return this.rootNode.walk(); + } + /** + * Compare this old edited syntax tree to a new syntax tree representing + * the same document, returning a sequence of ranges whose syntactic + * structure has changed. + * + * For this to work correctly, this syntax tree must have been edited such + * that its ranges match up to the new tree. Generally, you'll want to + * call this method right after calling one of the [`Parser::parse`] + * functions. Call it on the old tree that was passed to parse, and + * pass the new tree that was returned from `parse`. + */ + getChangedRanges(other) { + if (!(other instanceof _Tree)) { + throw new TypeError("Argument must be a Tree"); + } + C._ts_tree_get_changed_ranges_wasm(this[0], other[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } + /** Get the included ranges that were used to parse the syntax tree. */ + getIncludedRanges() { + C._ts_tree_included_ranges_wasm(this[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } +}; + +// src/tree_cursor.ts +var TreeCursor = class _TreeCursor { + static { + __name(this, "TreeCursor"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + [1] = 0; + // Internal handle for WASM + /** @internal */ + [2] = 0; + // Internal handle for WASM + /** @internal */ + [3] = 0; + // Internal handle for WASM + /** @internal */ + tree; + /** @internal */ + constructor(internal, tree) { + assertInternal(internal); + this.tree = tree; + unmarshalTreeCursor(this); + } + /** Creates a deep copy of the tree cursor. This allocates new memory. */ + copy() { + const copy = new _TreeCursor(INTERNAL, this.tree); + C._ts_tree_cursor_copy_wasm(this.tree[0]); + unmarshalTreeCursor(copy); + return copy; + } + /** Delete the tree cursor, freeing its resources. */ + delete() { + marshalTreeCursor(this); + C._ts_tree_cursor_delete_wasm(this.tree[0]); + this[0] = this[1] = this[2] = 0; + } + /** Get the tree cursor's current {@link Node}. */ + get currentNode() { + marshalTreeCursor(this); + C._ts_tree_cursor_current_node_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get the numerical field id of this tree cursor's current node. + * + * See also {@link TreeCursor#currentFieldName}. + */ + get currentFieldId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_field_id_wasm(this.tree[0]); + } + /** Get the field name of this tree cursor's current node. */ + get currentFieldName() { + return this.tree.language.fields[this.currentFieldId]; + } + /** + * Get the depth of the cursor's current node relative to the original + * node that the cursor was constructed with. + */ + get currentDepth() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_depth_wasm(this.tree[0]); + } + /** + * Get the index of the cursor's current node out of all of the + * descendants of the original node that the cursor was constructed with. + */ + get currentDescendantIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]); + } + /** Get the type of the cursor's current node. */ + get nodeType() { + return this.tree.language.types[this.nodeTypeId] || "ERROR"; + } + /** Get the type id of the cursor's current node. */ + get nodeTypeId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]); + } + /** Get the state id of the cursor's current node. */ + get nodeStateId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]); + } + /** Get the id of the cursor's current node. */ + get nodeId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_id_wasm(this.tree[0]); + } + /** + * Check if the cursor's current node is *named*. + * + * Named nodes correspond to named rules in the grammar, whereas + * *anonymous* nodes correspond to string literals in the grammar. + */ + get nodeIsNamed() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]) === 1; + } + /** + * Check if the cursor's current node is *missing*. + * + * Missing nodes are inserted by the parser in order to recover from + * certain kinds of syntax errors. + */ + get nodeIsMissing() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]) === 1; + } + /** Get the string content of the cursor's current node. */ + get nodeText() { + marshalTreeCursor(this); + const startIndex = C._ts_tree_cursor_start_index_wasm(this.tree[0]); + const endIndex = C._ts_tree_cursor_end_index_wasm(this.tree[0]); + C._ts_tree_cursor_start_position_wasm(this.tree[0]); + const startPosition = unmarshalPoint(TRANSFER_BUFFER); + return getText(this.tree, startIndex, endIndex, startPosition); + } + /** Get the start position of the cursor's current node. */ + get startPosition() { + marshalTreeCursor(this); + C._ts_tree_cursor_start_position_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + /** Get the end position of the cursor's current node. */ + get endPosition() { + marshalTreeCursor(this); + C._ts_tree_cursor_end_position_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + /** Get the start index of the cursor's current node. */ + get startIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_start_index_wasm(this.tree[0]); + } + /** Get the end index of the cursor's current node. */ + get endIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_end_index_wasm(this.tree[0]); + } + /** + * Move this cursor to the first child of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there were no children. + */ + gotoFirstChild() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the last child of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there were no children. + * + * Note that this function may be slower than + * {@link TreeCursor#gotoFirstChild} because it needs to + * iterate through all the children to compute the child's position. + */ + gotoLastChild() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the parent of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there was no parent node (the cursor was already on the + * root node). + * + * Note that the node the cursor was constructed with is considered the root + * of the cursor, and the cursor cannot walk outside this node. + */ + gotoParent() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the next sibling of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there was no next sibling node. + * + * Note that the node the cursor was constructed with is considered the root + * of the cursor, and the cursor cannot walk outside this node. + */ + gotoNextSibling() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the previous sibling of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there was no previous sibling node. + * + * Note that this function may be slower than + * {@link TreeCursor#gotoNextSibling} due to how node + * positions are stored. In the worst case, this will need to iterate + * through all the children up to the previous sibling node to recalculate + * its position. Also note that the node the cursor was constructed with is + * considered the root of the cursor, and the cursor cannot walk outside this node. + */ + gotoPreviousSibling() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move the cursor to the node that is the nth descendant of + * the original node that the cursor was constructed with, where + * zero represents the original node itself. + */ + gotoDescendant(goalDescendantIndex) { + marshalTreeCursor(this); + C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], goalDescendantIndex); + unmarshalTreeCursor(this); + } + /** + * Move this cursor to the first child of its current node that contains or + * starts after the given byte offset. + * + * This returns `true` if the cursor successfully moved to a child node, and returns + * `false` if no such child was found. + */ + gotoFirstChildForIndex(goalIndex) { + marshalTreeCursor(this); + C.setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalIndex, "i32"); + const result = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the first child of its current node that contains or + * starts after the given byte offset. + * + * This returns the index of the child node if one was found, and returns + * `null` if no such child was found. + */ + gotoFirstChildForPosition(goalPosition) { + marshalTreeCursor(this); + marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalPosition); + const result = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Re-initialize this tree cursor to start at the original node that the + * cursor was constructed with. + */ + reset(node) { + marshalNode(node); + marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE); + C._ts_tree_cursor_reset_wasm(this.tree[0]); + unmarshalTreeCursor(this); + } + /** + * Re-initialize a tree cursor to the same position as another cursor. + * + * Unlike {@link TreeCursor#reset}, this will not lose parent + * information and allows reusing already created cursors. + */ + resetTo(cursor) { + marshalTreeCursor(this, TRANSFER_BUFFER); + marshalTreeCursor(cursor, TRANSFER_BUFFER + SIZE_OF_CURSOR); + C._ts_tree_cursor_reset_to_wasm(this.tree[0], cursor.tree[0]); + unmarshalTreeCursor(this); + } +}; + +// src/node.ts +var Node = class { + static { + __name(this, "Node"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + _children; + /** @internal */ + _namedChildren; + /** @internal */ + constructor(internal, { + id, + tree, + startIndex, + startPosition, + other + }) { + assertInternal(internal); + this[0] = other; + this.id = id; + this.tree = tree; + this.startIndex = startIndex; + this.startPosition = startPosition; + } + /** + * The numeric id for this node that is unique. + * + * Within a given syntax tree, no two nodes have the same id. However: + * + * * If a new tree is created based on an older tree, and a node from the old tree is reused in + * the process, then that node will have the same id in both trees. + * + * * A node not marked as having changes does not guarantee it was reused. + * + * * If a node is marked as having changed in the old tree, it will not be reused. + */ + id; + /** The byte index where this node starts. */ + startIndex; + /** The position where this node starts. */ + startPosition; + /** The tree that this node belongs to. */ + tree; + /** Get this node's type as a numerical id. */ + get typeId() { + marshalNode(this); + return C._ts_node_symbol_wasm(this.tree[0]); + } + /** + * Get the node's type as a numerical id as it appears in the grammar, + * ignoring aliases. + */ + get grammarId() { + marshalNode(this); + return C._ts_node_grammar_symbol_wasm(this.tree[0]); + } + /** Get this node's type as a string. */ + get type() { + return this.tree.language.types[this.typeId] || "ERROR"; + } + /** + * Get this node's symbol name as it appears in the grammar, ignoring + * aliases as a string. + */ + get grammarType() { + return this.tree.language.types[this.grammarId] || "ERROR"; + } + /** + * Check if this node is *named*. + * + * Named nodes correspond to named rules in the grammar, whereas + * *anonymous* nodes correspond to string literals in the grammar. + */ + get isNamed() { + marshalNode(this); + return C._ts_node_is_named_wasm(this.tree[0]) === 1; + } + /** + * Check if this node is *extra*. + * + * Extra nodes represent things like comments, which are not required + * by the grammar, but can appear anywhere. + */ + get isExtra() { + marshalNode(this); + return C._ts_node_is_extra_wasm(this.tree[0]) === 1; + } + /** + * Check if this node represents a syntax error. + * + * Syntax errors represent parts of the code that could not be incorporated + * into a valid syntax tree. + */ + get isError() { + marshalNode(this); + return C._ts_node_is_error_wasm(this.tree[0]) === 1; + } + /** + * Check if this node is *missing*. + * + * Missing nodes are inserted by the parser in order to recover from + * certain kinds of syntax errors. + */ + get isMissing() { + marshalNode(this); + return C._ts_node_is_missing_wasm(this.tree[0]) === 1; + } + /** Check if this node has been edited. */ + get hasChanges() { + marshalNode(this); + return C._ts_node_has_changes_wasm(this.tree[0]) === 1; + } + /** + * Check if this node represents a syntax error or contains any syntax + * errors anywhere within it. + */ + get hasError() { + marshalNode(this); + return C._ts_node_has_error_wasm(this.tree[0]) === 1; + } + /** Get the byte index where this node ends. */ + get endIndex() { + marshalNode(this); + return C._ts_node_end_index_wasm(this.tree[0]); + } + /** Get the position where this node ends. */ + get endPosition() { + marshalNode(this); + C._ts_node_end_point_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + /** Get the string content of this node. */ + get text() { + return getText(this.tree, this.startIndex, this.endIndex, this.startPosition); + } + /** Get this node's parse state. */ + get parseState() { + marshalNode(this); + return C._ts_node_parse_state_wasm(this.tree[0]); + } + /** Get the parse state after this node. */ + get nextParseState() { + marshalNode(this); + return C._ts_node_next_parse_state_wasm(this.tree[0]); + } + /** Check if this node is equal to another node. */ + equals(other) { + return this.tree === other.tree && this.id === other.id; + } + /** + * Get the node's child at the given index, where zero represents the first child. + * + * This method is fairly fast, but its cost is technically log(n), so if + * you might be iterating over a long list of children, you should use + * {@link Node#children} instead. + */ + child(index) { + marshalNode(this); + C._ts_node_child_wasm(this.tree[0], index); + return unmarshalNode(this.tree); + } + /** + * Get this node's *named* child at the given index. + * + * See also {@link Node#isNamed}. + * This method is fairly fast, but its cost is technically log(n), so if + * you might be iterating over a long list of children, you should use + * {@link Node#namedChildren} instead. + */ + namedChild(index) { + marshalNode(this); + C._ts_node_named_child_wasm(this.tree[0], index); + return unmarshalNode(this.tree); + } + /** + * Get this node's child with the given numerical field id. + * + * See also {@link Node#childForFieldName}. You can + * convert a field name to an id using {@link Language#fieldIdForName}. + */ + childForFieldId(fieldId) { + marshalNode(this); + C._ts_node_child_by_field_id_wasm(this.tree[0], fieldId); + return unmarshalNode(this.tree); + } + /** + * Get the first child with the given field name. + * + * If multiple children may have the same field name, access them using + * {@link Node#childrenForFieldName}. + */ + childForFieldName(fieldName) { + const fieldId = this.tree.language.fields.indexOf(fieldName); + if (fieldId !== -1) return this.childForFieldId(fieldId); + return null; + } + /** Get the field name of this node's child at the given index. */ + fieldNameForChild(index) { + marshalNode(this); + const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index); + if (!address) return null; + return C.AsciiToString(address); + } + /** Get the field name of this node's named child at the given index. */ + fieldNameForNamedChild(index) { + marshalNode(this); + const address = C._ts_node_field_name_for_named_child_wasm(this.tree[0], index); + if (!address) return null; + return C.AsciiToString(address); + } + /** + * Get an array of this node's children with a given field name. + * + * See also {@link Node#children}. + */ + childrenForFieldName(fieldName) { + const fieldId = this.tree.language.fields.indexOf(fieldName); + if (fieldId !== -1 && fieldId !== 0) return this.childrenForFieldId(fieldId); + return []; + } + /** + * Get an array of this node's children with a given field id. + * + * See also {@link Node#childrenForFieldName}. + */ + childrenForFieldId(fieldId) { + marshalNode(this); + C._ts_node_children_by_field_id_wasm(this.tree[0], fieldId); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + return result; + } + /** Get the node's first child that contains or starts after the given byte offset. */ + firstChildForIndex(index) { + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, index, "i32"); + C._ts_node_first_child_for_byte_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the node's first named child that contains or starts after the given byte offset. */ + firstNamedChildForIndex(index) { + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, index, "i32"); + C._ts_node_first_named_child_for_byte_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get this node's number of children. */ + get childCount() { + marshalNode(this); + return C._ts_node_child_count_wasm(this.tree[0]); + } + /** + * Get this node's number of *named* children. + * + * See also {@link Node#isNamed}. + */ + get namedChildCount() { + marshalNode(this); + return C._ts_node_named_child_count_wasm(this.tree[0]); + } + /** Get this node's first child. */ + get firstChild() { + return this.child(0); + } + /** + * Get this node's first named child. + * + * See also {@link Node#isNamed}. + */ + get firstNamedChild() { + return this.namedChild(0); + } + /** Get this node's last child. */ + get lastChild() { + return this.child(this.childCount - 1); + } + /** + * Get this node's last named child. + * + * See also {@link Node#isNamed}. + */ + get lastNamedChild() { + return this.namedChild(this.namedChildCount - 1); + } + /** + * Iterate over this node's children. + * + * If you're walking the tree recursively, you may want to use the + * {@link TreeCursor} APIs directly instead. + */ + get children() { + if (!this._children) { + marshalNode(this); + C._ts_node_children_wasm(this.tree[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + this._children = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + this._children[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + } + return this._children; + } + /** + * Iterate over this node's named children. + * + * See also {@link Node#children}. + */ + get namedChildren() { + if (!this._namedChildren) { + marshalNode(this); + C._ts_node_named_children_wasm(this.tree[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + this._namedChildren = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + this._namedChildren[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + } + return this._namedChildren; + } + /** + * Get the descendants of this node that are the given type, or in the given types array. + * + * The types array should contain node type strings, which can be retrieved from {@link Language#types}. + * + * Additionally, a `startPosition` and `endPosition` can be passed in to restrict the search to a byte range. + */ + descendantsOfType(types, startPosition = ZERO_POINT, endPosition = ZERO_POINT) { + if (!Array.isArray(types)) types = [types]; + const symbols = []; + const typesBySymbol = this.tree.language.types; + for (const node_type of types) { + if (node_type == "ERROR") { + symbols.push(65535); + } + } + for (let i2 = 0, n = typesBySymbol.length; i2 < n; i2++) { + if (types.includes(typesBySymbol[i2])) { + symbols.push(i2); + } + } + const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length); + for (let i2 = 0, n = symbols.length; i2 < n; i2++) { + C.setValue(symbolsAddress + i2 * SIZE_OF_INT, symbols[i2], "i32"); + } + marshalNode(this); + C._ts_node_descendants_of_type_wasm( + this.tree[0], + symbolsAddress, + symbols.length, + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column + ); + const descendantCount = C.getValue(TRANSFER_BUFFER, "i32"); + const descendantAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(descendantCount); + if (descendantCount > 0) { + let address = descendantAddress; + for (let i2 = 0; i2 < descendantCount; i2++) { + result[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + } + C._free(descendantAddress); + C._free(symbolsAddress); + return result; + } + /** Get this node's next sibling. */ + get nextSibling() { + marshalNode(this); + C._ts_node_next_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get this node's previous sibling. */ + get previousSibling() { + marshalNode(this); + C._ts_node_prev_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get this node's next *named* sibling. + * + * See also {@link Node#isNamed}. + */ + get nextNamedSibling() { + marshalNode(this); + C._ts_node_next_named_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get this node's previous *named* sibling. + * + * See also {@link Node#isNamed}. + */ + get previousNamedSibling() { + marshalNode(this); + C._ts_node_prev_named_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the node's number of descendants, including one for the node itself. */ + get descendantCount() { + marshalNode(this); + return C._ts_node_descendant_count_wasm(this.tree[0]); + } + /** + * Get this node's immediate parent. + * Prefer {@link Node#childWithDescendant} for iterating over this node's ancestors. + */ + get parent() { + marshalNode(this); + C._ts_node_parent_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get the node that contains `descendant`. + * + * Note that this can return `descendant` itself. + */ + childWithDescendant(descendant) { + marshalNode(this); + marshalNode(descendant, 1); + C._ts_node_child_with_descendant_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest node within this node that spans the given byte range. */ + descendantForIndex(start2, end = start2) { + if (typeof start2 !== "number" || typeof end !== "number") { + throw new Error("Arguments must be numbers"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, start2, "i32"); + C.setValue(address + SIZE_OF_INT, end, "i32"); + C._ts_node_descendant_for_index_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest named node within this node that spans the given byte range. */ + namedDescendantForIndex(start2, end = start2) { + if (typeof start2 !== "number" || typeof end !== "number") { + throw new Error("Arguments must be numbers"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, start2, "i32"); + C.setValue(address + SIZE_OF_INT, end, "i32"); + C._ts_node_named_descendant_for_index_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest node within this node that spans the given point range. */ + descendantForPosition(start2, end = start2) { + if (!isPoint(start2) || !isPoint(end)) { + throw new Error("Arguments must be {row, column} objects"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + marshalPoint(address, start2); + marshalPoint(address + SIZE_OF_POINT, end); + C._ts_node_descendant_for_position_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest named node within this node that spans the given point range. */ + namedDescendantForPosition(start2, end = start2) { + if (!isPoint(start2) || !isPoint(end)) { + throw new Error("Arguments must be {row, column} objects"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + marshalPoint(address, start2); + marshalPoint(address + SIZE_OF_POINT, end); + C._ts_node_named_descendant_for_position_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Create a new {@link TreeCursor} starting from this node. + * + * Note that the given node is considered the root of the cursor, + * and the cursor cannot walk outside this node. + */ + walk() { + marshalNode(this); + C._ts_tree_cursor_new_wasm(this.tree[0]); + return new TreeCursor(INTERNAL, this.tree); + } + /** + * Edit this node to keep it in-sync with source code that has been edited. + * + * This function is only rarely needed. When you edit a syntax tree with + * the {@link Tree#edit} method, all of the nodes that you retrieve from + * the tree afterward will already reflect the edit. You only need to + * use {@link Node#edit} when you have a specific {@link Node} instance that + * you want to keep and continue to use after an edit. + */ + edit(edit) { + if (this.startIndex >= edit.oldEndIndex) { + this.startIndex = edit.newEndIndex + (this.startIndex - edit.oldEndIndex); + let subbedPointRow; + let subbedPointColumn; + if (this.startPosition.row > edit.oldEndPosition.row) { + subbedPointRow = this.startPosition.row - edit.oldEndPosition.row; + subbedPointColumn = this.startPosition.column; + } else { + subbedPointRow = 0; + subbedPointColumn = this.startPosition.column; + if (this.startPosition.column >= edit.oldEndPosition.column) { + subbedPointColumn = this.startPosition.column - edit.oldEndPosition.column; + } + } + if (subbedPointRow > 0) { + this.startPosition.row += subbedPointRow; + this.startPosition.column = subbedPointColumn; + } else { + this.startPosition.column += subbedPointColumn; + } + } else if (this.startIndex > edit.startIndex) { + this.startIndex = edit.newEndIndex; + this.startPosition.row = edit.newEndPosition.row; + this.startPosition.column = edit.newEndPosition.column; + } + } + /** Get the S-expression representation of this node. */ + toString() { + marshalNode(this); + const address = C._ts_node_to_string_wasm(this.tree[0]); + const result = C.AsciiToString(address); + C._free(address); + return result; + } +}; + +// src/marshal.ts +function unmarshalCaptures(query, tree, address, patternIndex, result) { + for (let i2 = 0, n = result.length; i2 < n; i2++) { + const captureIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const node = unmarshalNode(tree, address); + address += SIZE_OF_NODE; + result[i2] = { patternIndex, name: query.captureNames[captureIndex], node }; + } + return address; +} +__name(unmarshalCaptures, "unmarshalCaptures"); +function marshalNode(node, index = 0) { + let address = TRANSFER_BUFFER + index * SIZE_OF_NODE; + C.setValue(address, node.id, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node.startIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node.startPosition.row, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node.startPosition.column, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node[0], "i32"); +} +__name(marshalNode, "marshalNode"); +function unmarshalNode(tree, address = TRANSFER_BUFFER) { + const id = C.getValue(address, "i32"); + address += SIZE_OF_INT; + if (id === 0) return null; + const index = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const row = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const column = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const other = C.getValue(address, "i32"); + const result = new Node(INTERNAL, { + id, + tree, + startIndex: index, + startPosition: { row, column }, + other + }); + return result; +} +__name(unmarshalNode, "unmarshalNode"); +function marshalTreeCursor(cursor, address = TRANSFER_BUFFER) { + C.setValue(address + 0 * SIZE_OF_INT, cursor[0], "i32"); + C.setValue(address + 1 * SIZE_OF_INT, cursor[1], "i32"); + C.setValue(address + 2 * SIZE_OF_INT, cursor[2], "i32"); + C.setValue(address + 3 * SIZE_OF_INT, cursor[3], "i32"); +} +__name(marshalTreeCursor, "marshalTreeCursor"); +function unmarshalTreeCursor(cursor) { + cursor[0] = C.getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, "i32"); + cursor[1] = C.getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, "i32"); + cursor[2] = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"); + cursor[3] = C.getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, "i32"); +} +__name(unmarshalTreeCursor, "unmarshalTreeCursor"); +function marshalPoint(address, point) { + C.setValue(address, point.row, "i32"); + C.setValue(address + SIZE_OF_INT, point.column, "i32"); +} +__name(marshalPoint, "marshalPoint"); +function unmarshalPoint(address) { + const result = { + row: C.getValue(address, "i32") >>> 0, + column: C.getValue(address + SIZE_OF_INT, "i32") >>> 0 + }; + return result; +} +__name(unmarshalPoint, "unmarshalPoint"); +function marshalRange(address, range) { + marshalPoint(address, range.startPosition); + address += SIZE_OF_POINT; + marshalPoint(address, range.endPosition); + address += SIZE_OF_POINT; + C.setValue(address, range.startIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, range.endIndex, "i32"); + address += SIZE_OF_INT; +} +__name(marshalRange, "marshalRange"); +function unmarshalRange(address) { + const result = {}; + result.startPosition = unmarshalPoint(address); + address += SIZE_OF_POINT; + result.endPosition = unmarshalPoint(address); + address += SIZE_OF_POINT; + result.startIndex = C.getValue(address, "i32") >>> 0; + address += SIZE_OF_INT; + result.endIndex = C.getValue(address, "i32") >>> 0; + return result; +} +__name(unmarshalRange, "unmarshalRange"); +function marshalEdit(edit, address = TRANSFER_BUFFER) { + marshalPoint(address, edit.startPosition); + address += SIZE_OF_POINT; + marshalPoint(address, edit.oldEndPosition); + address += SIZE_OF_POINT; + marshalPoint(address, edit.newEndPosition); + address += SIZE_OF_POINT; + C.setValue(address, edit.startIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, edit.oldEndIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, edit.newEndIndex, "i32"); + address += SIZE_OF_INT; +} +__name(marshalEdit, "marshalEdit"); +function unmarshalLanguageMetadata(address) { + const result = {}; + result.major_version = C.getValue(address, "i32"); + address += SIZE_OF_INT; + result.minor_version = C.getValue(address, "i32"); + address += SIZE_OF_INT; + result.field_count = C.getValue(address, "i32"); + return result; +} +__name(unmarshalLanguageMetadata, "unmarshalLanguageMetadata"); + +// src/query.ts +var PREDICATE_STEP_TYPE_CAPTURE = 1; +var PREDICATE_STEP_TYPE_STRING = 2; +var QUERY_WORD_REGEX = /[\w-]+/g; +var CaptureQuantifier = { + Zero: 0, + ZeroOrOne: 1, + ZeroOrMore: 2, + One: 3, + OneOrMore: 4 +}; +var isCaptureStep = /* @__PURE__ */ __name((step) => step.type === "capture", "isCaptureStep"); +var isStringStep = /* @__PURE__ */ __name((step) => step.type === "string", "isStringStep"); +var QueryErrorKind = { + Syntax: 1, + NodeName: 2, + FieldName: 3, + CaptureName: 4, + PatternStructure: 5 +}; +var QueryError = class _QueryError extends Error { + constructor(kind, info2, index, length) { + super(_QueryError.formatMessage(kind, info2)); + this.kind = kind; + this.info = info2; + this.index = index; + this.length = length; + this.name = "QueryError"; + } + static { + __name(this, "QueryError"); + } + /** Formats an error message based on the error kind and info */ + static formatMessage(kind, info2) { + switch (kind) { + case QueryErrorKind.NodeName: + return `Bad node name '${info2.word}'`; + case QueryErrorKind.FieldName: + return `Bad field name '${info2.word}'`; + case QueryErrorKind.CaptureName: + return `Bad capture name @${info2.word}`; + case QueryErrorKind.PatternStructure: + return `Bad pattern structure at offset ${info2.suffix}`; + case QueryErrorKind.Syntax: + return `Bad syntax at offset ${info2.suffix}`; + } + } +}; +function parseAnyPredicate(steps, index, operator, textPredicates) { + if (steps.length !== 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}` + ); + } + if (!isCaptureStep(steps[1])) { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}"` + ); + } + const isPositive = operator === "eq?" || operator === "any-eq?"; + const matchAll = !operator.startsWith("any-"); + if (isCaptureStep(steps[2])) { + const captureName1 = steps[1].name; + const captureName2 = steps[2].name; + textPredicates[index].push((captures) => { + const nodes1 = []; + const nodes2 = []; + for (const c of captures) { + if (c.name === captureName1) nodes1.push(c.node); + if (c.name === captureName2) nodes2.push(c.node); + } + const compare = /* @__PURE__ */ __name((n1, n2, positive) => { + return positive ? n1.text === n2.text : n1.text !== n2.text; + }, "compare"); + return matchAll ? nodes1.every((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))) : nodes1.some((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))); + }); + } else { + const captureName = steps[1].name; + const stringValue = steps[2].value; + const matches = /* @__PURE__ */ __name((n) => n.text === stringValue, "matches"); + const doesNotMatch = /* @__PURE__ */ __name((n) => n.text !== stringValue, "doesNotMatch"); + textPredicates[index].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node); + } + const test = isPositive ? matches : doesNotMatch; + return matchAll ? nodes.every(test) : nodes.some(test); + }); + } +} +__name(parseAnyPredicate, "parseAnyPredicate"); +function parseMatchPredicate(steps, index, operator, textPredicates) { + if (steps.length !== 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}.` + ); + } + if (steps[1].type !== "capture") { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".` + ); + } + if (steps[2].type !== "string") { + throw new Error( + `Second argument of \`#${operator}\` predicate must be a string. Got @${steps[2].name}.` + ); + } + const isPositive = operator === "match?" || operator === "any-match?"; + const matchAll = !operator.startsWith("any-"); + const captureName = steps[1].name; + const regex = new RegExp(steps[2].value); + textPredicates[index].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node.text); + } + const test = /* @__PURE__ */ __name((text, positive) => { + return positive ? regex.test(text) : !regex.test(text); + }, "test"); + if (nodes.length === 0) return !isPositive; + return matchAll ? nodes.every((text) => test(text, isPositive)) : nodes.some((text) => test(text, isPositive)); + }); +} +__name(parseMatchPredicate, "parseMatchPredicate"); +function parseAnyOfPredicate(steps, index, operator, textPredicates) { + if (steps.length < 2) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected at least 1. Got ${steps.length - 1}.` + ); + } + if (steps[1].type !== "capture") { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".` + ); + } + const isPositive = operator === "any-of?"; + const captureName = steps[1].name; + const stringSteps = steps.slice(2); + if (!stringSteps.every(isStringStep)) { + throw new Error( + `Arguments to \`#${operator}\` predicate must be strings.".` + ); + } + const values = stringSteps.map((s) => s.value); + textPredicates[index].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node.text); + } + if (nodes.length === 0) return !isPositive; + return nodes.every((text) => values.includes(text)) === isPositive; + }); +} +__name(parseAnyOfPredicate, "parseAnyOfPredicate"); +function parseIsPredicate(steps, index, operator, assertedProperties, refutedProperties) { + if (steps.length < 2 || steps.length > 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 1 or 2. Got ${steps.length - 1}.` + ); + } + if (!steps.every(isStringStep)) { + throw new Error( + `Arguments to \`#${operator}\` predicate must be strings.".` + ); + } + const properties = operator === "is?" ? assertedProperties : refutedProperties; + if (!properties[index]) properties[index] = {}; + properties[index][steps[1].value] = steps[2]?.value ?? null; +} +__name(parseIsPredicate, "parseIsPredicate"); +function parseSetDirective(steps, index, setProperties) { + if (steps.length < 2 || steps.length > 3) { + throw new Error(`Wrong number of arguments to \`#set!\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`); + } + if (!steps.every(isStringStep)) { + throw new Error(`Arguments to \`#set!\` predicate must be strings.".`); + } + if (!setProperties[index]) setProperties[index] = {}; + setProperties[index][steps[1].value] = steps[2]?.value ?? null; +} +__name(parseSetDirective, "parseSetDirective"); +function parsePattern(index, stepType, stepValueId, captureNames, stringValues, steps, textPredicates, predicates, setProperties, assertedProperties, refutedProperties) { + if (stepType === PREDICATE_STEP_TYPE_CAPTURE) { + const name2 = captureNames[stepValueId]; + steps.push({ type: "capture", name: name2 }); + } else if (stepType === PREDICATE_STEP_TYPE_STRING) { + steps.push({ type: "string", value: stringValues[stepValueId] }); + } else if (steps.length > 0) { + if (steps[0].type !== "string") { + throw new Error("Predicates must begin with a literal value"); + } + const operator = steps[0].value; + switch (operator) { + case "any-not-eq?": + case "not-eq?": + case "any-eq?": + case "eq?": + parseAnyPredicate(steps, index, operator, textPredicates); + break; + case "any-not-match?": + case "not-match?": + case "any-match?": + case "match?": + parseMatchPredicate(steps, index, operator, textPredicates); + break; + case "not-any-of?": + case "any-of?": + parseAnyOfPredicate(steps, index, operator, textPredicates); + break; + case "is?": + case "is-not?": + parseIsPredicate(steps, index, operator, assertedProperties, refutedProperties); + break; + case "set!": + parseSetDirective(steps, index, setProperties); + break; + default: + predicates[index].push({ operator, operands: steps.slice(1) }); + } + steps.length = 0; + } +} +__name(parsePattern, "parsePattern"); +var Query = class { + static { + __name(this, "Query"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + exceededMatchLimit; + /** @internal */ + textPredicates; + /** The names of the captures used in the query. */ + captureNames; + /** The quantifiers of the captures used in the query. */ + captureQuantifiers; + /** + * The other user-defined predicates associated with the given index. + * + * This includes predicates with operators other than: + * - `match?` + * - `eq?` and `not-eq?` + * - `any-of?` and `not-any-of?` + * - `is?` and `is-not?` + * - `set!` + */ + predicates; + /** The properties for predicates with the operator `set!`. */ + setProperties; + /** The properties for predicates with the operator `is?`. */ + assertedProperties; + /** The properties for predicates with the operator `is-not?`. */ + refutedProperties; + /** The maximum number of in-progress matches for this cursor. */ + matchLimit; + /** + * Create a new query from a string containing one or more S-expression + * patterns. + * + * The query is associated with a particular language, and can only be run + * on syntax nodes parsed with that language. References to Queries can be + * shared between multiple threads. + * + * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries} + */ + constructor(language, source) { + const sourceLength = C.lengthBytesUTF8(source); + const sourceAddress = C._malloc(sourceLength + 1); + C.stringToUTF8(source, sourceAddress, sourceLength + 1); + const address = C._ts_query_new( + language[0], + sourceAddress, + sourceLength, + TRANSFER_BUFFER, + TRANSFER_BUFFER + SIZE_OF_INT + ); + if (!address) { + const errorId = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const errorByte = C.getValue(TRANSFER_BUFFER, "i32"); + const errorIndex = C.UTF8ToString(sourceAddress, errorByte).length; + const suffix = source.slice(errorIndex, errorIndex + 100).split("\n")[0]; + const word = suffix.match(QUERY_WORD_REGEX)?.[0] ?? ""; + C._free(sourceAddress); + switch (errorId) { + case QueryErrorKind.Syntax: + throw new QueryError(QueryErrorKind.Syntax, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0); + case QueryErrorKind.NodeName: + throw new QueryError(errorId, { word }, errorIndex, word.length); + case QueryErrorKind.FieldName: + throw new QueryError(errorId, { word }, errorIndex, word.length); + case QueryErrorKind.CaptureName: + throw new QueryError(errorId, { word }, errorIndex, word.length); + case QueryErrorKind.PatternStructure: + throw new QueryError(errorId, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0); + } + } + const stringCount = C._ts_query_string_count(address); + const captureCount = C._ts_query_capture_count(address); + const patternCount = C._ts_query_pattern_count(address); + const captureNames = new Array(captureCount); + const captureQuantifiers = new Array(patternCount); + const stringValues = new Array(stringCount); + for (let i2 = 0; i2 < captureCount; i2++) { + const nameAddress = C._ts_query_capture_name_for_id( + address, + i2, + TRANSFER_BUFFER + ); + const nameLength = C.getValue(TRANSFER_BUFFER, "i32"); + captureNames[i2] = C.UTF8ToString(nameAddress, nameLength); + } + for (let i2 = 0; i2 < patternCount; i2++) { + const captureQuantifiersArray = new Array(captureCount); + for (let j = 0; j < captureCount; j++) { + const quantifier = C._ts_query_capture_quantifier_for_id(address, i2, j); + captureQuantifiersArray[j] = quantifier; + } + captureQuantifiers[i2] = captureQuantifiersArray; + } + for (let i2 = 0; i2 < stringCount; i2++) { + const valueAddress = C._ts_query_string_value_for_id( + address, + i2, + TRANSFER_BUFFER + ); + const nameLength = C.getValue(TRANSFER_BUFFER, "i32"); + stringValues[i2] = C.UTF8ToString(valueAddress, nameLength); + } + const setProperties = new Array(patternCount); + const assertedProperties = new Array(patternCount); + const refutedProperties = new Array(patternCount); + const predicates = new Array(patternCount); + const textPredicates = new Array(patternCount); + for (let i2 = 0; i2 < patternCount; i2++) { + const predicatesAddress = C._ts_query_predicates_for_pattern(address, i2, TRANSFER_BUFFER); + const stepCount = C.getValue(TRANSFER_BUFFER, "i32"); + predicates[i2] = []; + textPredicates[i2] = []; + const steps = new Array(); + let stepAddress = predicatesAddress; + for (let j = 0; j < stepCount; j++) { + const stepType = C.getValue(stepAddress, "i32"); + stepAddress += SIZE_OF_INT; + const stepValueId = C.getValue(stepAddress, "i32"); + stepAddress += SIZE_OF_INT; + parsePattern( + i2, + stepType, + stepValueId, + captureNames, + stringValues, + steps, + textPredicates, + predicates, + setProperties, + assertedProperties, + refutedProperties + ); + } + Object.freeze(textPredicates[i2]); + Object.freeze(predicates[i2]); + Object.freeze(setProperties[i2]); + Object.freeze(assertedProperties[i2]); + Object.freeze(refutedProperties[i2]); + } + C._free(sourceAddress); + this[0] = address; + this.captureNames = captureNames; + this.captureQuantifiers = captureQuantifiers; + this.textPredicates = textPredicates; + this.predicates = predicates; + this.setProperties = setProperties; + this.assertedProperties = assertedProperties; + this.refutedProperties = refutedProperties; + this.exceededMatchLimit = false; + } + /** Delete the query, freeing its resources. */ + delete() { + C._ts_query_delete(this[0]); + this[0] = 0; + } + /** + * Iterate over all of the matches in the order that they were found. + * + * Each match contains the index of the pattern that matched, and a list of + * captures. Because multiple patterns can match the same set of nodes, + * one match may contain captures that appear *before* some of the + * captures from a previous match. + * + * @param {Node} node - The node to execute the query on. + * + * @param {QueryOptions} options - Options for query execution. + */ + matches(node, options = {}) { + const startPosition = options.startPosition ?? ZERO_POINT; + const endPosition = options.endPosition ?? ZERO_POINT; + const startIndex = options.startIndex ?? 0; + const endIndex = options.endIndex ?? 0; + const matchLimit = options.matchLimit ?? 4294967295; + const maxStartDepth = options.maxStartDepth ?? 4294967295; + const timeoutMicros = options.timeoutMicros ?? 0; + const progressCallback = options.progressCallback; + if (typeof matchLimit !== "number") { + throw new Error("Arguments must be numbers"); + } + this.matchLimit = matchLimit; + if (endIndex !== 0 && startIndex > endIndex) { + throw new Error("`startIndex` cannot be greater than `endIndex`"); + } + if (endPosition !== ZERO_POINT && (startPosition.row > endPosition.row || startPosition.row === endPosition.row && startPosition.column > endPosition.column)) { + throw new Error("`startPosition` cannot be greater than `endPosition`"); + } + if (progressCallback) { + C.currentQueryProgressCallback = progressCallback; + } + marshalNode(node); + C._ts_query_matches_wasm( + this[0], + node.tree[0], + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column, + startIndex, + endIndex, + matchLimit, + maxStartDepth, + timeoutMicros + ); + const rawCount = C.getValue(TRANSFER_BUFFER, "i32"); + const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"); + const result = new Array(rawCount); + this.exceededMatchLimit = Boolean(didExceedMatchLimit); + let filteredCount = 0; + let address = startAddress; + for (let i2 = 0; i2 < rawCount; i2++) { + const patternIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captureCount = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captures = new Array(captureCount); + address = unmarshalCaptures(this, node.tree, address, patternIndex, captures); + if (this.textPredicates[patternIndex].every((p) => p(captures))) { + result[filteredCount] = { pattern: patternIndex, patternIndex, captures }; + const setProperties = this.setProperties[patternIndex]; + result[filteredCount].setProperties = setProperties; + const assertedProperties = this.assertedProperties[patternIndex]; + result[filteredCount].assertedProperties = assertedProperties; + const refutedProperties = this.refutedProperties[patternIndex]; + result[filteredCount].refutedProperties = refutedProperties; + filteredCount++; + } + } + result.length = filteredCount; + C._free(startAddress); + C.currentQueryProgressCallback = null; + return result; + } + /** + * Iterate over all of the individual captures in the order that they + * appear. + * + * This is useful if you don't care about which pattern matched, and just + * want a single, ordered sequence of captures. + * + * @param {Node} node - The node to execute the query on. + * + * @param {QueryOptions} options - Options for query execution. + */ + captures(node, options = {}) { + const startPosition = options.startPosition ?? ZERO_POINT; + const endPosition = options.endPosition ?? ZERO_POINT; + const startIndex = options.startIndex ?? 0; + const endIndex = options.endIndex ?? 0; + const matchLimit = options.matchLimit ?? 4294967295; + const maxStartDepth = options.maxStartDepth ?? 4294967295; + const timeoutMicros = options.timeoutMicros ?? 0; + const progressCallback = options.progressCallback; + if (typeof matchLimit !== "number") { + throw new Error("Arguments must be numbers"); + } + this.matchLimit = matchLimit; + if (endIndex !== 0 && startIndex > endIndex) { + throw new Error("`startIndex` cannot be greater than `endIndex`"); + } + if (endPosition !== ZERO_POINT && (startPosition.row > endPosition.row || startPosition.row === endPosition.row && startPosition.column > endPosition.column)) { + throw new Error("`startPosition` cannot be greater than `endPosition`"); + } + if (progressCallback) { + C.currentQueryProgressCallback = progressCallback; + } + marshalNode(node); + C._ts_query_captures_wasm( + this[0], + node.tree[0], + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column, + startIndex, + endIndex, + matchLimit, + maxStartDepth, + timeoutMicros + ); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"); + const result = new Array(); + this.exceededMatchLimit = Boolean(didExceedMatchLimit); + const captures = new Array(); + let address = startAddress; + for (let i2 = 0; i2 < count; i2++) { + const patternIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captureCount = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captureIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + captures.length = captureCount; + address = unmarshalCaptures(this, node.tree, address, patternIndex, captures); + if (this.textPredicates[patternIndex].every((p) => p(captures))) { + const capture = captures[captureIndex]; + const setProperties = this.setProperties[patternIndex]; + capture.setProperties = setProperties; + const assertedProperties = this.assertedProperties[patternIndex]; + capture.assertedProperties = assertedProperties; + const refutedProperties = this.refutedProperties[patternIndex]; + capture.refutedProperties = refutedProperties; + result.push(capture); + } + } + C._free(startAddress); + C.currentQueryProgressCallback = null; + return result; + } + /** Get the predicates for a given pattern. */ + predicatesForPattern(patternIndex) { + return this.predicates[patternIndex]; + } + /** + * Disable a certain capture within a query. + * + * This prevents the capture from being returned in matches, and also + * avoids any resource usage associated with recording the capture. + */ + disableCapture(captureName) { + const captureNameLength = C.lengthBytesUTF8(captureName); + const captureNameAddress = C._malloc(captureNameLength + 1); + C.stringToUTF8(captureName, captureNameAddress, captureNameLength + 1); + C._ts_query_disable_capture(this[0], captureNameAddress, captureNameLength); + C._free(captureNameAddress); + } + /** + * Disable a certain pattern within a query. + * + * This prevents the pattern from matching, and also avoids any resource + * usage associated with the pattern. This throws an error if the pattern + * index is out of bounds. + */ + disablePattern(patternIndex) { + if (patternIndex >= this.predicates.length) { + throw new Error( + `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` + ); + } + C._ts_query_disable_pattern(this[0], patternIndex); + } + /** + * Check if, on its last execution, this cursor exceeded its maximum number + * of in-progress matches. + */ + didExceedMatchLimit() { + return this.exceededMatchLimit; + } + /** Get the byte offset where the given pattern starts in the query's source. */ + startIndexForPattern(patternIndex) { + if (patternIndex >= this.predicates.length) { + throw new Error( + `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` + ); + } + return C._ts_query_start_byte_for_pattern(this[0], patternIndex); + } + /** Get the byte offset where the given pattern ends in the query's source. */ + endIndexForPattern(patternIndex) { + if (patternIndex >= this.predicates.length) { + throw new Error( + `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` + ); + } + return C._ts_query_end_byte_for_pattern(this[0], patternIndex); + } + /** Get the number of patterns in the query. */ + patternCount() { + return C._ts_query_pattern_count(this[0]); + } + /** Get the index for a given capture name. */ + captureIndexForName(captureName) { + return this.captureNames.indexOf(captureName); + } + /** Check if a given pattern within a query has a single root node. */ + isPatternRooted(patternIndex) { + return C._ts_query_is_pattern_rooted(this[0], patternIndex) === 1; + } + /** Check if a given pattern within a query has a single root node. */ + isPatternNonLocal(patternIndex) { + return C._ts_query_is_pattern_non_local(this[0], patternIndex) === 1; + } + /** + * Check if a given step in a query is 'definite'. + * + * A query step is 'definite' if its parent pattern will be guaranteed to + * match successfully once it reaches the step. + */ + isPatternGuaranteedAtStep(byteIndex) { + return C._ts_query_is_pattern_guaranteed_at_step(this[0], byteIndex) === 1; + } +}; + +// src/language.ts +var LANGUAGE_FUNCTION_REGEX = /^tree_sitter_\w+$/; +var Language = class _Language { + static { + __name(this, "Language"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** + * A list of all node types in the language. The index of each type in this + * array is its node type id. + */ + types; + /** + * A list of all field names in the language. The index of each field name in + * this array is its field id. + */ + fields; + /** @internal */ + constructor(internal, address) { + assertInternal(internal); + this[0] = address; + this.types = new Array(C._ts_language_symbol_count(this[0])); + for (let i2 = 0, n = this.types.length; i2 < n; i2++) { + if (C._ts_language_symbol_type(this[0], i2) < 2) { + this.types[i2] = C.UTF8ToString(C._ts_language_symbol_name(this[0], i2)); + } + } + this.fields = new Array(C._ts_language_field_count(this[0]) + 1); + for (let i2 = 0, n = this.fields.length; i2 < n; i2++) { + const fieldName = C._ts_language_field_name_for_id(this[0], i2); + if (fieldName !== 0) { + this.fields[i2] = C.UTF8ToString(fieldName); + } else { + this.fields[i2] = null; + } + } + } + /** + * Gets the name of the language. + */ + get name() { + const ptr = C._ts_language_name(this[0]); + if (ptr === 0) return null; + return C.UTF8ToString(ptr); + } + /** + * @deprecated since version 0.25.0, use {@link Language#abiVersion} instead + * Gets the version of the language. + */ + get version() { + return C._ts_language_version(this[0]); + } + /** + * Gets the ABI version of the language. + */ + get abiVersion() { + return C._ts_language_abi_version(this[0]); + } + /** + * Get the metadata for this language. This information is generated by the + * CLI, and relies on the language author providing the correct metadata in + * the language's `tree-sitter.json` file. + */ + get metadata() { + C._ts_language_metadata(this[0]); + const length = C.getValue(TRANSFER_BUFFER, "i32"); + const address = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + if (length === 0) return null; + return unmarshalLanguageMetadata(address); + } + /** + * Gets the number of fields in the language. + */ + get fieldCount() { + return this.fields.length - 1; + } + /** + * Gets the number of states in the language. + */ + get stateCount() { + return C._ts_language_state_count(this[0]); + } + /** + * Get the field id for a field name. + */ + fieldIdForName(fieldName) { + const result = this.fields.indexOf(fieldName); + return result !== -1 ? result : null; + } + /** + * Get the field name for a field id. + */ + fieldNameForId(fieldId) { + return this.fields[fieldId] ?? null; + } + /** + * Get the node type id for a node type name. + */ + idForNodeType(type, named) { + const typeLength = C.lengthBytesUTF8(type); + const typeAddress = C._malloc(typeLength + 1); + C.stringToUTF8(type, typeAddress, typeLength + 1); + const result = C._ts_language_symbol_for_name(this[0], typeAddress, typeLength, named ? 1 : 0); + C._free(typeAddress); + return result || null; + } + /** + * Gets the number of node types in the language. + */ + get nodeTypeCount() { + return C._ts_language_symbol_count(this[0]); + } + /** + * Get the node type name for a node type id. + */ + nodeTypeForId(typeId) { + const name2 = C._ts_language_symbol_name(this[0], typeId); + return name2 ? C.UTF8ToString(name2) : null; + } + /** + * Check if a node type is named. + * + * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/2-basic-parsing.html#named-vs-anonymous-nodes} + */ + nodeTypeIsNamed(typeId) { + return C._ts_language_type_is_named_wasm(this[0], typeId) ? true : false; + } + /** + * Check if a node type is visible. + */ + nodeTypeIsVisible(typeId) { + return C._ts_language_type_is_visible_wasm(this[0], typeId) ? true : false; + } + /** + * Get the supertypes ids of this language. + * + * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types.html?highlight=supertype#supertype-nodes} + */ + get supertypes() { + C._ts_language_supertypes_wasm(this[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = C.getValue(address, "i16"); + address += SIZE_OF_SHORT; + } + } + return result; + } + /** + * Get the subtype ids for a given supertype node id. + */ + subtypes(supertype) { + C._ts_language_subtypes_wasm(this[0], supertype); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = C.getValue(address, "i16"); + address += SIZE_OF_SHORT; + } + } + return result; + } + /** + * Get the next state id for a given state id and node type id. + */ + nextState(stateId, typeId) { + return C._ts_language_next_state(this[0], stateId, typeId); + } + /** + * Create a new lookahead iterator for this language and parse state. + * + * This returns `null` if state is invalid for this language. + * + * Iterating {@link LookaheadIterator} will yield valid symbols in the given + * parse state. Newly created lookahead iterators will return the `ERROR` + * symbol from {@link LookaheadIterator#currentType}. + * + * Lookahead iterators can be useful for generating suggestions and improving + * syntax error diagnostics. To get symbols valid in an `ERROR` node, use the + * lookahead iterator on its first leaf node state. For `MISSING` nodes, a + * lookahead iterator created on the previous non-extra leaf node may be + * appropriate. + */ + lookaheadIterator(stateId) { + const address = C._ts_lookahead_iterator_new(this[0], stateId); + if (address) return new LookaheadIterator(INTERNAL, address, this); + return null; + } + /** + * @deprecated since version 0.25.0, call `new` on a {@link Query} instead + * + * Create a new query from a string containing one or more S-expression + * patterns. + * + * The query is associated with a particular language, and can only be run + * on syntax nodes parsed with that language. References to Queries can be + * shared between multiple threads. + * + * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries} + */ + query(source) { + console.warn("Language.query is deprecated. Use new Query(language, source) instead."); + return new Query(this, source); + } + /** + * Load a language from a WebAssembly module. + * The module can be provided as a path to a file or as a buffer. + */ + static async load(input) { + let bytes; + if (input instanceof Uint8Array) { + bytes = Promise.resolve(input); + } else { + if (globalThis.process?.versions.node) { + const fs2 = await import("fs/promises"); + bytes = fs2.readFile(input); + } else { + bytes = fetch(input).then((response) => response.arrayBuffer().then((buffer) => { + if (response.ok) { + return new Uint8Array(buffer); + } else { + const body2 = new TextDecoder("utf-8").decode(buffer); + throw new Error(`Language.load failed with status ${response.status}. + +${body2}`); + } + })); + } + } + const mod = await C.loadWebAssemblyModule(await bytes, { loadAsync: true }); + const symbolNames = Object.keys(mod); + const functionName = symbolNames.find((key) => LANGUAGE_FUNCTION_REGEX.test(key) && !key.includes("external_scanner_")); + if (!functionName) { + console.log(`Couldn't find language function in WASM file. Symbols: +${JSON.stringify(symbolNames, null, 2)}`); + throw new Error("Language.load failed: no language function found in WASM file"); + } + const languageAddress = mod[functionName](); + return new _Language(INTERNAL, languageAddress); + } +}; + +// lib/tree-sitter.mjs +var Module2 = (() => { + var _scriptName = import.meta.url; + return async function(moduleArg = {}) { + var moduleRtn; + var Module = moduleArg; + var readyPromiseResolve, readyPromiseReject; + var readyPromise = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var ENVIRONMENT_IS_WEB = typeof window == "object"; + var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != "undefined"; + var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string" && process.type != "renderer"; + var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + if (ENVIRONMENT_IS_NODE) { + const { createRequire } = await import("module"); + var require = createRequire(import.meta.url); + } + Module.currentQueryProgressCallback = null; + Module.currentProgressCallback = null; + Module.currentLogCallback = null; + Module.currentParseCallback = null; + var moduleOverrides = Object.assign({}, Module); + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = /* @__PURE__ */ __name((status, toThrow) => { + throw toThrow; + }, "quit_"); + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + __name(locateFile, "locateFile"); + var readAsync, readBinary; + if (ENVIRONMENT_IS_NODE) { + var fs = require("fs"); + var nodePath = require("path"); + if (!import.meta.url.startsWith("data:")) { + scriptDirectory = nodePath.dirname(require("url").fileURLToPath(import.meta.url)) + "/"; + } + readBinary = /* @__PURE__ */ __name((filename) => { + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename); + return ret; + }, "readBinary"); + readAsync = /* @__PURE__ */ __name(async (filename, binary2 = true) => { + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename, binary2 ? void 0 : "utf8"); + return ret; + }, "readAsync"); + if (!Module["thisProgram"] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, "/"); + } + arguments_ = process.argv.slice(2); + quit_ = /* @__PURE__ */ __name((status, toThrow) => { + process.exitCode = status; + throw toThrow; + }, "quit_"); + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document != "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptName) { + scriptDirectory = _scriptName; + } + if (scriptDirectory.startsWith("blob:")) { + scriptDirectory = ""; + } else { + scriptDirectory = scriptDirectory.slice(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); + } + { + if (ENVIRONMENT_IS_WORKER) { + readBinary = /* @__PURE__ */ __name((url) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array( + /** @type{!ArrayBuffer} */ + xhr.response + ); + }, "readBinary"); + } + readAsync = /* @__PURE__ */ __name(async (url) => { + if (isFileURI(url)) { + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = () => { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + resolve(xhr.response); + return; + } + reject(xhr.status); + }; + xhr.onerror = reject; + xhr.send(null); + }); + } + var response = await fetch(url, { + credentials: "same-origin" + }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + " : " + response.url); + }, "readAsync"); + } + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.error.bind(console); + Object.assign(Module, moduleOverrides); + moduleOverrides = null; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + var dynamicLibraries = Module["dynamicLibraries"] || []; + var wasmBinary = Module["wasmBinary"]; + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert(condition, text) { + if (!condition) { + abort(text); + } + } + __name(assert, "assert"); + var HEAP, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAP64, HEAPU64, HEAPF64; + var HEAP_DATA_VIEW; + var runtimeInitialized = false; + var isFileURI = /* @__PURE__ */ __name((filename) => filename.startsWith("file://"), "isFileURI"); + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module["HEAP_DATA_VIEW"] = HEAP_DATA_VIEW = new DataView(b); + Module["HEAP8"] = HEAP8 = new Int8Array(b); + Module["HEAP16"] = HEAP16 = new Int16Array(b); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); + Module["HEAP32"] = HEAP32 = new Int32Array(b); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); + Module["HEAPF32"] = HEAPF32 = new Float32Array(b); + Module["HEAPF64"] = HEAPF64 = new Float64Array(b); + Module["HEAP64"] = HEAP64 = new BigInt64Array(b); + Module["HEAPU64"] = HEAPU64 = new BigUint64Array(b); + } + __name(updateMemoryViews, "updateMemoryViews"); + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 33554432; + wasmMemory = new WebAssembly.Memory({ + "initial": INITIAL_MEMORY / 65536, + // In theory we should not need to emit the maximum if we want "unlimited" + // or 4GB of memory, but VMs error on that atm, see + // https://github.com/emscripten-core/emscripten/issues/14130 + // And in the pthreads case we definitely need to emit a maximum. So + // always emit one. + "maximum": 32768 + }); + } + updateMemoryViews(); + var __RELOC_FUNCS__ = []; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(onPreRuns); + } + __name(preRun, "preRun"); + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__RELOC_FUNCS__); + wasmExports["__wasm_call_ctors"](); + callRuntimeCallbacks(onPostCtors); + } + __name(initRuntime, "initRuntime"); + function preMain() { + } + __name(preMain, "preMain"); + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(onPostRuns); + } + __name(postRun, "postRun"); + var runDependencies = 0; + var dependenciesFulfilled = null; + function getUniqueRunDependency(id) { + return id; + } + __name(getUniqueRunDependency, "getUniqueRunDependency"); + function addRunDependency(id) { + runDependencies++; + Module["monitorRunDependencies"]?.(runDependencies); + } + __name(addRunDependency, "addRunDependency"); + function removeRunDependency(id) { + runDependencies--; + Module["monitorRunDependencies"]?.(runDependencies); + if (runDependencies == 0) { + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + __name(removeRunDependency, "removeRunDependency"); + function abort(what) { + Module["onAbort"]?.(what); + what = "Aborted(" + what + ")"; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + __name(abort, "abort"); + var wasmBinaryFile; + function findWasmBinary() { + if (Module["locateFile"]) { + return locateFile("tree-sitter.wasm"); + } + return new URL("tree-sitter.wasm", import.meta.url).href; + } + __name(findWasmBinary, "findWasmBinary"); + function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw "both async and sync fetching of the wasm failed"; + } + __name(getBinarySync, "getBinarySync"); + async function getWasmBinary(binaryFile) { + if (!wasmBinary) { + try { + var response = await readAsync(binaryFile); + return new Uint8Array(response); + } catch { + } + } + return getBinarySync(binaryFile); + } + __name(getWasmBinary, "getWasmBinary"); + async function instantiateArrayBuffer(binaryFile, imports) { + try { + var binary2 = await getWasmBinary(binaryFile); + var instance2 = await WebAssembly.instantiate(binary2, imports); + return instance2; + } catch (reason) { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + } + } + __name(instantiateArrayBuffer, "instantiateArrayBuffer"); + async function instantiateAsync(binary2, binaryFile, imports) { + if (!binary2 && typeof WebAssembly.instantiateStreaming == "function" && !isFileURI(binaryFile) && !ENVIRONMENT_IS_NODE) { + try { + var response = fetch(binaryFile, { + credentials: "same-origin" + }); + var instantiationResult = await WebAssembly.instantiateStreaming(response, imports); + return instantiationResult; + } catch (reason) { + err(`wasm streaming compile failed: ${reason}`); + err("falling back to ArrayBuffer instantiation"); + } + } + return instantiateArrayBuffer(binaryFile, imports); + } + __name(instantiateAsync, "instantiateAsync"); + function getWasmImports() { + return { + "env": wasmImports, + "wasi_snapshot_preview1": wasmImports, + "GOT.mem": new Proxy(wasmImports, GOTHandler), + "GOT.func": new Proxy(wasmImports, GOTHandler) + }; + } + __name(getWasmImports, "getWasmImports"); + async function createWasm() { + function receiveInstance(instance2, module2) { + wasmExports = instance2.exports; + wasmExports = relocateExports(wasmExports, 1024); + var metadata2 = getDylinkMetadata(module2); + if (metadata2.neededDynlibs) { + dynamicLibraries = metadata2.neededDynlibs.concat(dynamicLibraries); + } + mergeLibSymbols(wasmExports, "main"); + LDSO.init(); + loadDylibs(); + __RELOC_FUNCS__.push(wasmExports["__wasm_apply_data_relocs"]); + removeRunDependency("wasm-instantiate"); + return wasmExports; + } + __name(receiveInstance, "receiveInstance"); + addRunDependency("wasm-instantiate"); + function receiveInstantiationResult(result2) { + return receiveInstance(result2["instance"], result2["module"]); + } + __name(receiveInstantiationResult, "receiveInstantiationResult"); + var info2 = getWasmImports(); + if (Module["instantiateWasm"]) { + return new Promise((resolve, reject) => { + Module["instantiateWasm"](info2, (mod, inst) => { + receiveInstance(mod, inst); + resolve(mod.exports); + }); + }); + } + wasmBinaryFile ??= findWasmBinary(); + try { + var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info2); + var exports = receiveInstantiationResult(result); + return exports; + } catch (e) { + readyPromiseReject(e); + return Promise.reject(e); + } + } + __name(createWasm, "createWasm"); + var ASM_CONSTS = {}; + class ExitStatus { + static { + __name(this, "ExitStatus"); + } + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + var GOT = {}; + var currentModuleWeakSymbols = /* @__PURE__ */ new Set([]); + var GOTHandler = { + get(obj, symName) { + var rtn = GOT[symName]; + if (!rtn) { + rtn = GOT[symName] = new WebAssembly.Global({ + "value": "i32", + "mutable": true + }); + } + if (!currentModuleWeakSymbols.has(symName)) { + rtn.required = true; + } + return rtn; + } + }; + var LE_HEAP_LOAD_F32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getFloat32(byteOffset, true), "LE_HEAP_LOAD_F32"); + var LE_HEAP_LOAD_F64 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getFloat64(byteOffset, true), "LE_HEAP_LOAD_F64"); + var LE_HEAP_LOAD_I16 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getInt16(byteOffset, true), "LE_HEAP_LOAD_I16"); + var LE_HEAP_LOAD_I32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getInt32(byteOffset, true), "LE_HEAP_LOAD_I32"); + var LE_HEAP_LOAD_U16 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getUint16(byteOffset, true), "LE_HEAP_LOAD_U16"); + var LE_HEAP_LOAD_U32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getUint32(byteOffset, true), "LE_HEAP_LOAD_U32"); + var LE_HEAP_STORE_F32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setFloat32(byteOffset, value, true), "LE_HEAP_STORE_F32"); + var LE_HEAP_STORE_F64 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setFloat64(byteOffset, value, true), "LE_HEAP_STORE_F64"); + var LE_HEAP_STORE_I16 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setInt16(byteOffset, value, true), "LE_HEAP_STORE_I16"); + var LE_HEAP_STORE_I32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setInt32(byteOffset, value, true), "LE_HEAP_STORE_I32"); + var LE_HEAP_STORE_U16 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setUint16(byteOffset, value, true), "LE_HEAP_STORE_U16"); + var LE_HEAP_STORE_U32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setUint32(byteOffset, value, true), "LE_HEAP_STORE_U32"); + var callRuntimeCallbacks = /* @__PURE__ */ __name((callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }, "callRuntimeCallbacks"); + var onPostRuns = []; + var addOnPostRun = /* @__PURE__ */ __name((cb) => onPostRuns.unshift(cb), "addOnPostRun"); + var onPreRuns = []; + var addOnPreRun = /* @__PURE__ */ __name((cb) => onPreRuns.unshift(cb), "addOnPreRun"); + var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder() : void 0; + var UTF8ArrayToString = /* @__PURE__ */ __name((heapOrArray, idx = 0, maxBytesToRead = NaN) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + }, "UTF8ArrayToString"); + var getDylinkMetadata = /* @__PURE__ */ __name((binary2) => { + var offset = 0; + var end = 0; + function getU8() { + return binary2[offset++]; + } + __name(getU8, "getU8"); + function getLEB() { + var ret = 0; + var mul = 1; + while (1) { + var byte = binary2[offset++]; + ret += (byte & 127) * mul; + mul *= 128; + if (!(byte & 128)) break; + } + return ret; + } + __name(getLEB, "getLEB"); + function getString() { + var len = getLEB(); + offset += len; + return UTF8ArrayToString(binary2, offset - len, len); + } + __name(getString, "getString"); + function failIf(condition, message) { + if (condition) throw new Error(message); + } + __name(failIf, "failIf"); + var name2 = "dylink.0"; + if (binary2 instanceof WebAssembly.Module) { + var dylinkSection = WebAssembly.Module.customSections(binary2, name2); + if (dylinkSection.length === 0) { + name2 = "dylink"; + dylinkSection = WebAssembly.Module.customSections(binary2, name2); + } + failIf(dylinkSection.length === 0, "need dylink section"); + binary2 = new Uint8Array(dylinkSection[0]); + end = binary2.length; + } else { + var int32View = new Uint32Array(new Uint8Array(binary2.subarray(0, 24)).buffer); + var magicNumberFound = int32View[0] == 1836278016 || int32View[0] == 6386541; + failIf(!magicNumberFound, "need to see wasm magic number"); + failIf(binary2[8] !== 0, "need the dylink section to be first"); + offset = 9; + var section_size = getLEB(); + end = offset + section_size; + name2 = getString(); + } + var customSection = { + neededDynlibs: [], + tlsExports: /* @__PURE__ */ new Set(), + weakImports: /* @__PURE__ */ new Set() + }; + if (name2 == "dylink") { + customSection.memorySize = getLEB(); + customSection.memoryAlign = getLEB(); + customSection.tableSize = getLEB(); + customSection.tableAlign = getLEB(); + var neededDynlibsCount = getLEB(); + for (var i2 = 0; i2 < neededDynlibsCount; ++i2) { + var libname = getString(); + customSection.neededDynlibs.push(libname); + } + } else { + failIf(name2 !== "dylink.0"); + var WASM_DYLINK_MEM_INFO = 1; + var WASM_DYLINK_NEEDED = 2; + var WASM_DYLINK_EXPORT_INFO = 3; + var WASM_DYLINK_IMPORT_INFO = 4; + var WASM_SYMBOL_TLS = 256; + var WASM_SYMBOL_BINDING_MASK = 3; + var WASM_SYMBOL_BINDING_WEAK = 1; + while (offset < end) { + var subsectionType = getU8(); + var subsectionSize = getLEB(); + if (subsectionType === WASM_DYLINK_MEM_INFO) { + customSection.memorySize = getLEB(); + customSection.memoryAlign = getLEB(); + customSection.tableSize = getLEB(); + customSection.tableAlign = getLEB(); + } else if (subsectionType === WASM_DYLINK_NEEDED) { + var neededDynlibsCount = getLEB(); + for (var i2 = 0; i2 < neededDynlibsCount; ++i2) { + libname = getString(); + customSection.neededDynlibs.push(libname); + } + } else if (subsectionType === WASM_DYLINK_EXPORT_INFO) { + var count = getLEB(); + while (count--) { + var symname = getString(); + var flags2 = getLEB(); + if (flags2 & WASM_SYMBOL_TLS) { + customSection.tlsExports.add(symname); + } + } + } else if (subsectionType === WASM_DYLINK_IMPORT_INFO) { + var count = getLEB(); + while (count--) { + var modname = getString(); + var symname = getString(); + var flags2 = getLEB(); + if ((flags2 & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) { + customSection.weakImports.add(symname); + } + } + } else { + offset += subsectionSize; + } + } + } + return customSection; + }, "getDylinkMetadata"); + function getValue(ptr, type = "i8") { + if (type.endsWith("*")) type = "*"; + switch (type) { + case "i1": + return HEAP8[ptr]; + case "i8": + return HEAP8[ptr]; + case "i16": + return LE_HEAP_LOAD_I16((ptr >> 1) * 2); + case "i32": + return LE_HEAP_LOAD_I32((ptr >> 2) * 4); + case "i64": + return HEAP64[ptr >> 3]; + case "float": + return LE_HEAP_LOAD_F32((ptr >> 2) * 4); + case "double": + return LE_HEAP_LOAD_F64((ptr >> 3) * 8); + case "*": + return LE_HEAP_LOAD_U32((ptr >> 2) * 4); + default: + abort(`invalid type for getValue: ${type}`); + } + } + __name(getValue, "getValue"); + var newDSO = /* @__PURE__ */ __name((name2, handle2, syms) => { + var dso = { + refcount: Infinity, + name: name2, + exports: syms, + global: true + }; + LDSO.loadedLibsByName[name2] = dso; + if (handle2 != void 0) { + LDSO.loadedLibsByHandle[handle2] = dso; + } + return dso; + }, "newDSO"); + var LDSO = { + loadedLibsByName: {}, + loadedLibsByHandle: {}, + init() { + newDSO("__main__", 0, wasmImports); + } + }; + var ___heap_base = 78224; + var alignMemory = /* @__PURE__ */ __name((size, alignment) => Math.ceil(size / alignment) * alignment, "alignMemory"); + var getMemory = /* @__PURE__ */ __name((size) => { + if (runtimeInitialized) { + return _calloc(size, 1); + } + var ret = ___heap_base; + var end = ret + alignMemory(size, 16); + ___heap_base = end; + GOT["__heap_base"].value = end; + return ret; + }, "getMemory"); + var isInternalSym = /* @__PURE__ */ __name((symName) => ["__cpp_exception", "__c_longjmp", "__wasm_apply_data_relocs", "__dso_handle", "__tls_size", "__tls_align", "__set_stack_limits", "_emscripten_tls_init", "__wasm_init_tls", "__wasm_call_ctors", "__start_em_asm", "__stop_em_asm", "__start_em_js", "__stop_em_js"].includes(symName) || symName.startsWith("__em_js__"), "isInternalSym"); + var uleb128Encode = /* @__PURE__ */ __name((n, target) => { + if (n < 128) { + target.push(n); + } else { + target.push(n % 128 | 128, n >> 7); + } + }, "uleb128Encode"); + var sigToWasmTypes = /* @__PURE__ */ __name((sig) => { + var typeNames = { + "i": "i32", + "j": "i64", + "f": "f32", + "d": "f64", + "e": "externref", + "p": "i32" + }; + var type = { + parameters: [], + results: sig[0] == "v" ? [] : [typeNames[sig[0]]] + }; + for (var i2 = 1; i2 < sig.length; ++i2) { + type.parameters.push(typeNames[sig[i2]]); + } + return type; + }, "sigToWasmTypes"); + var generateFuncType = /* @__PURE__ */ __name((sig, target) => { + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + "i": 127, + // i32 + "p": 127, + // i32 + "j": 126, + // i64 + "f": 125, + // f32 + "d": 124, + // f64 + "e": 111 + }; + target.push(96); + uleb128Encode(sigParam.length, target); + for (var i2 = 0; i2 < sigParam.length; ++i2) { + target.push(typeCodes[sigParam[i2]]); + } + if (sigRet == "v") { + target.push(0); + } else { + target.push(1, typeCodes[sigRet]); + } + }, "generateFuncType"); + var convertJsFunctionToWasm = /* @__PURE__ */ __name((func2, sig) => { + if (typeof WebAssembly.Function == "function") { + return new WebAssembly.Function(sigToWasmTypes(sig), func2); + } + var typeSectionBody = [1]; + generateFuncType(sig, typeSectionBody); + var bytes = [ + 0, + 97, + 115, + 109, + // magic ("\0asm") + 1, + 0, + 0, + 0, + // version: 1 + 1 + ]; + uleb128Encode(typeSectionBody.length, bytes); + bytes.push(...typeSectionBody); + bytes.push( + 2, + 7, + // import section + // (import "e" "f" (func 0 (type 0))) + 1, + 1, + 101, + 1, + 102, + 0, + 0, + 7, + 5, + // export section + // (export "f" (func 0 (type 0))) + 1, + 1, + 102, + 0, + 0 + ); + var module2 = new WebAssembly.Module(new Uint8Array(bytes)); + var instance2 = new WebAssembly.Instance(module2, { + "e": { + "f": func2 + } + }); + var wrappedFunc = instance2.exports["f"]; + return wrappedFunc; + }, "convertJsFunctionToWasm"); + var wasmTableMirror = []; + var wasmTable = new WebAssembly.Table({ + "initial": 31, + "element": "anyfunc" + }); + var getWasmTableEntry = /* @__PURE__ */ __name((funcPtr) => { + var func2 = wasmTableMirror[funcPtr]; + if (!func2) { + if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func2 = wasmTable.get(funcPtr); + } + return func2; + }, "getWasmTableEntry"); + var updateTableMap = /* @__PURE__ */ __name((offset, count) => { + if (functionsInTableMap) { + for (var i2 = offset; i2 < offset + count; i2++) { + var item = getWasmTableEntry(i2); + if (item) { + functionsInTableMap.set(item, i2); + } + } + } + }, "updateTableMap"); + var functionsInTableMap; + var getFunctionAddress = /* @__PURE__ */ __name((func2) => { + if (!functionsInTableMap) { + functionsInTableMap = /* @__PURE__ */ new WeakMap(); + updateTableMap(0, wasmTable.length); + } + return functionsInTableMap.get(func2) || 0; + }, "getFunctionAddress"); + var freeTableIndexes = []; + var getEmptyTableSlot = /* @__PURE__ */ __name(() => { + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + try { + wasmTable.grow(1); + } catch (err2) { + if (!(err2 instanceof RangeError)) { + throw err2; + } + throw "Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."; + } + return wasmTable.length - 1; + }, "getEmptyTableSlot"); + var setWasmTableEntry = /* @__PURE__ */ __name((idx, func2) => { + wasmTable.set(idx, func2); + wasmTableMirror[idx] = wasmTable.get(idx); + }, "setWasmTableEntry"); + var addFunction = /* @__PURE__ */ __name((func2, sig) => { + var rtn = getFunctionAddress(func2); + if (rtn) { + return rtn; + } + var ret = getEmptyTableSlot(); + try { + setWasmTableEntry(ret, func2); + } catch (err2) { + if (!(err2 instanceof TypeError)) { + throw err2; + } + var wrapped = convertJsFunctionToWasm(func2, sig); + setWasmTableEntry(ret, wrapped); + } + functionsInTableMap.set(func2, ret); + return ret; + }, "addFunction"); + var updateGOT = /* @__PURE__ */ __name((exports, replace) => { + for (var symName in exports) { + if (isInternalSym(symName)) { + continue; + } + var value = exports[symName]; + GOT[symName] ||= new WebAssembly.Global({ + "value": "i32", + "mutable": true + }); + if (replace || GOT[symName].value == 0) { + if (typeof value == "function") { + GOT[symName].value = addFunction(value); + } else if (typeof value == "number") { + GOT[symName].value = value; + } else { + err(`unhandled export type for '${symName}': ${typeof value}`); + } + } + } + }, "updateGOT"); + var relocateExports = /* @__PURE__ */ __name((exports, memoryBase2, replace) => { + var relocated = {}; + for (var e in exports) { + var value = exports[e]; + if (typeof value == "object") { + value = value.value; + } + if (typeof value == "number") { + value += memoryBase2; + } + relocated[e] = value; + } + updateGOT(relocated, replace); + return relocated; + }, "relocateExports"); + var isSymbolDefined = /* @__PURE__ */ __name((symName) => { + var existing = wasmImports[symName]; + if (!existing || existing.stub) { + return false; + } + return true; + }, "isSymbolDefined"); + var dynCall = /* @__PURE__ */ __name((sig, ptr, args2 = []) => { + var rtn = getWasmTableEntry(ptr)(...args2); + return rtn; + }, "dynCall"); + var stackSave = /* @__PURE__ */ __name(() => _emscripten_stack_get_current(), "stackSave"); + var stackRestore = /* @__PURE__ */ __name((val) => __emscripten_stack_restore(val), "stackRestore"); + var createInvokeFunction = /* @__PURE__ */ __name((sig) => (ptr, ...args2) => { + var sp = stackSave(); + try { + return dynCall(sig, ptr, args2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + if (sig[0] == "j") return 0n; + } + }, "createInvokeFunction"); + var resolveGlobalSymbol = /* @__PURE__ */ __name((symName, direct = false) => { + var sym; + if (isSymbolDefined(symName)) { + sym = wasmImports[symName]; + } else if (symName.startsWith("invoke_")) { + sym = wasmImports[symName] = createInvokeFunction(symName.split("_")[1]); + } + return { + sym, + name: symName + }; + }, "resolveGlobalSymbol"); + var onPostCtors = []; + var addOnPostCtor = /* @__PURE__ */ __name((cb) => onPostCtors.unshift(cb), "addOnPostCtor"); + var UTF8ToString = /* @__PURE__ */ __name((ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "", "UTF8ToString"); + var loadWebAssemblyModule = /* @__PURE__ */ __name((binary, flags, libName, localScope, handle) => { + var metadata = getDylinkMetadata(binary); + currentModuleWeakSymbols = metadata.weakImports; + function loadModule() { + var memAlign = Math.pow(2, metadata.memoryAlign); + var memoryBase = metadata.memorySize ? alignMemory(getMemory(metadata.memorySize + memAlign), memAlign) : 0; + var tableBase = metadata.tableSize ? wasmTable.length : 0; + if (handle) { + HEAP8[handle + 8] = 1; + LE_HEAP_STORE_U32((handle + 12 >> 2) * 4, memoryBase); + LE_HEAP_STORE_I32((handle + 16 >> 2) * 4, metadata.memorySize); + LE_HEAP_STORE_U32((handle + 20 >> 2) * 4, tableBase); + LE_HEAP_STORE_I32((handle + 24 >> 2) * 4, metadata.tableSize); + } + if (metadata.tableSize) { + wasmTable.grow(metadata.tableSize); + } + var moduleExports; + function resolveSymbol(sym) { + var resolved = resolveGlobalSymbol(sym).sym; + if (!resolved && localScope) { + resolved = localScope[sym]; + } + if (!resolved) { + resolved = moduleExports[sym]; + } + return resolved; + } + __name(resolveSymbol, "resolveSymbol"); + var proxyHandler = { + get(stubs, prop) { + switch (prop) { + case "__memory_base": + return memoryBase; + case "__table_base": + return tableBase; + } + if (prop in wasmImports && !wasmImports[prop].stub) { + var res = wasmImports[prop]; + return res; + } + if (!(prop in stubs)) { + var resolved; + stubs[prop] = (...args2) => { + resolved ||= resolveSymbol(prop); + return resolved(...args2); + }; + } + return stubs[prop]; + } + }; + var proxy = new Proxy({}, proxyHandler); + var info = { + "GOT.mem": new Proxy({}, GOTHandler), + "GOT.func": new Proxy({}, GOTHandler), + "env": proxy, + "wasi_snapshot_preview1": proxy + }; + function postInstantiation(module, instance) { + updateTableMap(tableBase, metadata.tableSize); + moduleExports = relocateExports(instance.exports, memoryBase); + if (!flags.allowUndefined) { + reportUndefinedSymbols(); + } + function addEmAsm(addr, body) { + var args = []; + var arity = 0; + for (; arity < 16; arity++) { + if (body.indexOf("$" + arity) != -1) { + args.push("$" + arity); + } else { + break; + } + } + args = args.join(","); + var func = `(${args}) => { ${body} };`; + ASM_CONSTS[start] = eval(func); + } + __name(addEmAsm, "addEmAsm"); + if ("__start_em_asm" in moduleExports) { + var start = moduleExports["__start_em_asm"]; + var stop = moduleExports["__stop_em_asm"]; + while (start < stop) { + var jsString = UTF8ToString(start); + addEmAsm(start, jsString); + start = HEAPU8.indexOf(0, start) + 1; + } + } + function addEmJs(name, cSig, body) { + var jsArgs = []; + cSig = cSig.slice(1, -1); + if (cSig != "void") { + cSig = cSig.split(","); + for (var i in cSig) { + var jsArg = cSig[i].split(" ").pop(); + jsArgs.push(jsArg.replace("*", "")); + } + } + var func = `(${jsArgs}) => ${body};`; + moduleExports[name] = eval(func); + } + __name(addEmJs, "addEmJs"); + for (var name in moduleExports) { + if (name.startsWith("__em_js__")) { + var start = moduleExports[name]; + var jsString = UTF8ToString(start); + var parts = jsString.split("<::>"); + addEmJs(name.replace("__em_js__", ""), parts[0], parts[1]); + delete moduleExports[name]; + } + } + var applyRelocs = moduleExports["__wasm_apply_data_relocs"]; + if (applyRelocs) { + if (runtimeInitialized) { + applyRelocs(); + } else { + __RELOC_FUNCS__.push(applyRelocs); + } + } + var init = moduleExports["__wasm_call_ctors"]; + if (init) { + if (runtimeInitialized) { + init(); + } else { + addOnPostCtor(init); + } + } + return moduleExports; + } + __name(postInstantiation, "postInstantiation"); + if (flags.loadAsync) { + if (binary instanceof WebAssembly.Module) { + var instance = new WebAssembly.Instance(binary, info); + return Promise.resolve(postInstantiation(binary, instance)); + } + return WebAssembly.instantiate(binary, info).then((result) => postInstantiation(result.module, result.instance)); + } + var module = binary instanceof WebAssembly.Module ? binary : new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module, info); + return postInstantiation(module, instance); + } + __name(loadModule, "loadModule"); + if (flags.loadAsync) { + return metadata.neededDynlibs.reduce((chain, dynNeeded) => chain.then(() => loadDynamicLibrary(dynNeeded, flags, localScope)), Promise.resolve()).then(loadModule); + } + metadata.neededDynlibs.forEach((needed) => loadDynamicLibrary(needed, flags, localScope)); + return loadModule(); + }, "loadWebAssemblyModule"); + var mergeLibSymbols = /* @__PURE__ */ __name((exports, libName2) => { + for (var [sym, exp] of Object.entries(exports)) { + const setImport = /* @__PURE__ */ __name((target) => { + if (!isSymbolDefined(target)) { + wasmImports[target] = exp; + } + }, "setImport"); + setImport(sym); + const main_alias = "__main_argc_argv"; + if (sym == "main") { + setImport(main_alias); + } + if (sym == main_alias) { + setImport("main"); + } + } + }, "mergeLibSymbols"); + var asyncLoad = /* @__PURE__ */ __name(async (url) => { + var arrayBuffer = await readAsync(url); + return new Uint8Array(arrayBuffer); + }, "asyncLoad"); + function loadDynamicLibrary(libName2, flags2 = { + global: true, + nodelete: true + }, localScope2, handle2) { + var dso = LDSO.loadedLibsByName[libName2]; + if (dso) { + if (!flags2.global) { + if (localScope2) { + Object.assign(localScope2, dso.exports); + } + } else if (!dso.global) { + dso.global = true; + mergeLibSymbols(dso.exports, libName2); + } + if (flags2.nodelete && dso.refcount !== Infinity) { + dso.refcount = Infinity; + } + dso.refcount++; + if (handle2) { + LDSO.loadedLibsByHandle[handle2] = dso; + } + return flags2.loadAsync ? Promise.resolve(true) : true; + } + dso = newDSO(libName2, handle2, "loading"); + dso.refcount = flags2.nodelete ? Infinity : 1; + dso.global = flags2.global; + function loadLibData() { + if (handle2) { + var data = LE_HEAP_LOAD_U32((handle2 + 28 >> 2) * 4); + var dataSize = LE_HEAP_LOAD_U32((handle2 + 32 >> 2) * 4); + if (data && dataSize) { + var libData = HEAP8.slice(data, data + dataSize); + return flags2.loadAsync ? Promise.resolve(libData) : libData; + } + } + var libFile = locateFile(libName2); + if (flags2.loadAsync) { + return asyncLoad(libFile); + } + if (!readBinary) { + throw new Error(`${libFile}: file not found, and synchronous loading of external files is not available`); + } + return readBinary(libFile); + } + __name(loadLibData, "loadLibData"); + function getExports() { + if (flags2.loadAsync) { + return loadLibData().then((libData) => loadWebAssemblyModule(libData, flags2, libName2, localScope2, handle2)); + } + return loadWebAssemblyModule(loadLibData(), flags2, libName2, localScope2, handle2); + } + __name(getExports, "getExports"); + function moduleLoaded(exports) { + if (dso.global) { + mergeLibSymbols(exports, libName2); + } else if (localScope2) { + Object.assign(localScope2, exports); + } + dso.exports = exports; + } + __name(moduleLoaded, "moduleLoaded"); + if (flags2.loadAsync) { + return getExports().then((exports) => { + moduleLoaded(exports); + return true; + }); + } + moduleLoaded(getExports()); + return true; + } + __name(loadDynamicLibrary, "loadDynamicLibrary"); + var reportUndefinedSymbols = /* @__PURE__ */ __name(() => { + for (var [symName, entry] of Object.entries(GOT)) { + if (entry.value == 0) { + var value = resolveGlobalSymbol(symName, true).sym; + if (!value && !entry.required) { + continue; + } + if (typeof value == "function") { + entry.value = addFunction(value, value.sig); + } else if (typeof value == "number") { + entry.value = value; + } else { + throw new Error(`bad export type for '${symName}': ${typeof value}`); + } + } + } + }, "reportUndefinedSymbols"); + var loadDylibs = /* @__PURE__ */ __name(() => { + if (!dynamicLibraries.length) { + reportUndefinedSymbols(); + return; + } + addRunDependency("loadDylibs"); + dynamicLibraries.reduce((chain, lib) => chain.then(() => loadDynamicLibrary(lib, { + loadAsync: true, + global: true, + nodelete: true, + allowUndefined: true + })), Promise.resolve()).then(() => { + reportUndefinedSymbols(); + removeRunDependency("loadDylibs"); + }); + }, "loadDylibs"); + var noExitRuntime = Module["noExitRuntime"] || true; + function setValue(ptr, value, type = "i8") { + if (type.endsWith("*")) type = "*"; + switch (type) { + case "i1": + HEAP8[ptr] = value; + break; + case "i8": + HEAP8[ptr] = value; + break; + case "i16": + LE_HEAP_STORE_I16((ptr >> 1) * 2, value); + break; + case "i32": + LE_HEAP_STORE_I32((ptr >> 2) * 4, value); + break; + case "i64": + HEAP64[ptr >> 3] = BigInt(value); + break; + case "float": + LE_HEAP_STORE_F32((ptr >> 2) * 4, value); + break; + case "double": + LE_HEAP_STORE_F64((ptr >> 3) * 8, value); + break; + case "*": + LE_HEAP_STORE_U32((ptr >> 2) * 4, value); + break; + default: + abort(`invalid type for setValue: ${type}`); + } + } + __name(setValue, "setValue"); + var ___memory_base = new WebAssembly.Global({ + "value": "i32", + "mutable": false + }, 1024); + var ___stack_pointer = new WebAssembly.Global({ + "value": "i32", + "mutable": true + }, 78224); + var ___table_base = new WebAssembly.Global({ + "value": "i32", + "mutable": false + }, 1); + var __abort_js = /* @__PURE__ */ __name(() => abort(""), "__abort_js"); + __abort_js.sig = "v"; + var _emscripten_get_now = /* @__PURE__ */ __name(() => performance.now(), "_emscripten_get_now"); + _emscripten_get_now.sig = "d"; + var _emscripten_date_now = /* @__PURE__ */ __name(() => Date.now(), "_emscripten_date_now"); + _emscripten_date_now.sig = "d"; + var nowIsMonotonic = 1; + var checkWasiClock = /* @__PURE__ */ __name((clock_id) => clock_id >= 0 && clock_id <= 3, "checkWasiClock"); + var INT53_MAX = 9007199254740992; + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = /* @__PURE__ */ __name((num) => num < INT53_MIN || num > INT53_MAX ? NaN : Number(num), "bigintToI53Checked"); + function _clock_time_get(clk_id, ignored_precision, ptime) { + ignored_precision = bigintToI53Checked(ignored_precision); + if (!checkWasiClock(clk_id)) { + return 28; + } + var now; + if (clk_id === 0) { + now = _emscripten_date_now(); + } else if (nowIsMonotonic) { + now = _emscripten_get_now(); + } else { + return 52; + } + var nsec = Math.round(now * 1e3 * 1e3); + HEAP64[ptime >> 3] = BigInt(nsec); + return 0; + } + __name(_clock_time_get, "_clock_time_get"); + _clock_time_get.sig = "iijp"; + var getHeapMax = /* @__PURE__ */ __name(() => ( + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + 2147483648 + ), "getHeapMax"); + var growMemory = /* @__PURE__ */ __name((size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) { + } + }, "growMemory"); + var _emscripten_resize_heap = /* @__PURE__ */ __name((requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }, "_emscripten_resize_heap"); + _emscripten_resize_heap.sig = "ip"; + var _fd_close = /* @__PURE__ */ __name((fd) => 52, "_fd_close"); + _fd_close.sig = "ii"; + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + return 70; + } + __name(_fd_seek, "_fd_seek"); + _fd_seek.sig = "iijip"; + var printCharBuffers = [null, [], []]; + var printChar = /* @__PURE__ */ __name((stream, curr) => { + var buffer = printCharBuffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }, "printChar"); + var flush_NO_FILESYSTEM = /* @__PURE__ */ __name(() => { + if (printCharBuffers[1].length) printChar(1, 10); + if (printCharBuffers[2].length) printChar(2, 10); + }, "flush_NO_FILESYSTEM"); + var SYSCALLS = { + varargs: void 0, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + } + }; + var _fd_write = /* @__PURE__ */ __name((fd, iov, iovcnt, pnum) => { + var num = 0; + for (var i2 = 0; i2 < iovcnt; i2++) { + var ptr = LE_HEAP_LOAD_U32((iov >> 2) * 4); + var len = LE_HEAP_LOAD_U32((iov + 4 >> 2) * 4); + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + LE_HEAP_STORE_U32((pnum >> 2) * 4, num); + return 0; + }, "_fd_write"); + _fd_write.sig = "iippp"; + function _tree_sitter_log_callback(isLexMessage, messageAddress) { + if (Module.currentLogCallback) { + const message = UTF8ToString(messageAddress); + Module.currentLogCallback(message, isLexMessage !== 0); + } + } + __name(_tree_sitter_log_callback, "_tree_sitter_log_callback"); + function _tree_sitter_parse_callback(inputBufferAddress, index, row, column, lengthAddress) { + const INPUT_BUFFER_SIZE = 10 * 1024; + const string = Module.currentParseCallback(index, { + row, + column + }); + if (typeof string === "string") { + setValue(lengthAddress, string.length, "i32"); + stringToUTF16(string, inputBufferAddress, INPUT_BUFFER_SIZE); + } else { + setValue(lengthAddress, 0, "i32"); + } + } + __name(_tree_sitter_parse_callback, "_tree_sitter_parse_callback"); + function _tree_sitter_progress_callback(currentOffset, hasError) { + if (Module.currentProgressCallback) { + return Module.currentProgressCallback({ + currentOffset, + hasError + }); + } + return false; + } + __name(_tree_sitter_progress_callback, "_tree_sitter_progress_callback"); + function _tree_sitter_query_progress_callback(currentOffset) { + if (Module.currentQueryProgressCallback) { + return Module.currentQueryProgressCallback({ + currentOffset + }); + } + return false; + } + __name(_tree_sitter_query_progress_callback, "_tree_sitter_query_progress_callback"); + var runtimeKeepaliveCounter = 0; + var keepRuntimeAlive = /* @__PURE__ */ __name(() => noExitRuntime || runtimeKeepaliveCounter > 0, "keepRuntimeAlive"); + var _proc_exit = /* @__PURE__ */ __name((code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }, "_proc_exit"); + _proc_exit.sig = "vi"; + var exitJS = /* @__PURE__ */ __name((status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }, "exitJS"); + var handleException = /* @__PURE__ */ __name((e) => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }, "handleException"); + var lengthBytesUTF8 = /* @__PURE__ */ __name((str) => { + var len = 0; + for (var i2 = 0; i2 < str.length; ++i2) { + var c = str.charCodeAt(i2); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i2; + } else { + len += 3; + } + } + return len; + }, "lengthBytesUTF8"); + var stringToUTF8Array = /* @__PURE__ */ __name((str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i2 = 0; i2 < str.length; ++i2) { + var u = str.charCodeAt(i2); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i2); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }, "stringToUTF8Array"); + var stringToUTF8 = /* @__PURE__ */ __name((str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite), "stringToUTF8"); + var stackAlloc = /* @__PURE__ */ __name((sz) => __emscripten_stack_alloc(sz), "stackAlloc"); + var stringToUTF8OnStack = /* @__PURE__ */ __name((str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }, "stringToUTF8OnStack"); + var AsciiToString = /* @__PURE__ */ __name((ptr) => { + var str = ""; + while (1) { + var ch = HEAPU8[ptr++]; + if (!ch) return str; + str += String.fromCharCode(ch); + } + }, "AsciiToString"); + var stringToUTF16 = /* @__PURE__ */ __name((str, outPtr, maxBytesToWrite) => { + maxBytesToWrite ??= 2147483647; + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; + var startPtr = outPtr; + var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; + for (var i2 = 0; i2 < numCharsToWrite; ++i2) { + var codeUnit = str.charCodeAt(i2); + LE_HEAP_STORE_I16((outPtr >> 1) * 2, codeUnit); + outPtr += 2; + } + LE_HEAP_STORE_I16((outPtr >> 1) * 2, 0); + return outPtr - startPtr; + }, "stringToUTF16"); + var wasmImports = { + /** @export */ + __heap_base: ___heap_base, + /** @export */ + __indirect_function_table: wasmTable, + /** @export */ + __memory_base: ___memory_base, + /** @export */ + __stack_pointer: ___stack_pointer, + /** @export */ + __table_base: ___table_base, + /** @export */ + _abort_js: __abort_js, + /** @export */ + clock_time_get: _clock_time_get, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write, + /** @export */ + memory: wasmMemory, + /** @export */ + tree_sitter_log_callback: _tree_sitter_log_callback, + /** @export */ + tree_sitter_parse_callback: _tree_sitter_parse_callback, + /** @export */ + tree_sitter_progress_callback: _tree_sitter_progress_callback, + /** @export */ + tree_sitter_query_progress_callback: _tree_sitter_query_progress_callback + }; + var wasmExports = await createWasm(); + var ___wasm_call_ctors = wasmExports["__wasm_call_ctors"]; + var _malloc = Module["_malloc"] = wasmExports["malloc"]; + var _calloc = Module["_calloc"] = wasmExports["calloc"]; + var _realloc = Module["_realloc"] = wasmExports["realloc"]; + var _free = Module["_free"] = wasmExports["free"]; + var _memcmp = Module["_memcmp"] = wasmExports["memcmp"]; + var _ts_language_symbol_count = Module["_ts_language_symbol_count"] = wasmExports["ts_language_symbol_count"]; + var _ts_language_state_count = Module["_ts_language_state_count"] = wasmExports["ts_language_state_count"]; + var _ts_language_version = Module["_ts_language_version"] = wasmExports["ts_language_version"]; + var _ts_language_abi_version = Module["_ts_language_abi_version"] = wasmExports["ts_language_abi_version"]; + var _ts_language_metadata = Module["_ts_language_metadata"] = wasmExports["ts_language_metadata"]; + var _ts_language_name = Module["_ts_language_name"] = wasmExports["ts_language_name"]; + var _ts_language_field_count = Module["_ts_language_field_count"] = wasmExports["ts_language_field_count"]; + var _ts_language_next_state = Module["_ts_language_next_state"] = wasmExports["ts_language_next_state"]; + var _ts_language_symbol_name = Module["_ts_language_symbol_name"] = wasmExports["ts_language_symbol_name"]; + var _ts_language_symbol_for_name = Module["_ts_language_symbol_for_name"] = wasmExports["ts_language_symbol_for_name"]; + var _strncmp = Module["_strncmp"] = wasmExports["strncmp"]; + var _ts_language_symbol_type = Module["_ts_language_symbol_type"] = wasmExports["ts_language_symbol_type"]; + var _ts_language_field_name_for_id = Module["_ts_language_field_name_for_id"] = wasmExports["ts_language_field_name_for_id"]; + var _ts_lookahead_iterator_new = Module["_ts_lookahead_iterator_new"] = wasmExports["ts_lookahead_iterator_new"]; + var _ts_lookahead_iterator_delete = Module["_ts_lookahead_iterator_delete"] = wasmExports["ts_lookahead_iterator_delete"]; + var _ts_lookahead_iterator_reset_state = Module["_ts_lookahead_iterator_reset_state"] = wasmExports["ts_lookahead_iterator_reset_state"]; + var _ts_lookahead_iterator_reset = Module["_ts_lookahead_iterator_reset"] = wasmExports["ts_lookahead_iterator_reset"]; + var _ts_lookahead_iterator_next = Module["_ts_lookahead_iterator_next"] = wasmExports["ts_lookahead_iterator_next"]; + var _ts_lookahead_iterator_current_symbol = Module["_ts_lookahead_iterator_current_symbol"] = wasmExports["ts_lookahead_iterator_current_symbol"]; + var _ts_parser_delete = Module["_ts_parser_delete"] = wasmExports["ts_parser_delete"]; + var _ts_parser_reset = Module["_ts_parser_reset"] = wasmExports["ts_parser_reset"]; + var _ts_parser_set_language = Module["_ts_parser_set_language"] = wasmExports["ts_parser_set_language"]; + var _ts_parser_timeout_micros = Module["_ts_parser_timeout_micros"] = wasmExports["ts_parser_timeout_micros"]; + var _ts_parser_set_timeout_micros = Module["_ts_parser_set_timeout_micros"] = wasmExports["ts_parser_set_timeout_micros"]; + var _ts_parser_set_included_ranges = Module["_ts_parser_set_included_ranges"] = wasmExports["ts_parser_set_included_ranges"]; + var _ts_query_new = Module["_ts_query_new"] = wasmExports["ts_query_new"]; + var _ts_query_delete = Module["_ts_query_delete"] = wasmExports["ts_query_delete"]; + var _iswspace = Module["_iswspace"] = wasmExports["iswspace"]; + var _iswalnum = Module["_iswalnum"] = wasmExports["iswalnum"]; + var _ts_query_pattern_count = Module["_ts_query_pattern_count"] = wasmExports["ts_query_pattern_count"]; + var _ts_query_capture_count = Module["_ts_query_capture_count"] = wasmExports["ts_query_capture_count"]; + var _ts_query_string_count = Module["_ts_query_string_count"] = wasmExports["ts_query_string_count"]; + var _ts_query_capture_name_for_id = Module["_ts_query_capture_name_for_id"] = wasmExports["ts_query_capture_name_for_id"]; + var _ts_query_capture_quantifier_for_id = Module["_ts_query_capture_quantifier_for_id"] = wasmExports["ts_query_capture_quantifier_for_id"]; + var _ts_query_string_value_for_id = Module["_ts_query_string_value_for_id"] = wasmExports["ts_query_string_value_for_id"]; + var _ts_query_predicates_for_pattern = Module["_ts_query_predicates_for_pattern"] = wasmExports["ts_query_predicates_for_pattern"]; + var _ts_query_start_byte_for_pattern = Module["_ts_query_start_byte_for_pattern"] = wasmExports["ts_query_start_byte_for_pattern"]; + var _ts_query_end_byte_for_pattern = Module["_ts_query_end_byte_for_pattern"] = wasmExports["ts_query_end_byte_for_pattern"]; + var _ts_query_is_pattern_rooted = Module["_ts_query_is_pattern_rooted"] = wasmExports["ts_query_is_pattern_rooted"]; + var _ts_query_is_pattern_non_local = Module["_ts_query_is_pattern_non_local"] = wasmExports["ts_query_is_pattern_non_local"]; + var _ts_query_is_pattern_guaranteed_at_step = Module["_ts_query_is_pattern_guaranteed_at_step"] = wasmExports["ts_query_is_pattern_guaranteed_at_step"]; + var _ts_query_disable_capture = Module["_ts_query_disable_capture"] = wasmExports["ts_query_disable_capture"]; + var _ts_query_disable_pattern = Module["_ts_query_disable_pattern"] = wasmExports["ts_query_disable_pattern"]; + var _ts_tree_copy = Module["_ts_tree_copy"] = wasmExports["ts_tree_copy"]; + var _ts_tree_delete = Module["_ts_tree_delete"] = wasmExports["ts_tree_delete"]; + var _ts_init = Module["_ts_init"] = wasmExports["ts_init"]; + var _ts_parser_new_wasm = Module["_ts_parser_new_wasm"] = wasmExports["ts_parser_new_wasm"]; + var _ts_parser_enable_logger_wasm = Module["_ts_parser_enable_logger_wasm"] = wasmExports["ts_parser_enable_logger_wasm"]; + var _ts_parser_parse_wasm = Module["_ts_parser_parse_wasm"] = wasmExports["ts_parser_parse_wasm"]; + var _ts_parser_included_ranges_wasm = Module["_ts_parser_included_ranges_wasm"] = wasmExports["ts_parser_included_ranges_wasm"]; + var _ts_language_type_is_named_wasm = Module["_ts_language_type_is_named_wasm"] = wasmExports["ts_language_type_is_named_wasm"]; + var _ts_language_type_is_visible_wasm = Module["_ts_language_type_is_visible_wasm"] = wasmExports["ts_language_type_is_visible_wasm"]; + var _ts_language_supertypes_wasm = Module["_ts_language_supertypes_wasm"] = wasmExports["ts_language_supertypes_wasm"]; + var _ts_language_subtypes_wasm = Module["_ts_language_subtypes_wasm"] = wasmExports["ts_language_subtypes_wasm"]; + var _ts_tree_root_node_wasm = Module["_ts_tree_root_node_wasm"] = wasmExports["ts_tree_root_node_wasm"]; + var _ts_tree_root_node_with_offset_wasm = Module["_ts_tree_root_node_with_offset_wasm"] = wasmExports["ts_tree_root_node_with_offset_wasm"]; + var _ts_tree_edit_wasm = Module["_ts_tree_edit_wasm"] = wasmExports["ts_tree_edit_wasm"]; + var _ts_tree_included_ranges_wasm = Module["_ts_tree_included_ranges_wasm"] = wasmExports["ts_tree_included_ranges_wasm"]; + var _ts_tree_get_changed_ranges_wasm = Module["_ts_tree_get_changed_ranges_wasm"] = wasmExports["ts_tree_get_changed_ranges_wasm"]; + var _ts_tree_cursor_new_wasm = Module["_ts_tree_cursor_new_wasm"] = wasmExports["ts_tree_cursor_new_wasm"]; + var _ts_tree_cursor_copy_wasm = Module["_ts_tree_cursor_copy_wasm"] = wasmExports["ts_tree_cursor_copy_wasm"]; + var _ts_tree_cursor_delete_wasm = Module["_ts_tree_cursor_delete_wasm"] = wasmExports["ts_tree_cursor_delete_wasm"]; + var _ts_tree_cursor_reset_wasm = Module["_ts_tree_cursor_reset_wasm"] = wasmExports["ts_tree_cursor_reset_wasm"]; + var _ts_tree_cursor_reset_to_wasm = Module["_ts_tree_cursor_reset_to_wasm"] = wasmExports["ts_tree_cursor_reset_to_wasm"]; + var _ts_tree_cursor_goto_first_child_wasm = Module["_ts_tree_cursor_goto_first_child_wasm"] = wasmExports["ts_tree_cursor_goto_first_child_wasm"]; + var _ts_tree_cursor_goto_last_child_wasm = Module["_ts_tree_cursor_goto_last_child_wasm"] = wasmExports["ts_tree_cursor_goto_last_child_wasm"]; + var _ts_tree_cursor_goto_first_child_for_index_wasm = Module["_ts_tree_cursor_goto_first_child_for_index_wasm"] = wasmExports["ts_tree_cursor_goto_first_child_for_index_wasm"]; + var _ts_tree_cursor_goto_first_child_for_position_wasm = Module["_ts_tree_cursor_goto_first_child_for_position_wasm"] = wasmExports["ts_tree_cursor_goto_first_child_for_position_wasm"]; + var _ts_tree_cursor_goto_next_sibling_wasm = Module["_ts_tree_cursor_goto_next_sibling_wasm"] = wasmExports["ts_tree_cursor_goto_next_sibling_wasm"]; + var _ts_tree_cursor_goto_previous_sibling_wasm = Module["_ts_tree_cursor_goto_previous_sibling_wasm"] = wasmExports["ts_tree_cursor_goto_previous_sibling_wasm"]; + var _ts_tree_cursor_goto_descendant_wasm = Module["_ts_tree_cursor_goto_descendant_wasm"] = wasmExports["ts_tree_cursor_goto_descendant_wasm"]; + var _ts_tree_cursor_goto_parent_wasm = Module["_ts_tree_cursor_goto_parent_wasm"] = wasmExports["ts_tree_cursor_goto_parent_wasm"]; + var _ts_tree_cursor_current_node_type_id_wasm = Module["_ts_tree_cursor_current_node_type_id_wasm"] = wasmExports["ts_tree_cursor_current_node_type_id_wasm"]; + var _ts_tree_cursor_current_node_state_id_wasm = Module["_ts_tree_cursor_current_node_state_id_wasm"] = wasmExports["ts_tree_cursor_current_node_state_id_wasm"]; + var _ts_tree_cursor_current_node_is_named_wasm = Module["_ts_tree_cursor_current_node_is_named_wasm"] = wasmExports["ts_tree_cursor_current_node_is_named_wasm"]; + var _ts_tree_cursor_current_node_is_missing_wasm = Module["_ts_tree_cursor_current_node_is_missing_wasm"] = wasmExports["ts_tree_cursor_current_node_is_missing_wasm"]; + var _ts_tree_cursor_current_node_id_wasm = Module["_ts_tree_cursor_current_node_id_wasm"] = wasmExports["ts_tree_cursor_current_node_id_wasm"]; + var _ts_tree_cursor_start_position_wasm = Module["_ts_tree_cursor_start_position_wasm"] = wasmExports["ts_tree_cursor_start_position_wasm"]; + var _ts_tree_cursor_end_position_wasm = Module["_ts_tree_cursor_end_position_wasm"] = wasmExports["ts_tree_cursor_end_position_wasm"]; + var _ts_tree_cursor_start_index_wasm = Module["_ts_tree_cursor_start_index_wasm"] = wasmExports["ts_tree_cursor_start_index_wasm"]; + var _ts_tree_cursor_end_index_wasm = Module["_ts_tree_cursor_end_index_wasm"] = wasmExports["ts_tree_cursor_end_index_wasm"]; + var _ts_tree_cursor_current_field_id_wasm = Module["_ts_tree_cursor_current_field_id_wasm"] = wasmExports["ts_tree_cursor_current_field_id_wasm"]; + var _ts_tree_cursor_current_depth_wasm = Module["_ts_tree_cursor_current_depth_wasm"] = wasmExports["ts_tree_cursor_current_depth_wasm"]; + var _ts_tree_cursor_current_descendant_index_wasm = Module["_ts_tree_cursor_current_descendant_index_wasm"] = wasmExports["ts_tree_cursor_current_descendant_index_wasm"]; + var _ts_tree_cursor_current_node_wasm = Module["_ts_tree_cursor_current_node_wasm"] = wasmExports["ts_tree_cursor_current_node_wasm"]; + var _ts_node_symbol_wasm = Module["_ts_node_symbol_wasm"] = wasmExports["ts_node_symbol_wasm"]; + var _ts_node_field_name_for_child_wasm = Module["_ts_node_field_name_for_child_wasm"] = wasmExports["ts_node_field_name_for_child_wasm"]; + var _ts_node_field_name_for_named_child_wasm = Module["_ts_node_field_name_for_named_child_wasm"] = wasmExports["ts_node_field_name_for_named_child_wasm"]; + var _ts_node_children_by_field_id_wasm = Module["_ts_node_children_by_field_id_wasm"] = wasmExports["ts_node_children_by_field_id_wasm"]; + var _ts_node_first_child_for_byte_wasm = Module["_ts_node_first_child_for_byte_wasm"] = wasmExports["ts_node_first_child_for_byte_wasm"]; + var _ts_node_first_named_child_for_byte_wasm = Module["_ts_node_first_named_child_for_byte_wasm"] = wasmExports["ts_node_first_named_child_for_byte_wasm"]; + var _ts_node_grammar_symbol_wasm = Module["_ts_node_grammar_symbol_wasm"] = wasmExports["ts_node_grammar_symbol_wasm"]; + var _ts_node_child_count_wasm = Module["_ts_node_child_count_wasm"] = wasmExports["ts_node_child_count_wasm"]; + var _ts_node_named_child_count_wasm = Module["_ts_node_named_child_count_wasm"] = wasmExports["ts_node_named_child_count_wasm"]; + var _ts_node_child_wasm = Module["_ts_node_child_wasm"] = wasmExports["ts_node_child_wasm"]; + var _ts_node_named_child_wasm = Module["_ts_node_named_child_wasm"] = wasmExports["ts_node_named_child_wasm"]; + var _ts_node_child_by_field_id_wasm = Module["_ts_node_child_by_field_id_wasm"] = wasmExports["ts_node_child_by_field_id_wasm"]; + var _ts_node_next_sibling_wasm = Module["_ts_node_next_sibling_wasm"] = wasmExports["ts_node_next_sibling_wasm"]; + var _ts_node_prev_sibling_wasm = Module["_ts_node_prev_sibling_wasm"] = wasmExports["ts_node_prev_sibling_wasm"]; + var _ts_node_next_named_sibling_wasm = Module["_ts_node_next_named_sibling_wasm"] = wasmExports["ts_node_next_named_sibling_wasm"]; + var _ts_node_prev_named_sibling_wasm = Module["_ts_node_prev_named_sibling_wasm"] = wasmExports["ts_node_prev_named_sibling_wasm"]; + var _ts_node_descendant_count_wasm = Module["_ts_node_descendant_count_wasm"] = wasmExports["ts_node_descendant_count_wasm"]; + var _ts_node_parent_wasm = Module["_ts_node_parent_wasm"] = wasmExports["ts_node_parent_wasm"]; + var _ts_node_child_with_descendant_wasm = Module["_ts_node_child_with_descendant_wasm"] = wasmExports["ts_node_child_with_descendant_wasm"]; + var _ts_node_descendant_for_index_wasm = Module["_ts_node_descendant_for_index_wasm"] = wasmExports["ts_node_descendant_for_index_wasm"]; + var _ts_node_named_descendant_for_index_wasm = Module["_ts_node_named_descendant_for_index_wasm"] = wasmExports["ts_node_named_descendant_for_index_wasm"]; + var _ts_node_descendant_for_position_wasm = Module["_ts_node_descendant_for_position_wasm"] = wasmExports["ts_node_descendant_for_position_wasm"]; + var _ts_node_named_descendant_for_position_wasm = Module["_ts_node_named_descendant_for_position_wasm"] = wasmExports["ts_node_named_descendant_for_position_wasm"]; + var _ts_node_start_point_wasm = Module["_ts_node_start_point_wasm"] = wasmExports["ts_node_start_point_wasm"]; + var _ts_node_end_point_wasm = Module["_ts_node_end_point_wasm"] = wasmExports["ts_node_end_point_wasm"]; + var _ts_node_start_index_wasm = Module["_ts_node_start_index_wasm"] = wasmExports["ts_node_start_index_wasm"]; + var _ts_node_end_index_wasm = Module["_ts_node_end_index_wasm"] = wasmExports["ts_node_end_index_wasm"]; + var _ts_node_to_string_wasm = Module["_ts_node_to_string_wasm"] = wasmExports["ts_node_to_string_wasm"]; + var _ts_node_children_wasm = Module["_ts_node_children_wasm"] = wasmExports["ts_node_children_wasm"]; + var _ts_node_named_children_wasm = Module["_ts_node_named_children_wasm"] = wasmExports["ts_node_named_children_wasm"]; + var _ts_node_descendants_of_type_wasm = Module["_ts_node_descendants_of_type_wasm"] = wasmExports["ts_node_descendants_of_type_wasm"]; + var _ts_node_is_named_wasm = Module["_ts_node_is_named_wasm"] = wasmExports["ts_node_is_named_wasm"]; + var _ts_node_has_changes_wasm = Module["_ts_node_has_changes_wasm"] = wasmExports["ts_node_has_changes_wasm"]; + var _ts_node_has_error_wasm = Module["_ts_node_has_error_wasm"] = wasmExports["ts_node_has_error_wasm"]; + var _ts_node_is_error_wasm = Module["_ts_node_is_error_wasm"] = wasmExports["ts_node_is_error_wasm"]; + var _ts_node_is_missing_wasm = Module["_ts_node_is_missing_wasm"] = wasmExports["ts_node_is_missing_wasm"]; + var _ts_node_is_extra_wasm = Module["_ts_node_is_extra_wasm"] = wasmExports["ts_node_is_extra_wasm"]; + var _ts_node_parse_state_wasm = Module["_ts_node_parse_state_wasm"] = wasmExports["ts_node_parse_state_wasm"]; + var _ts_node_next_parse_state_wasm = Module["_ts_node_next_parse_state_wasm"] = wasmExports["ts_node_next_parse_state_wasm"]; + var _ts_query_matches_wasm = Module["_ts_query_matches_wasm"] = wasmExports["ts_query_matches_wasm"]; + var _ts_query_captures_wasm = Module["_ts_query_captures_wasm"] = wasmExports["ts_query_captures_wasm"]; + var _memset = Module["_memset"] = wasmExports["memset"]; + var _memcpy = Module["_memcpy"] = wasmExports["memcpy"]; + var _memmove = Module["_memmove"] = wasmExports["memmove"]; + var _iswalpha = Module["_iswalpha"] = wasmExports["iswalpha"]; + var _iswblank = Module["_iswblank"] = wasmExports["iswblank"]; + var _iswdigit = Module["_iswdigit"] = wasmExports["iswdigit"]; + var _iswlower = Module["_iswlower"] = wasmExports["iswlower"]; + var _iswupper = Module["_iswupper"] = wasmExports["iswupper"]; + var _iswxdigit = Module["_iswxdigit"] = wasmExports["iswxdigit"]; + var _memchr = Module["_memchr"] = wasmExports["memchr"]; + var _strlen = Module["_strlen"] = wasmExports["strlen"]; + var _strcmp = Module["_strcmp"] = wasmExports["strcmp"]; + var _strncat = Module["_strncat"] = wasmExports["strncat"]; + var _strncpy = Module["_strncpy"] = wasmExports["strncpy"]; + var _towlower = Module["_towlower"] = wasmExports["towlower"]; + var _towupper = Module["_towupper"] = wasmExports["towupper"]; + var _setThrew = wasmExports["setThrew"]; + var __emscripten_stack_restore = wasmExports["_emscripten_stack_restore"]; + var __emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"]; + var _emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"]; + var ___wasm_apply_data_relocs = wasmExports["__wasm_apply_data_relocs"]; + Module["setValue"] = setValue; + Module["getValue"] = getValue; + Module["UTF8ToString"] = UTF8ToString; + Module["stringToUTF8"] = stringToUTF8; + Module["lengthBytesUTF8"] = lengthBytesUTF8; + Module["AsciiToString"] = AsciiToString; + Module["stringToUTF16"] = stringToUTF16; + Module["loadWebAssemblyModule"] = loadWebAssemblyModule; + function callMain(args2 = []) { + var entryFunction = resolveGlobalSymbol("main").sym; + if (!entryFunction) return; + args2.unshift(thisProgram); + var argc = args2.length; + var argv = stackAlloc((argc + 1) * 4); + var argv_ptr = argv; + args2.forEach((arg) => { + LE_HEAP_STORE_U32((argv_ptr >> 2) * 4, stringToUTF8OnStack(arg)); + argv_ptr += 4; + }); + LE_HEAP_STORE_U32((argv_ptr >> 2) * 4, 0); + try { + var ret = entryFunction(argc, argv); + exitJS( + ret, + /* implicit = */ + true + ); + return ret; + } catch (e) { + return handleException(e); + } + } + __name(callMain, "callMain"); + function run(args2 = arguments_) { + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + preRun(); + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + function doRun() { + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + Module["onRuntimeInitialized"]?.(); + var noInitialRun = Module["noInitialRun"]; + if (!noInitialRun) callMain(args2); + postRun(); + } + __name(doRun, "doRun"); + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(() => { + setTimeout(() => Module["setStatus"](""), 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + __name(run, "run"); + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + moduleRtn = readyPromise; + return moduleRtn; + }; +})(); +var tree_sitter_default = Module2; + +// src/bindings.ts +var Module3 = null; +async function initializeBinding(moduleOptions) { + if (!Module3) { + Module3 = await tree_sitter_default(moduleOptions); + } + return Module3; +} +__name(initializeBinding, "initializeBinding"); +function checkModule() { + return !!Module3; +} +__name(checkModule, "checkModule"); + +// src/parser.ts +var TRANSFER_BUFFER; +var LANGUAGE_VERSION; +var MIN_COMPATIBLE_VERSION; +var Parser = class { + static { + __name(this, "Parser"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + [1] = 0; + // Internal handle for WASM + /** @internal */ + logCallback = null; + /** The parser's current language. */ + language = null; + /** + * This must always be called before creating a Parser. + * + * You can optionally pass in options to configure the WASM module, the most common + * one being `locateFile` to help the module find the `.wasm` file. + */ + static async init(moduleOptions) { + setModule(await initializeBinding(moduleOptions)); + TRANSFER_BUFFER = C._ts_init(); + LANGUAGE_VERSION = C.getValue(TRANSFER_BUFFER, "i32"); + MIN_COMPATIBLE_VERSION = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + } + /** + * Create a new parser. + */ + constructor() { + this.initialize(); + } + /** @internal */ + initialize() { + if (!checkModule()) { + throw new Error("cannot construct a Parser before calling `init()`"); + } + C._ts_parser_new_wasm(); + this[0] = C.getValue(TRANSFER_BUFFER, "i32"); + this[1] = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + } + /** Delete the parser, freeing its resources. */ + delete() { + C._ts_parser_delete(this[0]); + C._free(this[1]); + this[0] = 0; + this[1] = 0; + } + /** + * Set the language that the parser should use for parsing. + * + * If the language was not successfully assigned, an error will be thrown. + * This happens if the language was generated with an incompatible + * version of the Tree-sitter CLI. Check the language's version using + * {@link Language#version} and compare it to this library's + * {@link LANGUAGE_VERSION} and {@link MIN_COMPATIBLE_VERSION} constants. + */ + setLanguage(language) { + let address; + if (!language) { + address = 0; + this.language = null; + } else if (language.constructor === Language) { + address = language[0]; + const version = C._ts_language_version(address); + if (version < MIN_COMPATIBLE_VERSION || LANGUAGE_VERSION < version) { + throw new Error( + `Incompatible language version ${version}. Compatibility range ${MIN_COMPATIBLE_VERSION} through ${LANGUAGE_VERSION}.` + ); + } + this.language = language; + } else { + throw new Error("Argument must be a Language"); + } + C._ts_parser_set_language(this[0], address); + return this; + } + /** + * Parse a slice of UTF8 text. + * + * @param {string | ParseCallback} callback - The UTF8-encoded text to parse or a callback function. + * + * @param {Tree | null} [oldTree] - A previous syntax tree parsed from the same document. If the text of the + * document has changed since `oldTree` was created, then you must edit `oldTree` to match + * the new text using {@link Tree#edit}. + * + * @param {ParseOptions} [options] - Options for parsing the text. + * This can be used to set the included ranges, or a progress callback. + * + * @returns {Tree | null} A {@link Tree} if parsing succeeded, or `null` if: + * - The parser has not yet had a language assigned with {@link Parser#setLanguage}. + * - The progress callback returned true. + */ + parse(callback, oldTree, options) { + if (typeof callback === "string") { + C.currentParseCallback = (index) => callback.slice(index); + } else if (typeof callback === "function") { + C.currentParseCallback = callback; + } else { + throw new Error("Argument must be a string or a function"); + } + if (options?.progressCallback) { + C.currentProgressCallback = options.progressCallback; + } else { + C.currentProgressCallback = null; + } + if (this.logCallback) { + C.currentLogCallback = this.logCallback; + C._ts_parser_enable_logger_wasm(this[0], 1); + } else { + C.currentLogCallback = null; + C._ts_parser_enable_logger_wasm(this[0], 0); + } + let rangeCount = 0; + let rangeAddress = 0; + if (options?.includedRanges) { + rangeCount = options.includedRanges.length; + rangeAddress = C._calloc(rangeCount, SIZE_OF_RANGE); + let address = rangeAddress; + for (let i2 = 0; i2 < rangeCount; i2++) { + marshalRange(address, options.includedRanges[i2]); + address += SIZE_OF_RANGE; + } + } + const treeAddress = C._ts_parser_parse_wasm( + this[0], + this[1], + oldTree ? oldTree[0] : 0, + rangeAddress, + rangeCount + ); + if (!treeAddress) { + C.currentParseCallback = null; + C.currentLogCallback = null; + C.currentProgressCallback = null; + return null; + } + if (!this.language) { + throw new Error("Parser must have a language to parse"); + } + const result = new Tree(INTERNAL, treeAddress, this.language, C.currentParseCallback); + C.currentParseCallback = null; + C.currentLogCallback = null; + C.currentProgressCallback = null; + return result; + } + /** + * Instruct the parser to start the next parse from the beginning. + * + * If the parser previously failed because of a timeout, cancellation, + * or callback, then by default, it will resume where it left off on the + * next call to {@link Parser#parse} or other parsing functions. + * If you don't want to resume, and instead intend to use this parser to + * parse some other document, you must call `reset` first. + */ + reset() { + C._ts_parser_reset(this[0]); + } + /** Get the ranges of text that the parser will include when parsing. */ + getIncludedRanges() { + C._ts_parser_included_ranges_wasm(this[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } + /** + * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse} + * + * Get the duration in microseconds that parsing is allowed to take. + * + * This is set via {@link Parser#setTimeoutMicros}. + */ + getTimeoutMicros() { + return C._ts_parser_timeout_micros(this[0]); + } + /** + * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse} + * + * Set the maximum duration in microseconds that parsing should be allowed + * to take before halting. + * + * If parsing takes longer than this, it will halt early, returning `null`. + * See {@link Parser#parse} for more information. + */ + setTimeoutMicros(timeout) { + C._ts_parser_set_timeout_micros(this[0], 0, timeout); + } + /** Set the logging callback that a parser should use during parsing. */ + setLogger(callback) { + if (!callback) { + this.logCallback = null; + } else if (typeof callback !== "function") { + throw new Error("Logger callback must be a function"); + } else { + this.logCallback = callback; + } + return this; + } + /** Get the parser's current logger. */ + getLogger() { + return this.logCallback; + } +}; +export { + CaptureQuantifier, + LANGUAGE_VERSION, + Language, + LookaheadIterator, + MIN_COMPATIBLE_VERSION, + Node, + Parser, + Query, + Tree, + TreeCursor +}; +//# sourceMappingURL=tree-sitter.js.map diff --git a/src_web/lib/tree-sitter.wasm b/src_web/lib/tree-sitter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..54a7a110d3c5fdf7c7e7fc8e426530e2e230f634 GIT binary patch literal 205491 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%0A7Az>J6p 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 literal 0 HcmV?d00001 diff --git a/src_web/scripts_comfy/widgets.ts b/src_web/scripts_comfy/widgets.ts index 7607289..9b60049 100644 --- a/src_web/scripts_comfy/widgets.ts +++ b/src_web/scripts_comfy/widgets.ts @@ -1,19 +1,20 @@ import type {ComfyApp} from "@comfyorg/frontend"; import type {IWidget, LGraphNode} from "@comfyorg/litegraph"; +import type {IStringWidget, IComboWidget} from "@comfyorg/litegraph/dist/types/widgets"; -type ComfyWidgetFn = ( +type ComfyWidgetFn = ( node: LGraphNode, inputName: string, inputData: any, app: ComfyApp, -) => {widget: IWidget}; +) => {widget: WidgetType}; /** * A dummy ComfyWidgets that we can import from our code, which we'll rewrite later to the comfyui * hosted widgets.js */ export declare const ComfyWidgets: { - COMBO: ComfyWidgetFn; - STRING: ComfyWidgetFn; - [key: string]: ComfyWidgetFn; + COMBO: ComfyWidgetFn; + STRING: ComfyWidgetFn; + [key: string]: ComfyWidgetFn; }; diff --git a/src_web/typings/web-tree-sitter.d.ts b/src_web/typings/web-tree-sitter.d.ts new file mode 100644 index 0000000..87b3100 --- /dev/null +++ b/src_web/typings/web-tree-sitter.d.ts @@ -0,0 +1 @@ +import 'web-tree-sitter'; diff --git a/tsconfig.json b/tsconfig.json index 370ccf3..5394a0d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,8 +14,11 @@ // Theser are just vanity. Currently nothing else augments it but, if a dependency were to we // may need to change these. "@comfyorg/frontend": ["node_modules/@comfyorg/comfyui-frontend-types/index.d.ts"], + // Tree Sitter, for parsing python in js. + "web-tree-sitter": ["node_modules/web-tree-sitter/web-tree-sitter.d.ts"], "typings/*": ["src_web/typings/*"], "rgthree/common/*": ["src_web/common/*"], + "rgthree/lib/*": ["src_web/lib/*"], "node_modules": ["node_modules/*"], "scripts/*": ["src_web/scripts_comfy/*"], }, @@ -40,6 +43,7 @@ "noPropertyAccessFromIndexSignature": true, "allowUnusedLabels": true, "skipLibCheck": true, + "types": [] }, "include": [ "src_web/*.ts", "src_web/**/*.ts", "src_web/typings/index.d.ts", diff --git a/web/comfyui/constants.js b/web/comfyui/constants.js index 329c38f..b05bf4b 100644 --- a/web/comfyui/constants.js +++ b/web/comfyui/constants.js @@ -29,6 +29,7 @@ export const NodeTypesString = { POWER_PROMPT: addRgthree("Power Prompt"), POWER_PROMPT_SIMPLE: addRgthree("Power Prompt - Simple"), POWER_PUTER: addRgthree("Power Puter"), + POWER_CONDUCTOR: addRgthree("Power Conductor"), SDXL_EMPTY_LATENT_IMAGE: addRgthree("SDXL Empty Latent Image"), SDXL_POWER_PROMPT_POSITIVE: addRgthree("SDXL Power Prompt - Positive"), SDXL_POWER_PROMPT_NEGATIVE: addRgthree("SDXL Power Prompt - Simple / Negative"), @@ -42,13 +43,18 @@ export const NodeTypesString = { IMAGE_COMPARER: addRgthree("Image Comparer"), IMAGE_INSET_CROP: addRgthree("Image Inset Crop"), }; +const UNRELEASED_KEYS = { + [NodeTypesString.DYNAMIC_CONTEXT]: "dynamic_context", + [NodeTypesString.DYNAMIC_CONTEXT_SWITCH]: "dynamic_context", + [NodeTypesString.POWER_CONDUCTOR]: "power_conductor", +}; export function getNodeTypeStrings() { + const unreleasedKeys = Object.keys(UNRELEASED_KEYS); return Object.values(NodeTypesString) .map((i) => stripRgthree(i)) .filter((i) => { - if (i.startsWith("Dynamic Context") && - !CONFIG_SERVICE.getConfigValue("unreleased.dynamic_context.enabled")) { - return false; + if (unreleasedKeys.includes(i)) { + return !!CONFIG_SERVICE.getConfigValue(`unreleased.${UNRELEASED_KEYS[i]}.enabled`); } return true; }) diff --git a/web/comfyui/power_conductor.js b/web/comfyui/power_conductor.js new file mode 100644 index 0000000..a942a80 --- /dev/null +++ b/web/comfyui/power_conductor.js @@ -0,0 +1,453 @@ +import { app } from "../../scripts/app.js"; +import { RgthreeBaseVirtualNode } from "./base_node.js"; +import { RgthreeBetterButtonWidget } from "./utils_widgets.js"; +import { NodeTypesString } from "./constants.js"; +import { ComfyWidgets } from "../../scripts/widgets.js"; +import { SERVICE as CONFIG_SERVICE } from "./services/config_service.js"; +class RgthreePowerConductor extends RgthreeBaseVirtualNode { + constructor(title = RgthreePowerConductor.title) { + super(title); + this.comfyClass = NodeTypesString.POWER_CONDUCTOR; + this.codeWidget = ComfyWidgets.STRING(this, "", ["STRING", { multiline: true }], app).widget; + this.addCustomWidget(this.codeWidget); + (this.buttonWidget = new RgthreeBetterButtonWidget("Run", (...args) => { + this.execute(); + })), + this.addCustomWidget(this.buttonWidget); + this.onConstructed(); + } + execute() { + const executor = new Executor(); + executor.execute(this.codeWidget.value); + } +} +RgthreePowerConductor.title = NodeTypesString.POWER_CONDUCTOR; +RgthreePowerConductor.type = NodeTypesString.POWER_CONDUCTOR; +const NODE_CLASS = RgthreePowerConductor; +let parser = null; +async function getParser() { + if (parser) { + return parser; + } + const TreeSitter = (await import("../../rgthree/lib/tree-sitter.js")); + await TreeSitter.Parser.init(); + const lang = await TreeSitter.Language.load("rgthree/lib/tree-sitter-python.wasm"); + parser = new TreeSitter.Parser(); + parser.setLanguage(lang); + return parser; +} +async function parse(code) { + parser = await getParser(); + return parser.parse(code); +} +function check(value, msg = "") { + if (!value) { + throw new Error(msg || "Error"); + } +} +class PyTuple { + constructor(...args) { + if (args.length === 1 && args[0] instanceof PyTuple) { + args = args[0].__unwrap__(); + } + this.list = [...args]; + } + count(v) { + } + index() { + } + __unwrap__() { + var _a; + const l = [...this.list]; + for (let i = 0; i < l.length; i++) { + l[i] = ((_a = l[i]) === null || _a === void 0 ? void 0 : _a.__unwrap__) ? l[i].__unwrap__() : l[i]; + } + return l; + } + __len__() { + return this.list.length; + } + __add__(v) { + if (!(v instanceof PyTuple)) { + throw new Error("Can only concatenate tuple to tuple."); + } + return new PyTuple(this.__unwrap__().concat(v.__unwrap__())); + } +} +class PyList extends PyTuple { + append(...args) { + this.list.push(...args); + } + clear() { + this.list.length = 0; + } + insert() { + } + pop() { + } + remove() { + } + reverse() { + } + sort() { + } + __add__(v) { + if (!(v instanceof PyList)) { + throw new Error("Can only concatenate list to list."); + } + return new PyList(this.__unwrap__().concat(v.__unwrap__())); + } +} +class PyInt { +} +function __unwrap__(...args) { + var _a; + for (let i = 0; i < args.length; i++) { + args[i] = ((_a = args[i]) === null || _a === void 0 ? void 0 : _a.__unwrap__) ? args[i].__unwrap__() : args[i]; + } + return args; +} +const BUILT_INS = new Map([ + ["round", (n) => Math.round(Number(n))], + ["floor", (n) => Math.floor(Number(n))], + ["ceil", (n) => Math.ceil(Number(n))], + ["len", (n) => { var _a, _b; return (_a = n === null || n === void 0 ? void 0 : n.length) !== null && _a !== void 0 ? _a : (_b = n === null || n === void 0 ? void 0 : n.__len__) === null || _b === void 0 ? void 0 : _b.call(n); }], + ["print", (...args) => console.log(...__unwrap__(...args))], + ["log", (...args) => console.log(...__unwrap__(...args))], + ["int", (n) => Math.floor(Number(n))], + ["float", Number], + ["list", (...args) => new PyList(...args)], + ["tuple", (...args) => new PyTuple([...args])], +]); +class SimpleNode { + constructor(node) { + this.type = node.type; + this.text = node.text; + if (this.type === "ERROR") { + throw new Error(`Error found in parsing near "${this.text}"`); + } + this.children = []; + for (const child of node.children) { + this.children.push(new SimpleNode(child)); + } + this.node = node; + } + child(index) { + const child = this.children[index]; + if (!child) + throw Error(`No child at index ${index}.`); + return child; + } + log(tab = "", showNode = false) { + console.log(`${tab}--- SimpleNode`); + console.log(`${tab} type: ${this.type}`); + console.log(`${tab} text: ${this.text}`); + console.log(`${tab} children:`, this.children); + if (showNode) { + console.log(`${tab} node:`, this.node); + } + } +} +class Executor { + constructor(ctx = null) { + this.typeToHandler = new Map([ + ["module", this.handleChildren.bind(this)], + ["expression_statement", this.handleChildren.bind(this)], + ["comment", this.handleSwallow.bind(this)], + ["return_statement", this.handleReturn.bind(this)], + ["assignment", this.handleAssignment.bind(this)], + ["named_expression", this.handleNamedExpression.bind(this)], + ["identifier", this.handleIdentifier.bind(this)], + ["attribute", this.handleAttribute.bind(this)], + ["call", this.handleCall.bind(this)], + ["argument_list", this.handleArgumentsList.bind(this)], + ["list_comprehension", this.handleListComprehension.bind(this)], + ["comparison_operator", this.handleComparisonOperator.bind(this)], + ["boolean_operator", this.handleBooleanOperator.bind(this)], + ["not_operator", this.handleNotOperator.bind(this)], + ["binary_operator", this.handleBinaryOperator.bind(this)], + ["integer", this.handleNumber.bind(this)], + ["float", this.handleNumber.bind(this)], + ["string", this.handleString.bind(this)], + ["tuple", this.handleList.bind(this)], + ["list", this.handleList.bind(this)], + ["dictionary", this.handleDictionary.bind(this)], + ["pair", this.handleDictionaryPair.bind(this)], + ]); + this.ctx = {}; + this.ctxInitial = {}; + this.isEvaluating = false; + this.ctxInitial = ctx || {}; + } + async execute(code) { + var _a, _b; + if (this.isEvaluating) { + console.log("Already executing..."); + return; + } + this.isEvaluating = true; + const root = (await parse(code)).rootNode; + this.ctx = !!window.structuredClone ? structuredClone(this.ctxInitial) : { ...this.ctxInitial }; + const value = await this.handleNode(new SimpleNode(root), this.ctx); + console.log("====="); + console.log(`value`, (_b = (_a = value === null || value === void 0 ? void 0 : value.__unwrap__) === null || _a === void 0 ? void 0 : _a.call(value)) !== null && _b !== void 0 ? _b : value); + console.log("context", this.ctx); + } + async handleNode(node, ctx, tab = "") { + var _a, _b; + const type = node.type; + if (ctx.hasOwnProperty("__returned__")) + return ctx["__returned__"]; + console.log(`${tab}-----`); + console.log(`${tab}eval_node`); + console.log(`${tab}type: ${type}`); + console.log(`${tab}text: ${node.text}`); + console.log(`${tab}children: ${(_b = (_a = node.children) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0}`); + console.log(ctx); + console.log(node); + const handler = this.typeToHandler.get(type); + check(handler, "Unhandled type: " + type); + return handler(node, ctx, tab); + } + async handleSwallow(node, ctx = this.ctx, tab = "") { + } + async handleReturn(node, ctx = this.ctx, tab = "") { + const value = node.children.length > 1 ? this.handleNode(node.child(1), ctx, tab) : undefined; + ctx["__returned__"] = value; + return value; + } + async handleChildren(node, ctx = this.ctx, tab = "") { + let lastValue = null; + for (const child of node.children) { + if (!child) + continue; + lastValue = await this.handleNode(child, ctx, tab + " "); + } + return lastValue; + } + async handleIdentifier(node, ctx = this.ctx, tab = "") { + let value = ctx[node.text]; + if (!value) { + value = BUILT_INS.get(node.text); + } + return value; + } + async handleAttribute(node, ctx = this.ctx, tab = "") { + var _a; + check(node.children.length === 3, "Expected 3 children for attr, identifier/attr, period, and identifier."); + const inst = await this.handleNode(node.child(0), ctx, tab); + check(((_a = node.child(1)) === null || _a === void 0 ? void 0 : _a.text) === ".", "Expected period separating parts of attribute."); + const attr = node.child(2).text; + check(!attr.startsWith("__") && !attr.endsWith("__"), `"${attr}" is not accessible.`); + let attribute = inst[attr]; + check(attribute !== undefined, `"${attr}" not found on instance of type ${typeof inst}.`); + return typeof attribute === "function" ? attribute.bind(inst) : attribute; + } + async handleAssignment(node, ctx, tab = "") { + const vars = []; + let value = null; + for (const child of node.children) { + if (!child) + continue; + if (child.type === "identifier") { + vars.push(child.text); + } + else if (child.type === "=") { + continue; + } + else { + value = await this.handleNode(child, ctx, tab + " "); + } + } + check(vars.length, "No vars for assignment"); + check(vars.length === 1, "Not yet handling multiple vars"); + ctx[vars[0]] = value; + return value; + } + async handleNamedExpression(node, ctx, tab = "") { + check(node.children.length === 3, "Expected three children for named expression."); + check(node.child(0).type === "identifier", "Expected identifier first in named expression."); + const varName = node.child(0).text; + ctx[varName] = await this.handleNode(node.child(2), ctx, tab); + return ctx[varName]; + } + async handleCall(node, ctx, tab = "") { + check(node.children.length === 2, "Expected 2 children for call, identifier and arguments."); + const fn = await this.handleNode(node.children[0], ctx, tab); + const args = await this.handleNode(node.children[1], ctx, tab); + console.log("handleCall", fn, args); + return fn(...args); + } + async handleArgumentsList(node, ctx, tab = "") { + return [(await this.handleList(node, ctx, tab)).__unwrap__()]; + } + async handleListComprehension(node, ctx, tab = "") { + const finalList = new PyList(); + const newCtx = { ...ctx }; + let finalEntryNode; + const loopNodes = []; + for (const child of node.children) { + if (!child || ["[", "]"].includes(child.type)) + continue; + if (child.type === "identifier" || child.type === "attribute") { + if (finalEntryNode) { + throw Error("Already have a list comprehension finalEntryNode."); + } + finalEntryNode = child; + } + else if (child.type === "for_in_clause") { + loopNodes.push({ forIn: child }); + } + else if (child.type === "if_clause") { + loopNodes[loopNodes.length - 1]["if"] = child; + } + } + if (!finalEntryNode) { + throw Error("No list comprehension finalEntryNode."); + } + console.log(`${tab}handleListComprehension.loopNodes`, loopNodes); + const handleLoop = async (loopNodes) => { + const loopNode = loopNodes.shift(); + console.log(`${tab}handleLoop`, loopNode); + const identifierNode = loopNode.forIn.child(1); + check(identifierNode.type === "identifier"); + const loopId = identifierNode.text; + const iterable = (await this.handleNode(loopNode.forIn.child(3), newCtx, tab)).__unwrap__(); + console.log(`${tab}handleLoop.iterable`, iterable); + for (const item of iterable) { + const ifCtx = { ...newCtx }; + ifCtx[loopId] = item; + if (loopNode.if) { + const ifNode = loopNode.if; + check(ifNode.children.length === 2, "Expected 2 children for if_clause."); + check(ifNode.child(0).text === "if", "Expected first child to be 'if'."); + const good = await this.handleNode(ifNode.child(1), ifCtx, tab); + if (!good) + continue; + } + Object.assign(newCtx, ifCtx); + if (loopNodes.length) { + await handleLoop(loopNodes); + } + else { + finalList.append(await this.handleNode(finalEntryNode, newCtx, tab)); + } + } + loopNodes.unshift(loopNode); + }; + await handleLoop(loopNodes); + return finalList; + } + async handleNumber(node, ctx = this.ctx, tab = "") { + return Number(node.text); + } + async handleString(node, ctx = this.ctx, tab = "") { + check(node.children.length === 3, "Expected 3 children for str (quotes and value)."); + return String(node.child(1).text); + } + async handleList(node, ctx = this.ctx, tab = "") { + const list = []; + for (const child of node.children) { + if (!child || ["(", "[", ",", "]", ")"].includes(child.type)) + continue; + list.push(await this.handleNode(child, ctx, tab + " ")); + } + if (node.type === "tuple") { + return new PyTuple(...list); + } + return new PyList(...list); + } + async handleComparisonOperator(node, ctx = this.ctx, tab = "") { + const op = node.child(1).text; + const left = await this.handleNode(node.child(0), ctx, tab); + const right = await this.handleNode(node.child(2), ctx, tab); + if (op === "==") + return left === right; + if (op === "!=") + return left !== right; + if (op === ">") + return left > right; + if (op === ">=") + return left >= right; + if (op === "<") + return left < right; + if (op === "<=") + return left <= right; + if (op === "in") + return (right.__unwrap__ ? right.__unwrap__() : right).includes(left); + throw new Error(`Comparison not handled: "${op}"`); + } + async handleBooleanOperator(node, ctx = this.ctx, tab = "") { + const op = node.child(1).text; + const left = await this.handleNode(node.child(0), ctx, tab); + if (!left && op === "or") + return left; + const right = await this.handleNode(node.child(2), ctx, tab); + if (op === "and") + return left && right; + if (op === "or") + return left || right; + } + async handleNotOperator(node, ctx = this.ctx, tab = "") { + check(node.children.length === 2, "Expected 2 children for not operator."); + check(node.child(0).text === "not", "Expected first child to be 'not'."); + const value = await this.handleNode(node.child(1), ctx, tab); + return !value; + } + async handleBinaryOperator(node, ctx = this.ctx, tab = "") { + const op = node.child(1).text; + const left = await this.handleNode(node.child(0), ctx, tab); + const right = await this.handleNode(node.child(2), ctx, tab); + if (left.constructor !== right.constructor) { + throw new Error(`Can only run ${op} operator on same type.`); + } + if (op === "+") + return left.__add__ ? left.__add__(right) : left + right; + if (op === "-") + return left - right; + if (op === "/") + return left / right; + if (op === "//") + return Math.floor(left / right); + if (op === "*") + return left * right; + if (op === "%") + return left % right; + if (op === "&") + return left & right; + if (op === "|") + return left | right; + if (op === "^") + return left ^ right; + if (op === "<<") + return left << right; + if (op === ">>") + return left >> right; + throw new Error(`Comparison not handled: "${op}"`); + } + async handleDictionary(node, ctx = this.ctx, tab = "") { + const dict = {}; + for (const child of node.children) { + if (!child || ["{", "}"].includes(child.type)) + continue; + const pair = await this.handleNode(child, ctx, tab + " "); + Object.assign(dict, pair); + } + return dict; + } + async handleDictionaryPair(node, ctx = this.ctx, tab = "") { + check(node.children.length === 3, "Expected 3 children for dict pair."); + let varName = await this.handleNode(node.child(0), ctx, tab + " "); + let varValue = await this.handleNode(node.child(2), ctx, tab + " "); + check(typeof varName === "string", "Expected varname to be string."); + return { [varName]: varValue }; + } +} +app.registerExtension({ + name: "rgthree.PowerConductor", + registerCustomNodes() { + if (CONFIG_SERVICE.getConfigValue("unreleased.power_conductor.enabled")) { + NODE_CLASS.setUp(); + } + }, +}); diff --git a/web/lib/tree-sitter-python.wasm b/web/lib/tree-sitter-python.wasm new file mode 100644 index 0000000000000000000000000000000000000000..ebd96b5db34ec49ca6993c854f0fa70a2eb664c2 GIT binary patch literal 457796 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�YAVxkI-gdG`t3tGeow6Q{jI20y;d3yIupKH^H0G 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 z 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 H$#AppaTL __defProp(target, "name", { value, configurable: true }); + +// src/constants.ts +var SIZE_OF_SHORT = 2; +var SIZE_OF_INT = 4; +var SIZE_OF_CURSOR = 4 * SIZE_OF_INT; +var SIZE_OF_NODE = 5 * SIZE_OF_INT; +var SIZE_OF_POINT = 2 * SIZE_OF_INT; +var SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT; +var ZERO_POINT = { row: 0, column: 0 }; +var INTERNAL = Symbol("INTERNAL"); +function assertInternal(x) { + if (x !== INTERNAL) throw new Error("Illegal constructor"); +} +__name(assertInternal, "assertInternal"); +function isPoint(point) { + return !!point && typeof point.row === "number" && typeof point.column === "number"; +} +__name(isPoint, "isPoint"); +function setModule(module2) { + C = module2; +} +__name(setModule, "setModule"); +var C; + +// src/lookahead_iterator.ts +var LookaheadIterator = class { + static { + __name(this, "LookaheadIterator"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + language; + /** @internal */ + constructor(internal, address, language) { + assertInternal(internal); + this[0] = address; + this.language = language; + } + /** Get the current symbol of the lookahead iterator. */ + get currentTypeId() { + return C._ts_lookahead_iterator_current_symbol(this[0]); + } + /** Get the current symbol name of the lookahead iterator. */ + get currentType() { + return this.language.types[this.currentTypeId] || "ERROR"; + } + /** Delete the lookahead iterator, freeing its resources. */ + delete() { + C._ts_lookahead_iterator_delete(this[0]); + this[0] = 0; + } + /** + * Reset the lookahead iterator. + * + * This returns `true` if the language was set successfully and `false` + * otherwise. + */ + reset(language, stateId) { + if (C._ts_lookahead_iterator_reset(this[0], language[0], stateId)) { + this.language = language; + return true; + } + return false; + } + /** + * Reset the lookahead iterator to another state. + * + * This returns `true` if the iterator was reset to the given state and + * `false` otherwise. + */ + resetState(stateId) { + return Boolean(C._ts_lookahead_iterator_reset_state(this[0], stateId)); + } + /** + * Returns an iterator that iterates over the symbols of the lookahead iterator. + * + * The iterator will yield the current symbol name as a string for each step + * until there are no more symbols to iterate over. + */ + [Symbol.iterator]() { + return { + next: /* @__PURE__ */ __name(() => { + if (C._ts_lookahead_iterator_next(this[0])) { + return { done: false, value: this.currentType }; + } + return { done: true, value: "" }; + }, "next") + }; + } +}; + +// src/tree.ts +function getText(tree, startIndex, endIndex, startPosition) { + const length = endIndex - startIndex; + let result = tree.textCallback(startIndex, startPosition); + if (result) { + startIndex += result.length; + while (startIndex < endIndex) { + const string = tree.textCallback(startIndex, startPosition); + if (string && string.length > 0) { + startIndex += string.length; + result += string; + } else { + break; + } + } + if (startIndex > endIndex) { + result = result.slice(0, length); + } + } + return result ?? ""; +} +__name(getText, "getText"); +var Tree = class _Tree { + static { + __name(this, "Tree"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + textCallback; + /** The language that was used to parse the syntax tree. */ + language; + /** @internal */ + constructor(internal, address, language, textCallback) { + assertInternal(internal); + this[0] = address; + this.language = language; + this.textCallback = textCallback; + } + /** Create a shallow copy of the syntax tree. This is very fast. */ + copy() { + const address = C._ts_tree_copy(this[0]); + return new _Tree(INTERNAL, address, this.language, this.textCallback); + } + /** Delete the syntax tree, freeing its resources. */ + delete() { + C._ts_tree_delete(this[0]); + this[0] = 0; + } + /** Get the root node of the syntax tree. */ + get rootNode() { + C._ts_tree_root_node_wasm(this[0]); + return unmarshalNode(this); + } + /** + * Get the root node of the syntax tree, but with its position shifted + * forward by the given offset. + */ + rootNodeWithOffset(offsetBytes, offsetExtent) { + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, offsetBytes, "i32"); + marshalPoint(address + SIZE_OF_INT, offsetExtent); + C._ts_tree_root_node_with_offset_wasm(this[0]); + return unmarshalNode(this); + } + /** + * Edit the syntax tree to keep it in sync with source code that has been + * edited. + * + * You must describe the edit both in terms of byte offsets and in terms of + * row/column coordinates. + */ + edit(edit) { + marshalEdit(edit); + C._ts_tree_edit_wasm(this[0]); + } + /** Create a new {@link TreeCursor} starting from the root of the tree. */ + walk() { + return this.rootNode.walk(); + } + /** + * Compare this old edited syntax tree to a new syntax tree representing + * the same document, returning a sequence of ranges whose syntactic + * structure has changed. + * + * For this to work correctly, this syntax tree must have been edited such + * that its ranges match up to the new tree. Generally, you'll want to + * call this method right after calling one of the [`Parser::parse`] + * functions. Call it on the old tree that was passed to parse, and + * pass the new tree that was returned from `parse`. + */ + getChangedRanges(other) { + if (!(other instanceof _Tree)) { + throw new TypeError("Argument must be a Tree"); + } + C._ts_tree_get_changed_ranges_wasm(this[0], other[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } + /** Get the included ranges that were used to parse the syntax tree. */ + getIncludedRanges() { + C._ts_tree_included_ranges_wasm(this[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } +}; + +// src/tree_cursor.ts +var TreeCursor = class _TreeCursor { + static { + __name(this, "TreeCursor"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + [1] = 0; + // Internal handle for WASM + /** @internal */ + [2] = 0; + // Internal handle for WASM + /** @internal */ + [3] = 0; + // Internal handle for WASM + /** @internal */ + tree; + /** @internal */ + constructor(internal, tree) { + assertInternal(internal); + this.tree = tree; + unmarshalTreeCursor(this); + } + /** Creates a deep copy of the tree cursor. This allocates new memory. */ + copy() { + const copy = new _TreeCursor(INTERNAL, this.tree); + C._ts_tree_cursor_copy_wasm(this.tree[0]); + unmarshalTreeCursor(copy); + return copy; + } + /** Delete the tree cursor, freeing its resources. */ + delete() { + marshalTreeCursor(this); + C._ts_tree_cursor_delete_wasm(this.tree[0]); + this[0] = this[1] = this[2] = 0; + } + /** Get the tree cursor's current {@link Node}. */ + get currentNode() { + marshalTreeCursor(this); + C._ts_tree_cursor_current_node_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get the numerical field id of this tree cursor's current node. + * + * See also {@link TreeCursor#currentFieldName}. + */ + get currentFieldId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_field_id_wasm(this.tree[0]); + } + /** Get the field name of this tree cursor's current node. */ + get currentFieldName() { + return this.tree.language.fields[this.currentFieldId]; + } + /** + * Get the depth of the cursor's current node relative to the original + * node that the cursor was constructed with. + */ + get currentDepth() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_depth_wasm(this.tree[0]); + } + /** + * Get the index of the cursor's current node out of all of the + * descendants of the original node that the cursor was constructed with. + */ + get currentDescendantIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]); + } + /** Get the type of the cursor's current node. */ + get nodeType() { + return this.tree.language.types[this.nodeTypeId] || "ERROR"; + } + /** Get the type id of the cursor's current node. */ + get nodeTypeId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]); + } + /** Get the state id of the cursor's current node. */ + get nodeStateId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]); + } + /** Get the id of the cursor's current node. */ + get nodeId() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_id_wasm(this.tree[0]); + } + /** + * Check if the cursor's current node is *named*. + * + * Named nodes correspond to named rules in the grammar, whereas + * *anonymous* nodes correspond to string literals in the grammar. + */ + get nodeIsNamed() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]) === 1; + } + /** + * Check if the cursor's current node is *missing*. + * + * Missing nodes are inserted by the parser in order to recover from + * certain kinds of syntax errors. + */ + get nodeIsMissing() { + marshalTreeCursor(this); + return C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]) === 1; + } + /** Get the string content of the cursor's current node. */ + get nodeText() { + marshalTreeCursor(this); + const startIndex = C._ts_tree_cursor_start_index_wasm(this.tree[0]); + const endIndex = C._ts_tree_cursor_end_index_wasm(this.tree[0]); + C._ts_tree_cursor_start_position_wasm(this.tree[0]); + const startPosition = unmarshalPoint(TRANSFER_BUFFER); + return getText(this.tree, startIndex, endIndex, startPosition); + } + /** Get the start position of the cursor's current node. */ + get startPosition() { + marshalTreeCursor(this); + C._ts_tree_cursor_start_position_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + /** Get the end position of the cursor's current node. */ + get endPosition() { + marshalTreeCursor(this); + C._ts_tree_cursor_end_position_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + /** Get the start index of the cursor's current node. */ + get startIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_start_index_wasm(this.tree[0]); + } + /** Get the end index of the cursor's current node. */ + get endIndex() { + marshalTreeCursor(this); + return C._ts_tree_cursor_end_index_wasm(this.tree[0]); + } + /** + * Move this cursor to the first child of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there were no children. + */ + gotoFirstChild() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the last child of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there were no children. + * + * Note that this function may be slower than + * {@link TreeCursor#gotoFirstChild} because it needs to + * iterate through all the children to compute the child's position. + */ + gotoLastChild() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the parent of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there was no parent node (the cursor was already on the + * root node). + * + * Note that the node the cursor was constructed with is considered the root + * of the cursor, and the cursor cannot walk outside this node. + */ + gotoParent() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the next sibling of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there was no next sibling node. + * + * Note that the node the cursor was constructed with is considered the root + * of the cursor, and the cursor cannot walk outside this node. + */ + gotoNextSibling() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the previous sibling of its current node. + * + * This returns `true` if the cursor successfully moved, and returns + * `false` if there was no previous sibling node. + * + * Note that this function may be slower than + * {@link TreeCursor#gotoNextSibling} due to how node + * positions are stored. In the worst case, this will need to iterate + * through all the children up to the previous sibling node to recalculate + * its position. Also note that the node the cursor was constructed with is + * considered the root of the cursor, and the cursor cannot walk outside this node. + */ + gotoPreviousSibling() { + marshalTreeCursor(this); + const result = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move the cursor to the node that is the nth descendant of + * the original node that the cursor was constructed with, where + * zero represents the original node itself. + */ + gotoDescendant(goalDescendantIndex) { + marshalTreeCursor(this); + C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], goalDescendantIndex); + unmarshalTreeCursor(this); + } + /** + * Move this cursor to the first child of its current node that contains or + * starts after the given byte offset. + * + * This returns `true` if the cursor successfully moved to a child node, and returns + * `false` if no such child was found. + */ + gotoFirstChildForIndex(goalIndex) { + marshalTreeCursor(this); + C.setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalIndex, "i32"); + const result = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Move this cursor to the first child of its current node that contains or + * starts after the given byte offset. + * + * This returns the index of the child node if one was found, and returns + * `null` if no such child was found. + */ + gotoFirstChildForPosition(goalPosition) { + marshalTreeCursor(this); + marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, goalPosition); + const result = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]); + unmarshalTreeCursor(this); + return result === 1; + } + /** + * Re-initialize this tree cursor to start at the original node that the + * cursor was constructed with. + */ + reset(node) { + marshalNode(node); + marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE); + C._ts_tree_cursor_reset_wasm(this.tree[0]); + unmarshalTreeCursor(this); + } + /** + * Re-initialize a tree cursor to the same position as another cursor. + * + * Unlike {@link TreeCursor#reset}, this will not lose parent + * information and allows reusing already created cursors. + */ + resetTo(cursor) { + marshalTreeCursor(this, TRANSFER_BUFFER); + marshalTreeCursor(cursor, TRANSFER_BUFFER + SIZE_OF_CURSOR); + C._ts_tree_cursor_reset_to_wasm(this.tree[0], cursor.tree[0]); + unmarshalTreeCursor(this); + } +}; + +// src/node.ts +var Node = class { + static { + __name(this, "Node"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + _children; + /** @internal */ + _namedChildren; + /** @internal */ + constructor(internal, { + id, + tree, + startIndex, + startPosition, + other + }) { + assertInternal(internal); + this[0] = other; + this.id = id; + this.tree = tree; + this.startIndex = startIndex; + this.startPosition = startPosition; + } + /** + * The numeric id for this node that is unique. + * + * Within a given syntax tree, no two nodes have the same id. However: + * + * * If a new tree is created based on an older tree, and a node from the old tree is reused in + * the process, then that node will have the same id in both trees. + * + * * A node not marked as having changes does not guarantee it was reused. + * + * * If a node is marked as having changed in the old tree, it will not be reused. + */ + id; + /** The byte index where this node starts. */ + startIndex; + /** The position where this node starts. */ + startPosition; + /** The tree that this node belongs to. */ + tree; + /** Get this node's type as a numerical id. */ + get typeId() { + marshalNode(this); + return C._ts_node_symbol_wasm(this.tree[0]); + } + /** + * Get the node's type as a numerical id as it appears in the grammar, + * ignoring aliases. + */ + get grammarId() { + marshalNode(this); + return C._ts_node_grammar_symbol_wasm(this.tree[0]); + } + /** Get this node's type as a string. */ + get type() { + return this.tree.language.types[this.typeId] || "ERROR"; + } + /** + * Get this node's symbol name as it appears in the grammar, ignoring + * aliases as a string. + */ + get grammarType() { + return this.tree.language.types[this.grammarId] || "ERROR"; + } + /** + * Check if this node is *named*. + * + * Named nodes correspond to named rules in the grammar, whereas + * *anonymous* nodes correspond to string literals in the grammar. + */ + get isNamed() { + marshalNode(this); + return C._ts_node_is_named_wasm(this.tree[0]) === 1; + } + /** + * Check if this node is *extra*. + * + * Extra nodes represent things like comments, which are not required + * by the grammar, but can appear anywhere. + */ + get isExtra() { + marshalNode(this); + return C._ts_node_is_extra_wasm(this.tree[0]) === 1; + } + /** + * Check if this node represents a syntax error. + * + * Syntax errors represent parts of the code that could not be incorporated + * into a valid syntax tree. + */ + get isError() { + marshalNode(this); + return C._ts_node_is_error_wasm(this.tree[0]) === 1; + } + /** + * Check if this node is *missing*. + * + * Missing nodes are inserted by the parser in order to recover from + * certain kinds of syntax errors. + */ + get isMissing() { + marshalNode(this); + return C._ts_node_is_missing_wasm(this.tree[0]) === 1; + } + /** Check if this node has been edited. */ + get hasChanges() { + marshalNode(this); + return C._ts_node_has_changes_wasm(this.tree[0]) === 1; + } + /** + * Check if this node represents a syntax error or contains any syntax + * errors anywhere within it. + */ + get hasError() { + marshalNode(this); + return C._ts_node_has_error_wasm(this.tree[0]) === 1; + } + /** Get the byte index where this node ends. */ + get endIndex() { + marshalNode(this); + return C._ts_node_end_index_wasm(this.tree[0]); + } + /** Get the position where this node ends. */ + get endPosition() { + marshalNode(this); + C._ts_node_end_point_wasm(this.tree[0]); + return unmarshalPoint(TRANSFER_BUFFER); + } + /** Get the string content of this node. */ + get text() { + return getText(this.tree, this.startIndex, this.endIndex, this.startPosition); + } + /** Get this node's parse state. */ + get parseState() { + marshalNode(this); + return C._ts_node_parse_state_wasm(this.tree[0]); + } + /** Get the parse state after this node. */ + get nextParseState() { + marshalNode(this); + return C._ts_node_next_parse_state_wasm(this.tree[0]); + } + /** Check if this node is equal to another node. */ + equals(other) { + return this.tree === other.tree && this.id === other.id; + } + /** + * Get the node's child at the given index, where zero represents the first child. + * + * This method is fairly fast, but its cost is technically log(n), so if + * you might be iterating over a long list of children, you should use + * {@link Node#children} instead. + */ + child(index) { + marshalNode(this); + C._ts_node_child_wasm(this.tree[0], index); + return unmarshalNode(this.tree); + } + /** + * Get this node's *named* child at the given index. + * + * See also {@link Node#isNamed}. + * This method is fairly fast, but its cost is technically log(n), so if + * you might be iterating over a long list of children, you should use + * {@link Node#namedChildren} instead. + */ + namedChild(index) { + marshalNode(this); + C._ts_node_named_child_wasm(this.tree[0], index); + return unmarshalNode(this.tree); + } + /** + * Get this node's child with the given numerical field id. + * + * See also {@link Node#childForFieldName}. You can + * convert a field name to an id using {@link Language#fieldIdForName}. + */ + childForFieldId(fieldId) { + marshalNode(this); + C._ts_node_child_by_field_id_wasm(this.tree[0], fieldId); + return unmarshalNode(this.tree); + } + /** + * Get the first child with the given field name. + * + * If multiple children may have the same field name, access them using + * {@link Node#childrenForFieldName}. + */ + childForFieldName(fieldName) { + const fieldId = this.tree.language.fields.indexOf(fieldName); + if (fieldId !== -1) return this.childForFieldId(fieldId); + return null; + } + /** Get the field name of this node's child at the given index. */ + fieldNameForChild(index) { + marshalNode(this); + const address = C._ts_node_field_name_for_child_wasm(this.tree[0], index); + if (!address) return null; + return C.AsciiToString(address); + } + /** Get the field name of this node's named child at the given index. */ + fieldNameForNamedChild(index) { + marshalNode(this); + const address = C._ts_node_field_name_for_named_child_wasm(this.tree[0], index); + if (!address) return null; + return C.AsciiToString(address); + } + /** + * Get an array of this node's children with a given field name. + * + * See also {@link Node#children}. + */ + childrenForFieldName(fieldName) { + const fieldId = this.tree.language.fields.indexOf(fieldName); + if (fieldId !== -1 && fieldId !== 0) return this.childrenForFieldId(fieldId); + return []; + } + /** + * Get an array of this node's children with a given field id. + * + * See also {@link Node#childrenForFieldName}. + */ + childrenForFieldId(fieldId) { + marshalNode(this); + C._ts_node_children_by_field_id_wasm(this.tree[0], fieldId); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + return result; + } + /** Get the node's first child that contains or starts after the given byte offset. */ + firstChildForIndex(index) { + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, index, "i32"); + C._ts_node_first_child_for_byte_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the node's first named child that contains or starts after the given byte offset. */ + firstNamedChildForIndex(index) { + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, index, "i32"); + C._ts_node_first_named_child_for_byte_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get this node's number of children. */ + get childCount() { + marshalNode(this); + return C._ts_node_child_count_wasm(this.tree[0]); + } + /** + * Get this node's number of *named* children. + * + * See also {@link Node#isNamed}. + */ + get namedChildCount() { + marshalNode(this); + return C._ts_node_named_child_count_wasm(this.tree[0]); + } + /** Get this node's first child. */ + get firstChild() { + return this.child(0); + } + /** + * Get this node's first named child. + * + * See also {@link Node#isNamed}. + */ + get firstNamedChild() { + return this.namedChild(0); + } + /** Get this node's last child. */ + get lastChild() { + return this.child(this.childCount - 1); + } + /** + * Get this node's last named child. + * + * See also {@link Node#isNamed}. + */ + get lastNamedChild() { + return this.namedChild(this.namedChildCount - 1); + } + /** + * Iterate over this node's children. + * + * If you're walking the tree recursively, you may want to use the + * {@link TreeCursor} APIs directly instead. + */ + get children() { + if (!this._children) { + marshalNode(this); + C._ts_node_children_wasm(this.tree[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + this._children = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + this._children[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + } + return this._children; + } + /** + * Iterate over this node's named children. + * + * See also {@link Node#children}. + */ + get namedChildren() { + if (!this._namedChildren) { + marshalNode(this); + C._ts_node_named_children_wasm(this.tree[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + this._namedChildren = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + this._namedChildren[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + C._free(buffer); + } + } + return this._namedChildren; + } + /** + * Get the descendants of this node that are the given type, or in the given types array. + * + * The types array should contain node type strings, which can be retrieved from {@link Language#types}. + * + * Additionally, a `startPosition` and `endPosition` can be passed in to restrict the search to a byte range. + */ + descendantsOfType(types, startPosition = ZERO_POINT, endPosition = ZERO_POINT) { + if (!Array.isArray(types)) types = [types]; + const symbols = []; + const typesBySymbol = this.tree.language.types; + for (const node_type of types) { + if (node_type == "ERROR") { + symbols.push(65535); + } + } + for (let i2 = 0, n = typesBySymbol.length; i2 < n; i2++) { + if (types.includes(typesBySymbol[i2])) { + symbols.push(i2); + } + } + const symbolsAddress = C._malloc(SIZE_OF_INT * symbols.length); + for (let i2 = 0, n = symbols.length; i2 < n; i2++) { + C.setValue(symbolsAddress + i2 * SIZE_OF_INT, symbols[i2], "i32"); + } + marshalNode(this); + C._ts_node_descendants_of_type_wasm( + this.tree[0], + symbolsAddress, + symbols.length, + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column + ); + const descendantCount = C.getValue(TRANSFER_BUFFER, "i32"); + const descendantAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(descendantCount); + if (descendantCount > 0) { + let address = descendantAddress; + for (let i2 = 0; i2 < descendantCount; i2++) { + result[i2] = unmarshalNode(this.tree, address); + address += SIZE_OF_NODE; + } + } + C._free(descendantAddress); + C._free(symbolsAddress); + return result; + } + /** Get this node's next sibling. */ + get nextSibling() { + marshalNode(this); + C._ts_node_next_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get this node's previous sibling. */ + get previousSibling() { + marshalNode(this); + C._ts_node_prev_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get this node's next *named* sibling. + * + * See also {@link Node#isNamed}. + */ + get nextNamedSibling() { + marshalNode(this); + C._ts_node_next_named_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get this node's previous *named* sibling. + * + * See also {@link Node#isNamed}. + */ + get previousNamedSibling() { + marshalNode(this); + C._ts_node_prev_named_sibling_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the node's number of descendants, including one for the node itself. */ + get descendantCount() { + marshalNode(this); + return C._ts_node_descendant_count_wasm(this.tree[0]); + } + /** + * Get this node's immediate parent. + * Prefer {@link Node#childWithDescendant} for iterating over this node's ancestors. + */ + get parent() { + marshalNode(this); + C._ts_node_parent_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Get the node that contains `descendant`. + * + * Note that this can return `descendant` itself. + */ + childWithDescendant(descendant) { + marshalNode(this); + marshalNode(descendant, 1); + C._ts_node_child_with_descendant_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest node within this node that spans the given byte range. */ + descendantForIndex(start2, end = start2) { + if (typeof start2 !== "number" || typeof end !== "number") { + throw new Error("Arguments must be numbers"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, start2, "i32"); + C.setValue(address + SIZE_OF_INT, end, "i32"); + C._ts_node_descendant_for_index_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest named node within this node that spans the given byte range. */ + namedDescendantForIndex(start2, end = start2) { + if (typeof start2 !== "number" || typeof end !== "number") { + throw new Error("Arguments must be numbers"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + C.setValue(address, start2, "i32"); + C.setValue(address + SIZE_OF_INT, end, "i32"); + C._ts_node_named_descendant_for_index_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest node within this node that spans the given point range. */ + descendantForPosition(start2, end = start2) { + if (!isPoint(start2) || !isPoint(end)) { + throw new Error("Arguments must be {row, column} objects"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + marshalPoint(address, start2); + marshalPoint(address + SIZE_OF_POINT, end); + C._ts_node_descendant_for_position_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** Get the smallest named node within this node that spans the given point range. */ + namedDescendantForPosition(start2, end = start2) { + if (!isPoint(start2) || !isPoint(end)) { + throw new Error("Arguments must be {row, column} objects"); + } + marshalNode(this); + const address = TRANSFER_BUFFER + SIZE_OF_NODE; + marshalPoint(address, start2); + marshalPoint(address + SIZE_OF_POINT, end); + C._ts_node_named_descendant_for_position_wasm(this.tree[0]); + return unmarshalNode(this.tree); + } + /** + * Create a new {@link TreeCursor} starting from this node. + * + * Note that the given node is considered the root of the cursor, + * and the cursor cannot walk outside this node. + */ + walk() { + marshalNode(this); + C._ts_tree_cursor_new_wasm(this.tree[0]); + return new TreeCursor(INTERNAL, this.tree); + } + /** + * Edit this node to keep it in-sync with source code that has been edited. + * + * This function is only rarely needed. When you edit a syntax tree with + * the {@link Tree#edit} method, all of the nodes that you retrieve from + * the tree afterward will already reflect the edit. You only need to + * use {@link Node#edit} when you have a specific {@link Node} instance that + * you want to keep and continue to use after an edit. + */ + edit(edit) { + if (this.startIndex >= edit.oldEndIndex) { + this.startIndex = edit.newEndIndex + (this.startIndex - edit.oldEndIndex); + let subbedPointRow; + let subbedPointColumn; + if (this.startPosition.row > edit.oldEndPosition.row) { + subbedPointRow = this.startPosition.row - edit.oldEndPosition.row; + subbedPointColumn = this.startPosition.column; + } else { + subbedPointRow = 0; + subbedPointColumn = this.startPosition.column; + if (this.startPosition.column >= edit.oldEndPosition.column) { + subbedPointColumn = this.startPosition.column - edit.oldEndPosition.column; + } + } + if (subbedPointRow > 0) { + this.startPosition.row += subbedPointRow; + this.startPosition.column = subbedPointColumn; + } else { + this.startPosition.column += subbedPointColumn; + } + } else if (this.startIndex > edit.startIndex) { + this.startIndex = edit.newEndIndex; + this.startPosition.row = edit.newEndPosition.row; + this.startPosition.column = edit.newEndPosition.column; + } + } + /** Get the S-expression representation of this node. */ + toString() { + marshalNode(this); + const address = C._ts_node_to_string_wasm(this.tree[0]); + const result = C.AsciiToString(address); + C._free(address); + return result; + } +}; + +// src/marshal.ts +function unmarshalCaptures(query, tree, address, patternIndex, result) { + for (let i2 = 0, n = result.length; i2 < n; i2++) { + const captureIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const node = unmarshalNode(tree, address); + address += SIZE_OF_NODE; + result[i2] = { patternIndex, name: query.captureNames[captureIndex], node }; + } + return address; +} +__name(unmarshalCaptures, "unmarshalCaptures"); +function marshalNode(node, index = 0) { + let address = TRANSFER_BUFFER + index * SIZE_OF_NODE; + C.setValue(address, node.id, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node.startIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node.startPosition.row, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node.startPosition.column, "i32"); + address += SIZE_OF_INT; + C.setValue(address, node[0], "i32"); +} +__name(marshalNode, "marshalNode"); +function unmarshalNode(tree, address = TRANSFER_BUFFER) { + const id = C.getValue(address, "i32"); + address += SIZE_OF_INT; + if (id === 0) return null; + const index = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const row = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const column = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const other = C.getValue(address, "i32"); + const result = new Node(INTERNAL, { + id, + tree, + startIndex: index, + startPosition: { row, column }, + other + }); + return result; +} +__name(unmarshalNode, "unmarshalNode"); +function marshalTreeCursor(cursor, address = TRANSFER_BUFFER) { + C.setValue(address + 0 * SIZE_OF_INT, cursor[0], "i32"); + C.setValue(address + 1 * SIZE_OF_INT, cursor[1], "i32"); + C.setValue(address + 2 * SIZE_OF_INT, cursor[2], "i32"); + C.setValue(address + 3 * SIZE_OF_INT, cursor[3], "i32"); +} +__name(marshalTreeCursor, "marshalTreeCursor"); +function unmarshalTreeCursor(cursor) { + cursor[0] = C.getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, "i32"); + cursor[1] = C.getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, "i32"); + cursor[2] = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"); + cursor[3] = C.getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, "i32"); +} +__name(unmarshalTreeCursor, "unmarshalTreeCursor"); +function marshalPoint(address, point) { + C.setValue(address, point.row, "i32"); + C.setValue(address + SIZE_OF_INT, point.column, "i32"); +} +__name(marshalPoint, "marshalPoint"); +function unmarshalPoint(address) { + const result = { + row: C.getValue(address, "i32") >>> 0, + column: C.getValue(address + SIZE_OF_INT, "i32") >>> 0 + }; + return result; +} +__name(unmarshalPoint, "unmarshalPoint"); +function marshalRange(address, range) { + marshalPoint(address, range.startPosition); + address += SIZE_OF_POINT; + marshalPoint(address, range.endPosition); + address += SIZE_OF_POINT; + C.setValue(address, range.startIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, range.endIndex, "i32"); + address += SIZE_OF_INT; +} +__name(marshalRange, "marshalRange"); +function unmarshalRange(address) { + const result = {}; + result.startPosition = unmarshalPoint(address); + address += SIZE_OF_POINT; + result.endPosition = unmarshalPoint(address); + address += SIZE_OF_POINT; + result.startIndex = C.getValue(address, "i32") >>> 0; + address += SIZE_OF_INT; + result.endIndex = C.getValue(address, "i32") >>> 0; + return result; +} +__name(unmarshalRange, "unmarshalRange"); +function marshalEdit(edit, address = TRANSFER_BUFFER) { + marshalPoint(address, edit.startPosition); + address += SIZE_OF_POINT; + marshalPoint(address, edit.oldEndPosition); + address += SIZE_OF_POINT; + marshalPoint(address, edit.newEndPosition); + address += SIZE_OF_POINT; + C.setValue(address, edit.startIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, edit.oldEndIndex, "i32"); + address += SIZE_OF_INT; + C.setValue(address, edit.newEndIndex, "i32"); + address += SIZE_OF_INT; +} +__name(marshalEdit, "marshalEdit"); +function unmarshalLanguageMetadata(address) { + const result = {}; + result.major_version = C.getValue(address, "i32"); + address += SIZE_OF_INT; + result.minor_version = C.getValue(address, "i32"); + address += SIZE_OF_INT; + result.field_count = C.getValue(address, "i32"); + return result; +} +__name(unmarshalLanguageMetadata, "unmarshalLanguageMetadata"); + +// src/query.ts +var PREDICATE_STEP_TYPE_CAPTURE = 1; +var PREDICATE_STEP_TYPE_STRING = 2; +var QUERY_WORD_REGEX = /[\w-]+/g; +var CaptureQuantifier = { + Zero: 0, + ZeroOrOne: 1, + ZeroOrMore: 2, + One: 3, + OneOrMore: 4 +}; +var isCaptureStep = /* @__PURE__ */ __name((step) => step.type === "capture", "isCaptureStep"); +var isStringStep = /* @__PURE__ */ __name((step) => step.type === "string", "isStringStep"); +var QueryErrorKind = { + Syntax: 1, + NodeName: 2, + FieldName: 3, + CaptureName: 4, + PatternStructure: 5 +}; +var QueryError = class _QueryError extends Error { + constructor(kind, info2, index, length) { + super(_QueryError.formatMessage(kind, info2)); + this.kind = kind; + this.info = info2; + this.index = index; + this.length = length; + this.name = "QueryError"; + } + static { + __name(this, "QueryError"); + } + /** Formats an error message based on the error kind and info */ + static formatMessage(kind, info2) { + switch (kind) { + case QueryErrorKind.NodeName: + return `Bad node name '${info2.word}'`; + case QueryErrorKind.FieldName: + return `Bad field name '${info2.word}'`; + case QueryErrorKind.CaptureName: + return `Bad capture name @${info2.word}`; + case QueryErrorKind.PatternStructure: + return `Bad pattern structure at offset ${info2.suffix}`; + case QueryErrorKind.Syntax: + return `Bad syntax at offset ${info2.suffix}`; + } + } +}; +function parseAnyPredicate(steps, index, operator, textPredicates) { + if (steps.length !== 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}` + ); + } + if (!isCaptureStep(steps[1])) { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}"` + ); + } + const isPositive = operator === "eq?" || operator === "any-eq?"; + const matchAll = !operator.startsWith("any-"); + if (isCaptureStep(steps[2])) { + const captureName1 = steps[1].name; + const captureName2 = steps[2].name; + textPredicates[index].push((captures) => { + const nodes1 = []; + const nodes2 = []; + for (const c of captures) { + if (c.name === captureName1) nodes1.push(c.node); + if (c.name === captureName2) nodes2.push(c.node); + } + const compare = /* @__PURE__ */ __name((n1, n2, positive) => { + return positive ? n1.text === n2.text : n1.text !== n2.text; + }, "compare"); + return matchAll ? nodes1.every((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))) : nodes1.some((n1) => nodes2.some((n2) => compare(n1, n2, isPositive))); + }); + } else { + const captureName = steps[1].name; + const stringValue = steps[2].value; + const matches = /* @__PURE__ */ __name((n) => n.text === stringValue, "matches"); + const doesNotMatch = /* @__PURE__ */ __name((n) => n.text !== stringValue, "doesNotMatch"); + textPredicates[index].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node); + } + const test = isPositive ? matches : doesNotMatch; + return matchAll ? nodes.every(test) : nodes.some(test); + }); + } +} +__name(parseAnyPredicate, "parseAnyPredicate"); +function parseMatchPredicate(steps, index, operator, textPredicates) { + if (steps.length !== 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 2, got ${steps.length - 1}.` + ); + } + if (steps[1].type !== "capture") { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".` + ); + } + if (steps[2].type !== "string") { + throw new Error( + `Second argument of \`#${operator}\` predicate must be a string. Got @${steps[2].name}.` + ); + } + const isPositive = operator === "match?" || operator === "any-match?"; + const matchAll = !operator.startsWith("any-"); + const captureName = steps[1].name; + const regex = new RegExp(steps[2].value); + textPredicates[index].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node.text); + } + const test = /* @__PURE__ */ __name((text, positive) => { + return positive ? regex.test(text) : !regex.test(text); + }, "test"); + if (nodes.length === 0) return !isPositive; + return matchAll ? nodes.every((text) => test(text, isPositive)) : nodes.some((text) => test(text, isPositive)); + }); +} +__name(parseMatchPredicate, "parseMatchPredicate"); +function parseAnyOfPredicate(steps, index, operator, textPredicates) { + if (steps.length < 2) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected at least 1. Got ${steps.length - 1}.` + ); + } + if (steps[1].type !== "capture") { + throw new Error( + `First argument of \`#${operator}\` predicate must be a capture. Got "${steps[1].value}".` + ); + } + const isPositive = operator === "any-of?"; + const captureName = steps[1].name; + const stringSteps = steps.slice(2); + if (!stringSteps.every(isStringStep)) { + throw new Error( + `Arguments to \`#${operator}\` predicate must be strings.".` + ); + } + const values = stringSteps.map((s) => s.value); + textPredicates[index].push((captures) => { + const nodes = []; + for (const c of captures) { + if (c.name === captureName) nodes.push(c.node.text); + } + if (nodes.length === 0) return !isPositive; + return nodes.every((text) => values.includes(text)) === isPositive; + }); +} +__name(parseAnyOfPredicate, "parseAnyOfPredicate"); +function parseIsPredicate(steps, index, operator, assertedProperties, refutedProperties) { + if (steps.length < 2 || steps.length > 3) { + throw new Error( + `Wrong number of arguments to \`#${operator}\` predicate. Expected 1 or 2. Got ${steps.length - 1}.` + ); + } + if (!steps.every(isStringStep)) { + throw new Error( + `Arguments to \`#${operator}\` predicate must be strings.".` + ); + } + const properties = operator === "is?" ? assertedProperties : refutedProperties; + if (!properties[index]) properties[index] = {}; + properties[index][steps[1].value] = steps[2]?.value ?? null; +} +__name(parseIsPredicate, "parseIsPredicate"); +function parseSetDirective(steps, index, setProperties) { + if (steps.length < 2 || steps.length > 3) { + throw new Error(`Wrong number of arguments to \`#set!\` predicate. Expected 1 or 2. Got ${steps.length - 1}.`); + } + if (!steps.every(isStringStep)) { + throw new Error(`Arguments to \`#set!\` predicate must be strings.".`); + } + if (!setProperties[index]) setProperties[index] = {}; + setProperties[index][steps[1].value] = steps[2]?.value ?? null; +} +__name(parseSetDirective, "parseSetDirective"); +function parsePattern(index, stepType, stepValueId, captureNames, stringValues, steps, textPredicates, predicates, setProperties, assertedProperties, refutedProperties) { + if (stepType === PREDICATE_STEP_TYPE_CAPTURE) { + const name2 = captureNames[stepValueId]; + steps.push({ type: "capture", name: name2 }); + } else if (stepType === PREDICATE_STEP_TYPE_STRING) { + steps.push({ type: "string", value: stringValues[stepValueId] }); + } else if (steps.length > 0) { + if (steps[0].type !== "string") { + throw new Error("Predicates must begin with a literal value"); + } + const operator = steps[0].value; + switch (operator) { + case "any-not-eq?": + case "not-eq?": + case "any-eq?": + case "eq?": + parseAnyPredicate(steps, index, operator, textPredicates); + break; + case "any-not-match?": + case "not-match?": + case "any-match?": + case "match?": + parseMatchPredicate(steps, index, operator, textPredicates); + break; + case "not-any-of?": + case "any-of?": + parseAnyOfPredicate(steps, index, operator, textPredicates); + break; + case "is?": + case "is-not?": + parseIsPredicate(steps, index, operator, assertedProperties, refutedProperties); + break; + case "set!": + parseSetDirective(steps, index, setProperties); + break; + default: + predicates[index].push({ operator, operands: steps.slice(1) }); + } + steps.length = 0; + } +} +__name(parsePattern, "parsePattern"); +var Query = class { + static { + __name(this, "Query"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + exceededMatchLimit; + /** @internal */ + textPredicates; + /** The names of the captures used in the query. */ + captureNames; + /** The quantifiers of the captures used in the query. */ + captureQuantifiers; + /** + * The other user-defined predicates associated with the given index. + * + * This includes predicates with operators other than: + * - `match?` + * - `eq?` and `not-eq?` + * - `any-of?` and `not-any-of?` + * - `is?` and `is-not?` + * - `set!` + */ + predicates; + /** The properties for predicates with the operator `set!`. */ + setProperties; + /** The properties for predicates with the operator `is?`. */ + assertedProperties; + /** The properties for predicates with the operator `is-not?`. */ + refutedProperties; + /** The maximum number of in-progress matches for this cursor. */ + matchLimit; + /** + * Create a new query from a string containing one or more S-expression + * patterns. + * + * The query is associated with a particular language, and can only be run + * on syntax nodes parsed with that language. References to Queries can be + * shared between multiple threads. + * + * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries} + */ + constructor(language, source) { + const sourceLength = C.lengthBytesUTF8(source); + const sourceAddress = C._malloc(sourceLength + 1); + C.stringToUTF8(source, sourceAddress, sourceLength + 1); + const address = C._ts_query_new( + language[0], + sourceAddress, + sourceLength, + TRANSFER_BUFFER, + TRANSFER_BUFFER + SIZE_OF_INT + ); + if (!address) { + const errorId = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const errorByte = C.getValue(TRANSFER_BUFFER, "i32"); + const errorIndex = C.UTF8ToString(sourceAddress, errorByte).length; + const suffix = source.slice(errorIndex, errorIndex + 100).split("\n")[0]; + const word = suffix.match(QUERY_WORD_REGEX)?.[0] ?? ""; + C._free(sourceAddress); + switch (errorId) { + case QueryErrorKind.Syntax: + throw new QueryError(QueryErrorKind.Syntax, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0); + case QueryErrorKind.NodeName: + throw new QueryError(errorId, { word }, errorIndex, word.length); + case QueryErrorKind.FieldName: + throw new QueryError(errorId, { word }, errorIndex, word.length); + case QueryErrorKind.CaptureName: + throw new QueryError(errorId, { word }, errorIndex, word.length); + case QueryErrorKind.PatternStructure: + throw new QueryError(errorId, { suffix: `${errorIndex}: '${suffix}'...` }, errorIndex, 0); + } + } + const stringCount = C._ts_query_string_count(address); + const captureCount = C._ts_query_capture_count(address); + const patternCount = C._ts_query_pattern_count(address); + const captureNames = new Array(captureCount); + const captureQuantifiers = new Array(patternCount); + const stringValues = new Array(stringCount); + for (let i2 = 0; i2 < captureCount; i2++) { + const nameAddress = C._ts_query_capture_name_for_id( + address, + i2, + TRANSFER_BUFFER + ); + const nameLength = C.getValue(TRANSFER_BUFFER, "i32"); + captureNames[i2] = C.UTF8ToString(nameAddress, nameLength); + } + for (let i2 = 0; i2 < patternCount; i2++) { + const captureQuantifiersArray = new Array(captureCount); + for (let j = 0; j < captureCount; j++) { + const quantifier = C._ts_query_capture_quantifier_for_id(address, i2, j); + captureQuantifiersArray[j] = quantifier; + } + captureQuantifiers[i2] = captureQuantifiersArray; + } + for (let i2 = 0; i2 < stringCount; i2++) { + const valueAddress = C._ts_query_string_value_for_id( + address, + i2, + TRANSFER_BUFFER + ); + const nameLength = C.getValue(TRANSFER_BUFFER, "i32"); + stringValues[i2] = C.UTF8ToString(valueAddress, nameLength); + } + const setProperties = new Array(patternCount); + const assertedProperties = new Array(patternCount); + const refutedProperties = new Array(patternCount); + const predicates = new Array(patternCount); + const textPredicates = new Array(patternCount); + for (let i2 = 0; i2 < patternCount; i2++) { + const predicatesAddress = C._ts_query_predicates_for_pattern(address, i2, TRANSFER_BUFFER); + const stepCount = C.getValue(TRANSFER_BUFFER, "i32"); + predicates[i2] = []; + textPredicates[i2] = []; + const steps = new Array(); + let stepAddress = predicatesAddress; + for (let j = 0; j < stepCount; j++) { + const stepType = C.getValue(stepAddress, "i32"); + stepAddress += SIZE_OF_INT; + const stepValueId = C.getValue(stepAddress, "i32"); + stepAddress += SIZE_OF_INT; + parsePattern( + i2, + stepType, + stepValueId, + captureNames, + stringValues, + steps, + textPredicates, + predicates, + setProperties, + assertedProperties, + refutedProperties + ); + } + Object.freeze(textPredicates[i2]); + Object.freeze(predicates[i2]); + Object.freeze(setProperties[i2]); + Object.freeze(assertedProperties[i2]); + Object.freeze(refutedProperties[i2]); + } + C._free(sourceAddress); + this[0] = address; + this.captureNames = captureNames; + this.captureQuantifiers = captureQuantifiers; + this.textPredicates = textPredicates; + this.predicates = predicates; + this.setProperties = setProperties; + this.assertedProperties = assertedProperties; + this.refutedProperties = refutedProperties; + this.exceededMatchLimit = false; + } + /** Delete the query, freeing its resources. */ + delete() { + C._ts_query_delete(this[0]); + this[0] = 0; + } + /** + * Iterate over all of the matches in the order that they were found. + * + * Each match contains the index of the pattern that matched, and a list of + * captures. Because multiple patterns can match the same set of nodes, + * one match may contain captures that appear *before* some of the + * captures from a previous match. + * + * @param {Node} node - The node to execute the query on. + * + * @param {QueryOptions} options - Options for query execution. + */ + matches(node, options = {}) { + const startPosition = options.startPosition ?? ZERO_POINT; + const endPosition = options.endPosition ?? ZERO_POINT; + const startIndex = options.startIndex ?? 0; + const endIndex = options.endIndex ?? 0; + const matchLimit = options.matchLimit ?? 4294967295; + const maxStartDepth = options.maxStartDepth ?? 4294967295; + const timeoutMicros = options.timeoutMicros ?? 0; + const progressCallback = options.progressCallback; + if (typeof matchLimit !== "number") { + throw new Error("Arguments must be numbers"); + } + this.matchLimit = matchLimit; + if (endIndex !== 0 && startIndex > endIndex) { + throw new Error("`startIndex` cannot be greater than `endIndex`"); + } + if (endPosition !== ZERO_POINT && (startPosition.row > endPosition.row || startPosition.row === endPosition.row && startPosition.column > endPosition.column)) { + throw new Error("`startPosition` cannot be greater than `endPosition`"); + } + if (progressCallback) { + C.currentQueryProgressCallback = progressCallback; + } + marshalNode(node); + C._ts_query_matches_wasm( + this[0], + node.tree[0], + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column, + startIndex, + endIndex, + matchLimit, + maxStartDepth, + timeoutMicros + ); + const rawCount = C.getValue(TRANSFER_BUFFER, "i32"); + const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"); + const result = new Array(rawCount); + this.exceededMatchLimit = Boolean(didExceedMatchLimit); + let filteredCount = 0; + let address = startAddress; + for (let i2 = 0; i2 < rawCount; i2++) { + const patternIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captureCount = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captures = new Array(captureCount); + address = unmarshalCaptures(this, node.tree, address, patternIndex, captures); + if (this.textPredicates[patternIndex].every((p) => p(captures))) { + result[filteredCount] = { pattern: patternIndex, patternIndex, captures }; + const setProperties = this.setProperties[patternIndex]; + result[filteredCount].setProperties = setProperties; + const assertedProperties = this.assertedProperties[patternIndex]; + result[filteredCount].assertedProperties = assertedProperties; + const refutedProperties = this.refutedProperties[patternIndex]; + result[filteredCount].refutedProperties = refutedProperties; + filteredCount++; + } + } + result.length = filteredCount; + C._free(startAddress); + C.currentQueryProgressCallback = null; + return result; + } + /** + * Iterate over all of the individual captures in the order that they + * appear. + * + * This is useful if you don't care about which pattern matched, and just + * want a single, ordered sequence of captures. + * + * @param {Node} node - The node to execute the query on. + * + * @param {QueryOptions} options - Options for query execution. + */ + captures(node, options = {}) { + const startPosition = options.startPosition ?? ZERO_POINT; + const endPosition = options.endPosition ?? ZERO_POINT; + const startIndex = options.startIndex ?? 0; + const endIndex = options.endIndex ?? 0; + const matchLimit = options.matchLimit ?? 4294967295; + const maxStartDepth = options.maxStartDepth ?? 4294967295; + const timeoutMicros = options.timeoutMicros ?? 0; + const progressCallback = options.progressCallback; + if (typeof matchLimit !== "number") { + throw new Error("Arguments must be numbers"); + } + this.matchLimit = matchLimit; + if (endIndex !== 0 && startIndex > endIndex) { + throw new Error("`startIndex` cannot be greater than `endIndex`"); + } + if (endPosition !== ZERO_POINT && (startPosition.row > endPosition.row || startPosition.row === endPosition.row && startPosition.column > endPosition.column)) { + throw new Error("`startPosition` cannot be greater than `endPosition`"); + } + if (progressCallback) { + C.currentQueryProgressCallback = progressCallback; + } + marshalNode(node); + C._ts_query_captures_wasm( + this[0], + node.tree[0], + startPosition.row, + startPosition.column, + endPosition.row, + endPosition.column, + startIndex, + endIndex, + matchLimit, + maxStartDepth, + timeoutMicros + ); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const startAddress = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const didExceedMatchLimit = C.getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"); + const result = new Array(); + this.exceededMatchLimit = Boolean(didExceedMatchLimit); + const captures = new Array(); + let address = startAddress; + for (let i2 = 0; i2 < count; i2++) { + const patternIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captureCount = C.getValue(address, "i32"); + address += SIZE_OF_INT; + const captureIndex = C.getValue(address, "i32"); + address += SIZE_OF_INT; + captures.length = captureCount; + address = unmarshalCaptures(this, node.tree, address, patternIndex, captures); + if (this.textPredicates[patternIndex].every((p) => p(captures))) { + const capture = captures[captureIndex]; + const setProperties = this.setProperties[patternIndex]; + capture.setProperties = setProperties; + const assertedProperties = this.assertedProperties[patternIndex]; + capture.assertedProperties = assertedProperties; + const refutedProperties = this.refutedProperties[patternIndex]; + capture.refutedProperties = refutedProperties; + result.push(capture); + } + } + C._free(startAddress); + C.currentQueryProgressCallback = null; + return result; + } + /** Get the predicates for a given pattern. */ + predicatesForPattern(patternIndex) { + return this.predicates[patternIndex]; + } + /** + * Disable a certain capture within a query. + * + * This prevents the capture from being returned in matches, and also + * avoids any resource usage associated with recording the capture. + */ + disableCapture(captureName) { + const captureNameLength = C.lengthBytesUTF8(captureName); + const captureNameAddress = C._malloc(captureNameLength + 1); + C.stringToUTF8(captureName, captureNameAddress, captureNameLength + 1); + C._ts_query_disable_capture(this[0], captureNameAddress, captureNameLength); + C._free(captureNameAddress); + } + /** + * Disable a certain pattern within a query. + * + * This prevents the pattern from matching, and also avoids any resource + * usage associated with the pattern. This throws an error if the pattern + * index is out of bounds. + */ + disablePattern(patternIndex) { + if (patternIndex >= this.predicates.length) { + throw new Error( + `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` + ); + } + C._ts_query_disable_pattern(this[0], patternIndex); + } + /** + * Check if, on its last execution, this cursor exceeded its maximum number + * of in-progress matches. + */ + didExceedMatchLimit() { + return this.exceededMatchLimit; + } + /** Get the byte offset where the given pattern starts in the query's source. */ + startIndexForPattern(patternIndex) { + if (patternIndex >= this.predicates.length) { + throw new Error( + `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` + ); + } + return C._ts_query_start_byte_for_pattern(this[0], patternIndex); + } + /** Get the byte offset where the given pattern ends in the query's source. */ + endIndexForPattern(patternIndex) { + if (patternIndex >= this.predicates.length) { + throw new Error( + `Pattern index is ${patternIndex} but the pattern count is ${this.predicates.length}` + ); + } + return C._ts_query_end_byte_for_pattern(this[0], patternIndex); + } + /** Get the number of patterns in the query. */ + patternCount() { + return C._ts_query_pattern_count(this[0]); + } + /** Get the index for a given capture name. */ + captureIndexForName(captureName) { + return this.captureNames.indexOf(captureName); + } + /** Check if a given pattern within a query has a single root node. */ + isPatternRooted(patternIndex) { + return C._ts_query_is_pattern_rooted(this[0], patternIndex) === 1; + } + /** Check if a given pattern within a query has a single root node. */ + isPatternNonLocal(patternIndex) { + return C._ts_query_is_pattern_non_local(this[0], patternIndex) === 1; + } + /** + * Check if a given step in a query is 'definite'. + * + * A query step is 'definite' if its parent pattern will be guaranteed to + * match successfully once it reaches the step. + */ + isPatternGuaranteedAtStep(byteIndex) { + return C._ts_query_is_pattern_guaranteed_at_step(this[0], byteIndex) === 1; + } +}; + +// src/language.ts +var LANGUAGE_FUNCTION_REGEX = /^tree_sitter_\w+$/; +var Language = class _Language { + static { + __name(this, "Language"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** + * A list of all node types in the language. The index of each type in this + * array is its node type id. + */ + types; + /** + * A list of all field names in the language. The index of each field name in + * this array is its field id. + */ + fields; + /** @internal */ + constructor(internal, address) { + assertInternal(internal); + this[0] = address; + this.types = new Array(C._ts_language_symbol_count(this[0])); + for (let i2 = 0, n = this.types.length; i2 < n; i2++) { + if (C._ts_language_symbol_type(this[0], i2) < 2) { + this.types[i2] = C.UTF8ToString(C._ts_language_symbol_name(this[0], i2)); + } + } + this.fields = new Array(C._ts_language_field_count(this[0]) + 1); + for (let i2 = 0, n = this.fields.length; i2 < n; i2++) { + const fieldName = C._ts_language_field_name_for_id(this[0], i2); + if (fieldName !== 0) { + this.fields[i2] = C.UTF8ToString(fieldName); + } else { + this.fields[i2] = null; + } + } + } + /** + * Gets the name of the language. + */ + get name() { + const ptr = C._ts_language_name(this[0]); + if (ptr === 0) return null; + return C.UTF8ToString(ptr); + } + /** + * @deprecated since version 0.25.0, use {@link Language#abiVersion} instead + * Gets the version of the language. + */ + get version() { + return C._ts_language_version(this[0]); + } + /** + * Gets the ABI version of the language. + */ + get abiVersion() { + return C._ts_language_abi_version(this[0]); + } + /** + * Get the metadata for this language. This information is generated by the + * CLI, and relies on the language author providing the correct metadata in + * the language's `tree-sitter.json` file. + */ + get metadata() { + C._ts_language_metadata(this[0]); + const length = C.getValue(TRANSFER_BUFFER, "i32"); + const address = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + if (length === 0) return null; + return unmarshalLanguageMetadata(address); + } + /** + * Gets the number of fields in the language. + */ + get fieldCount() { + return this.fields.length - 1; + } + /** + * Gets the number of states in the language. + */ + get stateCount() { + return C._ts_language_state_count(this[0]); + } + /** + * Get the field id for a field name. + */ + fieldIdForName(fieldName) { + const result = this.fields.indexOf(fieldName); + return result !== -1 ? result : null; + } + /** + * Get the field name for a field id. + */ + fieldNameForId(fieldId) { + return this.fields[fieldId] ?? null; + } + /** + * Get the node type id for a node type name. + */ + idForNodeType(type, named) { + const typeLength = C.lengthBytesUTF8(type); + const typeAddress = C._malloc(typeLength + 1); + C.stringToUTF8(type, typeAddress, typeLength + 1); + const result = C._ts_language_symbol_for_name(this[0], typeAddress, typeLength, named ? 1 : 0); + C._free(typeAddress); + return result || null; + } + /** + * Gets the number of node types in the language. + */ + get nodeTypeCount() { + return C._ts_language_symbol_count(this[0]); + } + /** + * Get the node type name for a node type id. + */ + nodeTypeForId(typeId) { + const name2 = C._ts_language_symbol_name(this[0], typeId); + return name2 ? C.UTF8ToString(name2) : null; + } + /** + * Check if a node type is named. + * + * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/2-basic-parsing.html#named-vs-anonymous-nodes} + */ + nodeTypeIsNamed(typeId) { + return C._ts_language_type_is_named_wasm(this[0], typeId) ? true : false; + } + /** + * Check if a node type is visible. + */ + nodeTypeIsVisible(typeId) { + return C._ts_language_type_is_visible_wasm(this[0], typeId) ? true : false; + } + /** + * Get the supertypes ids of this language. + * + * @see {@link https://tree-sitter.github.io/tree-sitter/using-parsers/6-static-node-types.html?highlight=supertype#supertype-nodes} + */ + get supertypes() { + C._ts_language_supertypes_wasm(this[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = C.getValue(address, "i16"); + address += SIZE_OF_SHORT; + } + } + return result; + } + /** + * Get the subtype ids for a given supertype node id. + */ + subtypes(supertype) { + C._ts_language_subtypes_wasm(this[0], supertype); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = C.getValue(address, "i16"); + address += SIZE_OF_SHORT; + } + } + return result; + } + /** + * Get the next state id for a given state id and node type id. + */ + nextState(stateId, typeId) { + return C._ts_language_next_state(this[0], stateId, typeId); + } + /** + * Create a new lookahead iterator for this language and parse state. + * + * This returns `null` if state is invalid for this language. + * + * Iterating {@link LookaheadIterator} will yield valid symbols in the given + * parse state. Newly created lookahead iterators will return the `ERROR` + * symbol from {@link LookaheadIterator#currentType}. + * + * Lookahead iterators can be useful for generating suggestions and improving + * syntax error diagnostics. To get symbols valid in an `ERROR` node, use the + * lookahead iterator on its first leaf node state. For `MISSING` nodes, a + * lookahead iterator created on the previous non-extra leaf node may be + * appropriate. + */ + lookaheadIterator(stateId) { + const address = C._ts_lookahead_iterator_new(this[0], stateId); + if (address) return new LookaheadIterator(INTERNAL, address, this); + return null; + } + /** + * @deprecated since version 0.25.0, call `new` on a {@link Query} instead + * + * Create a new query from a string containing one or more S-expression + * patterns. + * + * The query is associated with a particular language, and can only be run + * on syntax nodes parsed with that language. References to Queries can be + * shared between multiple threads. + * + * @link {@see https://tree-sitter.github.io/tree-sitter/using-parsers/queries} + */ + query(source) { + console.warn("Language.query is deprecated. Use new Query(language, source) instead."); + return new Query(this, source); + } + /** + * Load a language from a WebAssembly module. + * The module can be provided as a path to a file or as a buffer. + */ + static async load(input) { + let bytes; + if (input instanceof Uint8Array) { + bytes = Promise.resolve(input); + } else { + if (globalThis.process?.versions.node) { + const fs2 = await import("fs/promises"); + bytes = fs2.readFile(input); + } else { + bytes = fetch(input).then((response) => response.arrayBuffer().then((buffer) => { + if (response.ok) { + return new Uint8Array(buffer); + } else { + const body2 = new TextDecoder("utf-8").decode(buffer); + throw new Error(`Language.load failed with status ${response.status}. + +${body2}`); + } + })); + } + } + const mod = await C.loadWebAssemblyModule(await bytes, { loadAsync: true }); + const symbolNames = Object.keys(mod); + const functionName = symbolNames.find((key) => LANGUAGE_FUNCTION_REGEX.test(key) && !key.includes("external_scanner_")); + if (!functionName) { + console.log(`Couldn't find language function in WASM file. Symbols: +${JSON.stringify(symbolNames, null, 2)}`); + throw new Error("Language.load failed: no language function found in WASM file"); + } + const languageAddress = mod[functionName](); + return new _Language(INTERNAL, languageAddress); + } +}; + +// lib/tree-sitter.mjs +var Module2 = (() => { + var _scriptName = import.meta.url; + return async function(moduleArg = {}) { + var moduleRtn; + var Module = moduleArg; + var readyPromiseResolve, readyPromiseReject; + var readyPromise = new Promise((resolve, reject) => { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var ENVIRONMENT_IS_WEB = typeof window == "object"; + var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != "undefined"; + var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string" && process.type != "renderer"; + var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + if (ENVIRONMENT_IS_NODE) { + const { createRequire } = await import("module"); + var require = createRequire(import.meta.url); + } + Module.currentQueryProgressCallback = null; + Module.currentProgressCallback = null; + Module.currentLogCallback = null; + Module.currentParseCallback = null; + var moduleOverrides = Object.assign({}, Module); + var arguments_ = []; + var thisProgram = "./this.program"; + var quit_ = /* @__PURE__ */ __name((status, toThrow) => { + throw toThrow; + }, "quit_"); + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + __name(locateFile, "locateFile"); + var readAsync, readBinary; + if (ENVIRONMENT_IS_NODE) { + var fs = require("fs"); + var nodePath = require("path"); + if (!import.meta.url.startsWith("data:")) { + scriptDirectory = nodePath.dirname(require("url").fileURLToPath(import.meta.url)) + "/"; + } + readBinary = /* @__PURE__ */ __name((filename) => { + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename); + return ret; + }, "readBinary"); + readAsync = /* @__PURE__ */ __name(async (filename, binary2 = true) => { + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename, binary2 ? void 0 : "utf8"); + return ret; + }, "readAsync"); + if (!Module["thisProgram"] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, "/"); + } + arguments_ = process.argv.slice(2); + quit_ = /* @__PURE__ */ __name((status, toThrow) => { + process.exitCode = status; + throw toThrow; + }, "quit_"); + } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = self.location.href; + } else if (typeof document != "undefined" && document.currentScript) { + scriptDirectory = document.currentScript.src; + } + if (_scriptName) { + scriptDirectory = _scriptName; + } + if (scriptDirectory.startsWith("blob:")) { + scriptDirectory = ""; + } else { + scriptDirectory = scriptDirectory.slice(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); + } + { + if (ENVIRONMENT_IS_WORKER) { + readBinary = /* @__PURE__ */ __name((url) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, false); + xhr.responseType = "arraybuffer"; + xhr.send(null); + return new Uint8Array( + /** @type{!ArrayBuffer} */ + xhr.response + ); + }, "readBinary"); + } + readAsync = /* @__PURE__ */ __name(async (url) => { + if (isFileURI(url)) { + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest(); + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.onload = () => { + if (xhr.status == 200 || xhr.status == 0 && xhr.response) { + resolve(xhr.response); + return; + } + reject(xhr.status); + }; + xhr.onerror = reject; + xhr.send(null); + }); + } + var response = await fetch(url, { + credentials: "same-origin" + }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + " : " + response.url); + }, "readAsync"); + } + } else { + } + var out = Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.error.bind(console); + Object.assign(Module, moduleOverrides); + moduleOverrides = null; + if (Module["arguments"]) arguments_ = Module["arguments"]; + if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; + var dynamicLibraries = Module["dynamicLibraries"] || []; + var wasmBinary = Module["wasmBinary"]; + var wasmMemory; + var ABORT = false; + var EXITSTATUS; + function assert(condition, text) { + if (!condition) { + abort(text); + } + } + __name(assert, "assert"); + var HEAP, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAP64, HEAPU64, HEAPF64; + var HEAP_DATA_VIEW; + var runtimeInitialized = false; + var isFileURI = /* @__PURE__ */ __name((filename) => filename.startsWith("file://"), "isFileURI"); + function updateMemoryViews() { + var b = wasmMemory.buffer; + Module["HEAP_DATA_VIEW"] = HEAP_DATA_VIEW = new DataView(b); + Module["HEAP8"] = HEAP8 = new Int8Array(b); + Module["HEAP16"] = HEAP16 = new Int16Array(b); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(b); + Module["HEAPU16"] = HEAPU16 = new Uint16Array(b); + Module["HEAP32"] = HEAP32 = new Int32Array(b); + Module["HEAPU32"] = HEAPU32 = new Uint32Array(b); + Module["HEAPF32"] = HEAPF32 = new Float32Array(b); + Module["HEAPF64"] = HEAPF64 = new Float64Array(b); + Module["HEAP64"] = HEAP64 = new BigInt64Array(b); + Module["HEAPU64"] = HEAPU64 = new BigUint64Array(b); + } + __name(updateMemoryViews, "updateMemoryViews"); + if (Module["wasmMemory"]) { + wasmMemory = Module["wasmMemory"]; + } else { + var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 33554432; + wasmMemory = new WebAssembly.Memory({ + "initial": INITIAL_MEMORY / 65536, + // In theory we should not need to emit the maximum if we want "unlimited" + // or 4GB of memory, but VMs error on that atm, see + // https://github.com/emscripten-core/emscripten/issues/14130 + // And in the pthreads case we definitely need to emit a maximum. So + // always emit one. + "maximum": 32768 + }); + } + updateMemoryViews(); + var __RELOC_FUNCS__ = []; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(onPreRuns); + } + __name(preRun, "preRun"); + function initRuntime() { + runtimeInitialized = true; + callRuntimeCallbacks(__RELOC_FUNCS__); + wasmExports["__wasm_call_ctors"](); + callRuntimeCallbacks(onPostCtors); + } + __name(initRuntime, "initRuntime"); + function preMain() { + } + __name(preMain, "preMain"); + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(onPostRuns); + } + __name(postRun, "postRun"); + var runDependencies = 0; + var dependenciesFulfilled = null; + function getUniqueRunDependency(id) { + return id; + } + __name(getUniqueRunDependency, "getUniqueRunDependency"); + function addRunDependency(id) { + runDependencies++; + Module["monitorRunDependencies"]?.(runDependencies); + } + __name(addRunDependency, "addRunDependency"); + function removeRunDependency(id) { + runDependencies--; + Module["monitorRunDependencies"]?.(runDependencies); + if (runDependencies == 0) { + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + __name(removeRunDependency, "removeRunDependency"); + function abort(what) { + Module["onAbort"]?.(what); + what = "Aborted(" + what + ")"; + err(what); + ABORT = true; + what += ". Build with -sASSERTIONS for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + __name(abort, "abort"); + var wasmBinaryFile; + function findWasmBinary() { + if (Module["locateFile"]) { + return locateFile("tree-sitter.wasm"); + } + return new URL("tree-sitter.wasm", import.meta.url).href; + } + __name(findWasmBinary, "findWasmBinary"); + function getBinarySync(file) { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw "both async and sync fetching of the wasm failed"; + } + __name(getBinarySync, "getBinarySync"); + async function getWasmBinary(binaryFile) { + if (!wasmBinary) { + try { + var response = await readAsync(binaryFile); + return new Uint8Array(response); + } catch { + } + } + return getBinarySync(binaryFile); + } + __name(getWasmBinary, "getWasmBinary"); + async function instantiateArrayBuffer(binaryFile, imports) { + try { + var binary2 = await getWasmBinary(binaryFile); + var instance2 = await WebAssembly.instantiate(binary2, imports); + return instance2; + } catch (reason) { + err(`failed to asynchronously prepare wasm: ${reason}`); + abort(reason); + } + } + __name(instantiateArrayBuffer, "instantiateArrayBuffer"); + async function instantiateAsync(binary2, binaryFile, imports) { + if (!binary2 && typeof WebAssembly.instantiateStreaming == "function" && !isFileURI(binaryFile) && !ENVIRONMENT_IS_NODE) { + try { + var response = fetch(binaryFile, { + credentials: "same-origin" + }); + var instantiationResult = await WebAssembly.instantiateStreaming(response, imports); + return instantiationResult; + } catch (reason) { + err(`wasm streaming compile failed: ${reason}`); + err("falling back to ArrayBuffer instantiation"); + } + } + return instantiateArrayBuffer(binaryFile, imports); + } + __name(instantiateAsync, "instantiateAsync"); + function getWasmImports() { + return { + "env": wasmImports, + "wasi_snapshot_preview1": wasmImports, + "GOT.mem": new Proxy(wasmImports, GOTHandler), + "GOT.func": new Proxy(wasmImports, GOTHandler) + }; + } + __name(getWasmImports, "getWasmImports"); + async function createWasm() { + function receiveInstance(instance2, module2) { + wasmExports = instance2.exports; + wasmExports = relocateExports(wasmExports, 1024); + var metadata2 = getDylinkMetadata(module2); + if (metadata2.neededDynlibs) { + dynamicLibraries = metadata2.neededDynlibs.concat(dynamicLibraries); + } + mergeLibSymbols(wasmExports, "main"); + LDSO.init(); + loadDylibs(); + __RELOC_FUNCS__.push(wasmExports["__wasm_apply_data_relocs"]); + removeRunDependency("wasm-instantiate"); + return wasmExports; + } + __name(receiveInstance, "receiveInstance"); + addRunDependency("wasm-instantiate"); + function receiveInstantiationResult(result2) { + return receiveInstance(result2["instance"], result2["module"]); + } + __name(receiveInstantiationResult, "receiveInstantiationResult"); + var info2 = getWasmImports(); + if (Module["instantiateWasm"]) { + return new Promise((resolve, reject) => { + Module["instantiateWasm"](info2, (mod, inst) => { + receiveInstance(mod, inst); + resolve(mod.exports); + }); + }); + } + wasmBinaryFile ??= findWasmBinary(); + try { + var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info2); + var exports = receiveInstantiationResult(result); + return exports; + } catch (e) { + readyPromiseReject(e); + return Promise.reject(e); + } + } + __name(createWasm, "createWasm"); + var ASM_CONSTS = {}; + class ExitStatus { + static { + __name(this, "ExitStatus"); + } + name = "ExitStatus"; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + var GOT = {}; + var currentModuleWeakSymbols = /* @__PURE__ */ new Set([]); + var GOTHandler = { + get(obj, symName) { + var rtn = GOT[symName]; + if (!rtn) { + rtn = GOT[symName] = new WebAssembly.Global({ + "value": "i32", + "mutable": true + }); + } + if (!currentModuleWeakSymbols.has(symName)) { + rtn.required = true; + } + return rtn; + } + }; + var LE_HEAP_LOAD_F32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getFloat32(byteOffset, true), "LE_HEAP_LOAD_F32"); + var LE_HEAP_LOAD_F64 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getFloat64(byteOffset, true), "LE_HEAP_LOAD_F64"); + var LE_HEAP_LOAD_I16 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getInt16(byteOffset, true), "LE_HEAP_LOAD_I16"); + var LE_HEAP_LOAD_I32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getInt32(byteOffset, true), "LE_HEAP_LOAD_I32"); + var LE_HEAP_LOAD_U16 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getUint16(byteOffset, true), "LE_HEAP_LOAD_U16"); + var LE_HEAP_LOAD_U32 = /* @__PURE__ */ __name((byteOffset) => HEAP_DATA_VIEW.getUint32(byteOffset, true), "LE_HEAP_LOAD_U32"); + var LE_HEAP_STORE_F32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setFloat32(byteOffset, value, true), "LE_HEAP_STORE_F32"); + var LE_HEAP_STORE_F64 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setFloat64(byteOffset, value, true), "LE_HEAP_STORE_F64"); + var LE_HEAP_STORE_I16 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setInt16(byteOffset, value, true), "LE_HEAP_STORE_I16"); + var LE_HEAP_STORE_I32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setInt32(byteOffset, value, true), "LE_HEAP_STORE_I32"); + var LE_HEAP_STORE_U16 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setUint16(byteOffset, value, true), "LE_HEAP_STORE_U16"); + var LE_HEAP_STORE_U32 = /* @__PURE__ */ __name((byteOffset, value) => HEAP_DATA_VIEW.setUint32(byteOffset, value, true), "LE_HEAP_STORE_U32"); + var callRuntimeCallbacks = /* @__PURE__ */ __name((callbacks) => { + while (callbacks.length > 0) { + callbacks.shift()(Module); + } + }, "callRuntimeCallbacks"); + var onPostRuns = []; + var addOnPostRun = /* @__PURE__ */ __name((cb) => onPostRuns.unshift(cb), "addOnPostRun"); + var onPreRuns = []; + var addOnPreRun = /* @__PURE__ */ __name((cb) => onPreRuns.unshift(cb), "addOnPreRun"); + var UTF8Decoder = typeof TextDecoder != "undefined" ? new TextDecoder() : void 0; + var UTF8ArrayToString = /* @__PURE__ */ __name((heapOrArray, idx = 0, maxBytesToRead = NaN) => { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ""; + while (idx < endPtr) { + var u0 = heapOrArray[idx++]; + if (!(u0 & 128)) { + str += String.fromCharCode(u0); + continue; + } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 224) == 192) { + str += String.fromCharCode((u0 & 31) << 6 | u1); + continue; + } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 240) == 224) { + u0 = (u0 & 15) << 12 | u1 << 6 | u2; + } else { + u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63; + } + if (u0 < 65536) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 65536; + str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023); + } + } + return str; + }, "UTF8ArrayToString"); + var getDylinkMetadata = /* @__PURE__ */ __name((binary2) => { + var offset = 0; + var end = 0; + function getU8() { + return binary2[offset++]; + } + __name(getU8, "getU8"); + function getLEB() { + var ret = 0; + var mul = 1; + while (1) { + var byte = binary2[offset++]; + ret += (byte & 127) * mul; + mul *= 128; + if (!(byte & 128)) break; + } + return ret; + } + __name(getLEB, "getLEB"); + function getString() { + var len = getLEB(); + offset += len; + return UTF8ArrayToString(binary2, offset - len, len); + } + __name(getString, "getString"); + function failIf(condition, message) { + if (condition) throw new Error(message); + } + __name(failIf, "failIf"); + var name2 = "dylink.0"; + if (binary2 instanceof WebAssembly.Module) { + var dylinkSection = WebAssembly.Module.customSections(binary2, name2); + if (dylinkSection.length === 0) { + name2 = "dylink"; + dylinkSection = WebAssembly.Module.customSections(binary2, name2); + } + failIf(dylinkSection.length === 0, "need dylink section"); + binary2 = new Uint8Array(dylinkSection[0]); + end = binary2.length; + } else { + var int32View = new Uint32Array(new Uint8Array(binary2.subarray(0, 24)).buffer); + var magicNumberFound = int32View[0] == 1836278016 || int32View[0] == 6386541; + failIf(!magicNumberFound, "need to see wasm magic number"); + failIf(binary2[8] !== 0, "need the dylink section to be first"); + offset = 9; + var section_size = getLEB(); + end = offset + section_size; + name2 = getString(); + } + var customSection = { + neededDynlibs: [], + tlsExports: /* @__PURE__ */ new Set(), + weakImports: /* @__PURE__ */ new Set() + }; + if (name2 == "dylink") { + customSection.memorySize = getLEB(); + customSection.memoryAlign = getLEB(); + customSection.tableSize = getLEB(); + customSection.tableAlign = getLEB(); + var neededDynlibsCount = getLEB(); + for (var i2 = 0; i2 < neededDynlibsCount; ++i2) { + var libname = getString(); + customSection.neededDynlibs.push(libname); + } + } else { + failIf(name2 !== "dylink.0"); + var WASM_DYLINK_MEM_INFO = 1; + var WASM_DYLINK_NEEDED = 2; + var WASM_DYLINK_EXPORT_INFO = 3; + var WASM_DYLINK_IMPORT_INFO = 4; + var WASM_SYMBOL_TLS = 256; + var WASM_SYMBOL_BINDING_MASK = 3; + var WASM_SYMBOL_BINDING_WEAK = 1; + while (offset < end) { + var subsectionType = getU8(); + var subsectionSize = getLEB(); + if (subsectionType === WASM_DYLINK_MEM_INFO) { + customSection.memorySize = getLEB(); + customSection.memoryAlign = getLEB(); + customSection.tableSize = getLEB(); + customSection.tableAlign = getLEB(); + } else if (subsectionType === WASM_DYLINK_NEEDED) { + var neededDynlibsCount = getLEB(); + for (var i2 = 0; i2 < neededDynlibsCount; ++i2) { + libname = getString(); + customSection.neededDynlibs.push(libname); + } + } else if (subsectionType === WASM_DYLINK_EXPORT_INFO) { + var count = getLEB(); + while (count--) { + var symname = getString(); + var flags2 = getLEB(); + if (flags2 & WASM_SYMBOL_TLS) { + customSection.tlsExports.add(symname); + } + } + } else if (subsectionType === WASM_DYLINK_IMPORT_INFO) { + var count = getLEB(); + while (count--) { + var modname = getString(); + var symname = getString(); + var flags2 = getLEB(); + if ((flags2 & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) { + customSection.weakImports.add(symname); + } + } + } else { + offset += subsectionSize; + } + } + } + return customSection; + }, "getDylinkMetadata"); + function getValue(ptr, type = "i8") { + if (type.endsWith("*")) type = "*"; + switch (type) { + case "i1": + return HEAP8[ptr]; + case "i8": + return HEAP8[ptr]; + case "i16": + return LE_HEAP_LOAD_I16((ptr >> 1) * 2); + case "i32": + return LE_HEAP_LOAD_I32((ptr >> 2) * 4); + case "i64": + return HEAP64[ptr >> 3]; + case "float": + return LE_HEAP_LOAD_F32((ptr >> 2) * 4); + case "double": + return LE_HEAP_LOAD_F64((ptr >> 3) * 8); + case "*": + return LE_HEAP_LOAD_U32((ptr >> 2) * 4); + default: + abort(`invalid type for getValue: ${type}`); + } + } + __name(getValue, "getValue"); + var newDSO = /* @__PURE__ */ __name((name2, handle2, syms) => { + var dso = { + refcount: Infinity, + name: name2, + exports: syms, + global: true + }; + LDSO.loadedLibsByName[name2] = dso; + if (handle2 != void 0) { + LDSO.loadedLibsByHandle[handle2] = dso; + } + return dso; + }, "newDSO"); + var LDSO = { + loadedLibsByName: {}, + loadedLibsByHandle: {}, + init() { + newDSO("__main__", 0, wasmImports); + } + }; + var ___heap_base = 78224; + var alignMemory = /* @__PURE__ */ __name((size, alignment) => Math.ceil(size / alignment) * alignment, "alignMemory"); + var getMemory = /* @__PURE__ */ __name((size) => { + if (runtimeInitialized) { + return _calloc(size, 1); + } + var ret = ___heap_base; + var end = ret + alignMemory(size, 16); + ___heap_base = end; + GOT["__heap_base"].value = end; + return ret; + }, "getMemory"); + var isInternalSym = /* @__PURE__ */ __name((symName) => ["__cpp_exception", "__c_longjmp", "__wasm_apply_data_relocs", "__dso_handle", "__tls_size", "__tls_align", "__set_stack_limits", "_emscripten_tls_init", "__wasm_init_tls", "__wasm_call_ctors", "__start_em_asm", "__stop_em_asm", "__start_em_js", "__stop_em_js"].includes(symName) || symName.startsWith("__em_js__"), "isInternalSym"); + var uleb128Encode = /* @__PURE__ */ __name((n, target) => { + if (n < 128) { + target.push(n); + } else { + target.push(n % 128 | 128, n >> 7); + } + }, "uleb128Encode"); + var sigToWasmTypes = /* @__PURE__ */ __name((sig) => { + var typeNames = { + "i": "i32", + "j": "i64", + "f": "f32", + "d": "f64", + "e": "externref", + "p": "i32" + }; + var type = { + parameters: [], + results: sig[0] == "v" ? [] : [typeNames[sig[0]]] + }; + for (var i2 = 1; i2 < sig.length; ++i2) { + type.parameters.push(typeNames[sig[i2]]); + } + return type; + }, "sigToWasmTypes"); + var generateFuncType = /* @__PURE__ */ __name((sig, target) => { + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + "i": 127, + // i32 + "p": 127, + // i32 + "j": 126, + // i64 + "f": 125, + // f32 + "d": 124, + // f64 + "e": 111 + }; + target.push(96); + uleb128Encode(sigParam.length, target); + for (var i2 = 0; i2 < sigParam.length; ++i2) { + target.push(typeCodes[sigParam[i2]]); + } + if (sigRet == "v") { + target.push(0); + } else { + target.push(1, typeCodes[sigRet]); + } + }, "generateFuncType"); + var convertJsFunctionToWasm = /* @__PURE__ */ __name((func2, sig) => { + if (typeof WebAssembly.Function == "function") { + return new WebAssembly.Function(sigToWasmTypes(sig), func2); + } + var typeSectionBody = [1]; + generateFuncType(sig, typeSectionBody); + var bytes = [ + 0, + 97, + 115, + 109, + // magic ("\0asm") + 1, + 0, + 0, + 0, + // version: 1 + 1 + ]; + uleb128Encode(typeSectionBody.length, bytes); + bytes.push(...typeSectionBody); + bytes.push( + 2, + 7, + // import section + // (import "e" "f" (func 0 (type 0))) + 1, + 1, + 101, + 1, + 102, + 0, + 0, + 7, + 5, + // export section + // (export "f" (func 0 (type 0))) + 1, + 1, + 102, + 0, + 0 + ); + var module2 = new WebAssembly.Module(new Uint8Array(bytes)); + var instance2 = new WebAssembly.Instance(module2, { + "e": { + "f": func2 + } + }); + var wrappedFunc = instance2.exports["f"]; + return wrappedFunc; + }, "convertJsFunctionToWasm"); + var wasmTableMirror = []; + var wasmTable = new WebAssembly.Table({ + "initial": 31, + "element": "anyfunc" + }); + var getWasmTableEntry = /* @__PURE__ */ __name((funcPtr) => { + var func2 = wasmTableMirror[funcPtr]; + if (!func2) { + if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func2 = wasmTable.get(funcPtr); + } + return func2; + }, "getWasmTableEntry"); + var updateTableMap = /* @__PURE__ */ __name((offset, count) => { + if (functionsInTableMap) { + for (var i2 = offset; i2 < offset + count; i2++) { + var item = getWasmTableEntry(i2); + if (item) { + functionsInTableMap.set(item, i2); + } + } + } + }, "updateTableMap"); + var functionsInTableMap; + var getFunctionAddress = /* @__PURE__ */ __name((func2) => { + if (!functionsInTableMap) { + functionsInTableMap = /* @__PURE__ */ new WeakMap(); + updateTableMap(0, wasmTable.length); + } + return functionsInTableMap.get(func2) || 0; + }, "getFunctionAddress"); + var freeTableIndexes = []; + var getEmptyTableSlot = /* @__PURE__ */ __name(() => { + if (freeTableIndexes.length) { + return freeTableIndexes.pop(); + } + try { + wasmTable.grow(1); + } catch (err2) { + if (!(err2 instanceof RangeError)) { + throw err2; + } + throw "Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."; + } + return wasmTable.length - 1; + }, "getEmptyTableSlot"); + var setWasmTableEntry = /* @__PURE__ */ __name((idx, func2) => { + wasmTable.set(idx, func2); + wasmTableMirror[idx] = wasmTable.get(idx); + }, "setWasmTableEntry"); + var addFunction = /* @__PURE__ */ __name((func2, sig) => { + var rtn = getFunctionAddress(func2); + if (rtn) { + return rtn; + } + var ret = getEmptyTableSlot(); + try { + setWasmTableEntry(ret, func2); + } catch (err2) { + if (!(err2 instanceof TypeError)) { + throw err2; + } + var wrapped = convertJsFunctionToWasm(func2, sig); + setWasmTableEntry(ret, wrapped); + } + functionsInTableMap.set(func2, ret); + return ret; + }, "addFunction"); + var updateGOT = /* @__PURE__ */ __name((exports, replace) => { + for (var symName in exports) { + if (isInternalSym(symName)) { + continue; + } + var value = exports[symName]; + GOT[symName] ||= new WebAssembly.Global({ + "value": "i32", + "mutable": true + }); + if (replace || GOT[symName].value == 0) { + if (typeof value == "function") { + GOT[symName].value = addFunction(value); + } else if (typeof value == "number") { + GOT[symName].value = value; + } else { + err(`unhandled export type for '${symName}': ${typeof value}`); + } + } + } + }, "updateGOT"); + var relocateExports = /* @__PURE__ */ __name((exports, memoryBase2, replace) => { + var relocated = {}; + for (var e in exports) { + var value = exports[e]; + if (typeof value == "object") { + value = value.value; + } + if (typeof value == "number") { + value += memoryBase2; + } + relocated[e] = value; + } + updateGOT(relocated, replace); + return relocated; + }, "relocateExports"); + var isSymbolDefined = /* @__PURE__ */ __name((symName) => { + var existing = wasmImports[symName]; + if (!existing || existing.stub) { + return false; + } + return true; + }, "isSymbolDefined"); + var dynCall = /* @__PURE__ */ __name((sig, ptr, args2 = []) => { + var rtn = getWasmTableEntry(ptr)(...args2); + return rtn; + }, "dynCall"); + var stackSave = /* @__PURE__ */ __name(() => _emscripten_stack_get_current(), "stackSave"); + var stackRestore = /* @__PURE__ */ __name((val) => __emscripten_stack_restore(val), "stackRestore"); + var createInvokeFunction = /* @__PURE__ */ __name((sig) => (ptr, ...args2) => { + var sp = stackSave(); + try { + return dynCall(sig, ptr, args2); + } catch (e) { + stackRestore(sp); + if (e !== e + 0) throw e; + _setThrew(1, 0); + if (sig[0] == "j") return 0n; + } + }, "createInvokeFunction"); + var resolveGlobalSymbol = /* @__PURE__ */ __name((symName, direct = false) => { + var sym; + if (isSymbolDefined(symName)) { + sym = wasmImports[symName]; + } else if (symName.startsWith("invoke_")) { + sym = wasmImports[symName] = createInvokeFunction(symName.split("_")[1]); + } + return { + sym, + name: symName + }; + }, "resolveGlobalSymbol"); + var onPostCtors = []; + var addOnPostCtor = /* @__PURE__ */ __name((cb) => onPostCtors.unshift(cb), "addOnPostCtor"); + var UTF8ToString = /* @__PURE__ */ __name((ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "", "UTF8ToString"); + var loadWebAssemblyModule = /* @__PURE__ */ __name((binary, flags, libName, localScope, handle) => { + var metadata = getDylinkMetadata(binary); + currentModuleWeakSymbols = metadata.weakImports; + function loadModule() { + var memAlign = Math.pow(2, metadata.memoryAlign); + var memoryBase = metadata.memorySize ? alignMemory(getMemory(metadata.memorySize + memAlign), memAlign) : 0; + var tableBase = metadata.tableSize ? wasmTable.length : 0; + if (handle) { + HEAP8[handle + 8] = 1; + LE_HEAP_STORE_U32((handle + 12 >> 2) * 4, memoryBase); + LE_HEAP_STORE_I32((handle + 16 >> 2) * 4, metadata.memorySize); + LE_HEAP_STORE_U32((handle + 20 >> 2) * 4, tableBase); + LE_HEAP_STORE_I32((handle + 24 >> 2) * 4, metadata.tableSize); + } + if (metadata.tableSize) { + wasmTable.grow(metadata.tableSize); + } + var moduleExports; + function resolveSymbol(sym) { + var resolved = resolveGlobalSymbol(sym).sym; + if (!resolved && localScope) { + resolved = localScope[sym]; + } + if (!resolved) { + resolved = moduleExports[sym]; + } + return resolved; + } + __name(resolveSymbol, "resolveSymbol"); + var proxyHandler = { + get(stubs, prop) { + switch (prop) { + case "__memory_base": + return memoryBase; + case "__table_base": + return tableBase; + } + if (prop in wasmImports && !wasmImports[prop].stub) { + var res = wasmImports[prop]; + return res; + } + if (!(prop in stubs)) { + var resolved; + stubs[prop] = (...args2) => { + resolved ||= resolveSymbol(prop); + return resolved(...args2); + }; + } + return stubs[prop]; + } + }; + var proxy = new Proxy({}, proxyHandler); + var info = { + "GOT.mem": new Proxy({}, GOTHandler), + "GOT.func": new Proxy({}, GOTHandler), + "env": proxy, + "wasi_snapshot_preview1": proxy + }; + function postInstantiation(module, instance) { + updateTableMap(tableBase, metadata.tableSize); + moduleExports = relocateExports(instance.exports, memoryBase); + if (!flags.allowUndefined) { + reportUndefinedSymbols(); + } + function addEmAsm(addr, body) { + var args = []; + var arity = 0; + for (; arity < 16; arity++) { + if (body.indexOf("$" + arity) != -1) { + args.push("$" + arity); + } else { + break; + } + } + args = args.join(","); + var func = `(${args}) => { ${body} };`; + ASM_CONSTS[start] = eval(func); + } + __name(addEmAsm, "addEmAsm"); + if ("__start_em_asm" in moduleExports) { + var start = moduleExports["__start_em_asm"]; + var stop = moduleExports["__stop_em_asm"]; + while (start < stop) { + var jsString = UTF8ToString(start); + addEmAsm(start, jsString); + start = HEAPU8.indexOf(0, start) + 1; + } + } + function addEmJs(name, cSig, body) { + var jsArgs = []; + cSig = cSig.slice(1, -1); + if (cSig != "void") { + cSig = cSig.split(","); + for (var i in cSig) { + var jsArg = cSig[i].split(" ").pop(); + jsArgs.push(jsArg.replace("*", "")); + } + } + var func = `(${jsArgs}) => ${body};`; + moduleExports[name] = eval(func); + } + __name(addEmJs, "addEmJs"); + for (var name in moduleExports) { + if (name.startsWith("__em_js__")) { + var start = moduleExports[name]; + var jsString = UTF8ToString(start); + var parts = jsString.split("<::>"); + addEmJs(name.replace("__em_js__", ""), parts[0], parts[1]); + delete moduleExports[name]; + } + } + var applyRelocs = moduleExports["__wasm_apply_data_relocs"]; + if (applyRelocs) { + if (runtimeInitialized) { + applyRelocs(); + } else { + __RELOC_FUNCS__.push(applyRelocs); + } + } + var init = moduleExports["__wasm_call_ctors"]; + if (init) { + if (runtimeInitialized) { + init(); + } else { + addOnPostCtor(init); + } + } + return moduleExports; + } + __name(postInstantiation, "postInstantiation"); + if (flags.loadAsync) { + if (binary instanceof WebAssembly.Module) { + var instance = new WebAssembly.Instance(binary, info); + return Promise.resolve(postInstantiation(binary, instance)); + } + return WebAssembly.instantiate(binary, info).then((result) => postInstantiation(result.module, result.instance)); + } + var module = binary instanceof WebAssembly.Module ? binary : new WebAssembly.Module(binary); + var instance = new WebAssembly.Instance(module, info); + return postInstantiation(module, instance); + } + __name(loadModule, "loadModule"); + if (flags.loadAsync) { + return metadata.neededDynlibs.reduce((chain, dynNeeded) => chain.then(() => loadDynamicLibrary(dynNeeded, flags, localScope)), Promise.resolve()).then(loadModule); + } + metadata.neededDynlibs.forEach((needed) => loadDynamicLibrary(needed, flags, localScope)); + return loadModule(); + }, "loadWebAssemblyModule"); + var mergeLibSymbols = /* @__PURE__ */ __name((exports, libName2) => { + for (var [sym, exp] of Object.entries(exports)) { + const setImport = /* @__PURE__ */ __name((target) => { + if (!isSymbolDefined(target)) { + wasmImports[target] = exp; + } + }, "setImport"); + setImport(sym); + const main_alias = "__main_argc_argv"; + if (sym == "main") { + setImport(main_alias); + } + if (sym == main_alias) { + setImport("main"); + } + } + }, "mergeLibSymbols"); + var asyncLoad = /* @__PURE__ */ __name(async (url) => { + var arrayBuffer = await readAsync(url); + return new Uint8Array(arrayBuffer); + }, "asyncLoad"); + function loadDynamicLibrary(libName2, flags2 = { + global: true, + nodelete: true + }, localScope2, handle2) { + var dso = LDSO.loadedLibsByName[libName2]; + if (dso) { + if (!flags2.global) { + if (localScope2) { + Object.assign(localScope2, dso.exports); + } + } else if (!dso.global) { + dso.global = true; + mergeLibSymbols(dso.exports, libName2); + } + if (flags2.nodelete && dso.refcount !== Infinity) { + dso.refcount = Infinity; + } + dso.refcount++; + if (handle2) { + LDSO.loadedLibsByHandle[handle2] = dso; + } + return flags2.loadAsync ? Promise.resolve(true) : true; + } + dso = newDSO(libName2, handle2, "loading"); + dso.refcount = flags2.nodelete ? Infinity : 1; + dso.global = flags2.global; + function loadLibData() { + if (handle2) { + var data = LE_HEAP_LOAD_U32((handle2 + 28 >> 2) * 4); + var dataSize = LE_HEAP_LOAD_U32((handle2 + 32 >> 2) * 4); + if (data && dataSize) { + var libData = HEAP8.slice(data, data + dataSize); + return flags2.loadAsync ? Promise.resolve(libData) : libData; + } + } + var libFile = locateFile(libName2); + if (flags2.loadAsync) { + return asyncLoad(libFile); + } + if (!readBinary) { + throw new Error(`${libFile}: file not found, and synchronous loading of external files is not available`); + } + return readBinary(libFile); + } + __name(loadLibData, "loadLibData"); + function getExports() { + if (flags2.loadAsync) { + return loadLibData().then((libData) => loadWebAssemblyModule(libData, flags2, libName2, localScope2, handle2)); + } + return loadWebAssemblyModule(loadLibData(), flags2, libName2, localScope2, handle2); + } + __name(getExports, "getExports"); + function moduleLoaded(exports) { + if (dso.global) { + mergeLibSymbols(exports, libName2); + } else if (localScope2) { + Object.assign(localScope2, exports); + } + dso.exports = exports; + } + __name(moduleLoaded, "moduleLoaded"); + if (flags2.loadAsync) { + return getExports().then((exports) => { + moduleLoaded(exports); + return true; + }); + } + moduleLoaded(getExports()); + return true; + } + __name(loadDynamicLibrary, "loadDynamicLibrary"); + var reportUndefinedSymbols = /* @__PURE__ */ __name(() => { + for (var [symName, entry] of Object.entries(GOT)) { + if (entry.value == 0) { + var value = resolveGlobalSymbol(symName, true).sym; + if (!value && !entry.required) { + continue; + } + if (typeof value == "function") { + entry.value = addFunction(value, value.sig); + } else if (typeof value == "number") { + entry.value = value; + } else { + throw new Error(`bad export type for '${symName}': ${typeof value}`); + } + } + } + }, "reportUndefinedSymbols"); + var loadDylibs = /* @__PURE__ */ __name(() => { + if (!dynamicLibraries.length) { + reportUndefinedSymbols(); + return; + } + addRunDependency("loadDylibs"); + dynamicLibraries.reduce((chain, lib) => chain.then(() => loadDynamicLibrary(lib, { + loadAsync: true, + global: true, + nodelete: true, + allowUndefined: true + })), Promise.resolve()).then(() => { + reportUndefinedSymbols(); + removeRunDependency("loadDylibs"); + }); + }, "loadDylibs"); + var noExitRuntime = Module["noExitRuntime"] || true; + function setValue(ptr, value, type = "i8") { + if (type.endsWith("*")) type = "*"; + switch (type) { + case "i1": + HEAP8[ptr] = value; + break; + case "i8": + HEAP8[ptr] = value; + break; + case "i16": + LE_HEAP_STORE_I16((ptr >> 1) * 2, value); + break; + case "i32": + LE_HEAP_STORE_I32((ptr >> 2) * 4, value); + break; + case "i64": + HEAP64[ptr >> 3] = BigInt(value); + break; + case "float": + LE_HEAP_STORE_F32((ptr >> 2) * 4, value); + break; + case "double": + LE_HEAP_STORE_F64((ptr >> 3) * 8, value); + break; + case "*": + LE_HEAP_STORE_U32((ptr >> 2) * 4, value); + break; + default: + abort(`invalid type for setValue: ${type}`); + } + } + __name(setValue, "setValue"); + var ___memory_base = new WebAssembly.Global({ + "value": "i32", + "mutable": false + }, 1024); + var ___stack_pointer = new WebAssembly.Global({ + "value": "i32", + "mutable": true + }, 78224); + var ___table_base = new WebAssembly.Global({ + "value": "i32", + "mutable": false + }, 1); + var __abort_js = /* @__PURE__ */ __name(() => abort(""), "__abort_js"); + __abort_js.sig = "v"; + var _emscripten_get_now = /* @__PURE__ */ __name(() => performance.now(), "_emscripten_get_now"); + _emscripten_get_now.sig = "d"; + var _emscripten_date_now = /* @__PURE__ */ __name(() => Date.now(), "_emscripten_date_now"); + _emscripten_date_now.sig = "d"; + var nowIsMonotonic = 1; + var checkWasiClock = /* @__PURE__ */ __name((clock_id) => clock_id >= 0 && clock_id <= 3, "checkWasiClock"); + var INT53_MAX = 9007199254740992; + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = /* @__PURE__ */ __name((num) => num < INT53_MIN || num > INT53_MAX ? NaN : Number(num), "bigintToI53Checked"); + function _clock_time_get(clk_id, ignored_precision, ptime) { + ignored_precision = bigintToI53Checked(ignored_precision); + if (!checkWasiClock(clk_id)) { + return 28; + } + var now; + if (clk_id === 0) { + now = _emscripten_date_now(); + } else if (nowIsMonotonic) { + now = _emscripten_get_now(); + } else { + return 52; + } + var nsec = Math.round(now * 1e3 * 1e3); + HEAP64[ptime >> 3] = BigInt(nsec); + return 0; + } + __name(_clock_time_get, "_clock_time_get"); + _clock_time_get.sig = "iijp"; + var getHeapMax = /* @__PURE__ */ __name(() => ( + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + 2147483648 + ), "getHeapMax"); + var growMemory = /* @__PURE__ */ __name((size) => { + var b = wasmMemory.buffer; + var pages = (size - b.byteLength + 65535) / 65536 | 0; + try { + wasmMemory.grow(pages); + updateMemoryViews(); + return 1; + } catch (e) { + } + }, "growMemory"); + var _emscripten_resize_heap = /* @__PURE__ */ __name((requestedSize) => { + var oldSize = HEAPU8.length; + requestedSize >>>= 0; + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296); + var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)); + var replacement = growMemory(newSize); + if (replacement) { + return true; + } + } + return false; + }, "_emscripten_resize_heap"); + _emscripten_resize_heap.sig = "ip"; + var _fd_close = /* @__PURE__ */ __name((fd) => 52, "_fd_close"); + _fd_close.sig = "ii"; + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + return 70; + } + __name(_fd_seek, "_fd_seek"); + _fd_seek.sig = "iijip"; + var printCharBuffers = [null, [], []]; + var printChar = /* @__PURE__ */ __name((stream, curr) => { + var buffer = printCharBuffers[stream]; + if (curr === 0 || curr === 10) { + (stream === 1 ? out : err)(UTF8ArrayToString(buffer)); + buffer.length = 0; + } else { + buffer.push(curr); + } + }, "printChar"); + var flush_NO_FILESYSTEM = /* @__PURE__ */ __name(() => { + if (printCharBuffers[1].length) printChar(1, 10); + if (printCharBuffers[2].length) printChar(2, 10); + }, "flush_NO_FILESYSTEM"); + var SYSCALLS = { + varargs: void 0, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + } + }; + var _fd_write = /* @__PURE__ */ __name((fd, iov, iovcnt, pnum) => { + var num = 0; + for (var i2 = 0; i2 < iovcnt; i2++) { + var ptr = LE_HEAP_LOAD_U32((iov >> 2) * 4); + var len = LE_HEAP_LOAD_U32((iov + 4 >> 2) * 4); + iov += 8; + for (var j = 0; j < len; j++) { + printChar(fd, HEAPU8[ptr + j]); + } + num += len; + } + LE_HEAP_STORE_U32((pnum >> 2) * 4, num); + return 0; + }, "_fd_write"); + _fd_write.sig = "iippp"; + function _tree_sitter_log_callback(isLexMessage, messageAddress) { + if (Module.currentLogCallback) { + const message = UTF8ToString(messageAddress); + Module.currentLogCallback(message, isLexMessage !== 0); + } + } + __name(_tree_sitter_log_callback, "_tree_sitter_log_callback"); + function _tree_sitter_parse_callback(inputBufferAddress, index, row, column, lengthAddress) { + const INPUT_BUFFER_SIZE = 10 * 1024; + const string = Module.currentParseCallback(index, { + row, + column + }); + if (typeof string === "string") { + setValue(lengthAddress, string.length, "i32"); + stringToUTF16(string, inputBufferAddress, INPUT_BUFFER_SIZE); + } else { + setValue(lengthAddress, 0, "i32"); + } + } + __name(_tree_sitter_parse_callback, "_tree_sitter_parse_callback"); + function _tree_sitter_progress_callback(currentOffset, hasError) { + if (Module.currentProgressCallback) { + return Module.currentProgressCallback({ + currentOffset, + hasError + }); + } + return false; + } + __name(_tree_sitter_progress_callback, "_tree_sitter_progress_callback"); + function _tree_sitter_query_progress_callback(currentOffset) { + if (Module.currentQueryProgressCallback) { + return Module.currentQueryProgressCallback({ + currentOffset + }); + } + return false; + } + __name(_tree_sitter_query_progress_callback, "_tree_sitter_query_progress_callback"); + var runtimeKeepaliveCounter = 0; + var keepRuntimeAlive = /* @__PURE__ */ __name(() => noExitRuntime || runtimeKeepaliveCounter > 0, "keepRuntimeAlive"); + var _proc_exit = /* @__PURE__ */ __name((code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module["onExit"]?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }, "_proc_exit"); + _proc_exit.sig = "vi"; + var exitJS = /* @__PURE__ */ __name((status, implicit) => { + EXITSTATUS = status; + _proc_exit(status); + }, "exitJS"); + var handleException = /* @__PURE__ */ __name((e) => { + if (e instanceof ExitStatus || e == "unwind") { + return EXITSTATUS; + } + quit_(1, e); + }, "handleException"); + var lengthBytesUTF8 = /* @__PURE__ */ __name((str) => { + var len = 0; + for (var i2 = 0; i2 < str.length; ++i2) { + var c = str.charCodeAt(i2); + if (c <= 127) { + len++; + } else if (c <= 2047) { + len += 2; + } else if (c >= 55296 && c <= 57343) { + len += 4; + ++i2; + } else { + len += 3; + } + } + return len; + }, "lengthBytesUTF8"); + var stringToUTF8Array = /* @__PURE__ */ __name((str, heap, outIdx, maxBytesToWrite) => { + if (!(maxBytesToWrite > 0)) return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i2 = 0; i2 < str.length; ++i2) { + var u = str.charCodeAt(i2); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i2); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + }, "stringToUTF8Array"); + var stringToUTF8 = /* @__PURE__ */ __name((str, outPtr, maxBytesToWrite) => stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite), "stringToUTF8"); + var stackAlloc = /* @__PURE__ */ __name((sz) => __emscripten_stack_alloc(sz), "stackAlloc"); + var stringToUTF8OnStack = /* @__PURE__ */ __name((str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + }, "stringToUTF8OnStack"); + var AsciiToString = /* @__PURE__ */ __name((ptr) => { + var str = ""; + while (1) { + var ch = HEAPU8[ptr++]; + if (!ch) return str; + str += String.fromCharCode(ch); + } + }, "AsciiToString"); + var stringToUTF16 = /* @__PURE__ */ __name((str, outPtr, maxBytesToWrite) => { + maxBytesToWrite ??= 2147483647; + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; + var startPtr = outPtr; + var numCharsToWrite = maxBytesToWrite < str.length * 2 ? maxBytesToWrite / 2 : str.length; + for (var i2 = 0; i2 < numCharsToWrite; ++i2) { + var codeUnit = str.charCodeAt(i2); + LE_HEAP_STORE_I16((outPtr >> 1) * 2, codeUnit); + outPtr += 2; + } + LE_HEAP_STORE_I16((outPtr >> 1) * 2, 0); + return outPtr - startPtr; + }, "stringToUTF16"); + var wasmImports = { + /** @export */ + __heap_base: ___heap_base, + /** @export */ + __indirect_function_table: wasmTable, + /** @export */ + __memory_base: ___memory_base, + /** @export */ + __stack_pointer: ___stack_pointer, + /** @export */ + __table_base: ___table_base, + /** @export */ + _abort_js: __abort_js, + /** @export */ + clock_time_get: _clock_time_get, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write, + /** @export */ + memory: wasmMemory, + /** @export */ + tree_sitter_log_callback: _tree_sitter_log_callback, + /** @export */ + tree_sitter_parse_callback: _tree_sitter_parse_callback, + /** @export */ + tree_sitter_progress_callback: _tree_sitter_progress_callback, + /** @export */ + tree_sitter_query_progress_callback: _tree_sitter_query_progress_callback + }; + var wasmExports = await createWasm(); + var ___wasm_call_ctors = wasmExports["__wasm_call_ctors"]; + var _malloc = Module["_malloc"] = wasmExports["malloc"]; + var _calloc = Module["_calloc"] = wasmExports["calloc"]; + var _realloc = Module["_realloc"] = wasmExports["realloc"]; + var _free = Module["_free"] = wasmExports["free"]; + var _memcmp = Module["_memcmp"] = wasmExports["memcmp"]; + var _ts_language_symbol_count = Module["_ts_language_symbol_count"] = wasmExports["ts_language_symbol_count"]; + var _ts_language_state_count = Module["_ts_language_state_count"] = wasmExports["ts_language_state_count"]; + var _ts_language_version = Module["_ts_language_version"] = wasmExports["ts_language_version"]; + var _ts_language_abi_version = Module["_ts_language_abi_version"] = wasmExports["ts_language_abi_version"]; + var _ts_language_metadata = Module["_ts_language_metadata"] = wasmExports["ts_language_metadata"]; + var _ts_language_name = Module["_ts_language_name"] = wasmExports["ts_language_name"]; + var _ts_language_field_count = Module["_ts_language_field_count"] = wasmExports["ts_language_field_count"]; + var _ts_language_next_state = Module["_ts_language_next_state"] = wasmExports["ts_language_next_state"]; + var _ts_language_symbol_name = Module["_ts_language_symbol_name"] = wasmExports["ts_language_symbol_name"]; + var _ts_language_symbol_for_name = Module["_ts_language_symbol_for_name"] = wasmExports["ts_language_symbol_for_name"]; + var _strncmp = Module["_strncmp"] = wasmExports["strncmp"]; + var _ts_language_symbol_type = Module["_ts_language_symbol_type"] = wasmExports["ts_language_symbol_type"]; + var _ts_language_field_name_for_id = Module["_ts_language_field_name_for_id"] = wasmExports["ts_language_field_name_for_id"]; + var _ts_lookahead_iterator_new = Module["_ts_lookahead_iterator_new"] = wasmExports["ts_lookahead_iterator_new"]; + var _ts_lookahead_iterator_delete = Module["_ts_lookahead_iterator_delete"] = wasmExports["ts_lookahead_iterator_delete"]; + var _ts_lookahead_iterator_reset_state = Module["_ts_lookahead_iterator_reset_state"] = wasmExports["ts_lookahead_iterator_reset_state"]; + var _ts_lookahead_iterator_reset = Module["_ts_lookahead_iterator_reset"] = wasmExports["ts_lookahead_iterator_reset"]; + var _ts_lookahead_iterator_next = Module["_ts_lookahead_iterator_next"] = wasmExports["ts_lookahead_iterator_next"]; + var _ts_lookahead_iterator_current_symbol = Module["_ts_lookahead_iterator_current_symbol"] = wasmExports["ts_lookahead_iterator_current_symbol"]; + var _ts_parser_delete = Module["_ts_parser_delete"] = wasmExports["ts_parser_delete"]; + var _ts_parser_reset = Module["_ts_parser_reset"] = wasmExports["ts_parser_reset"]; + var _ts_parser_set_language = Module["_ts_parser_set_language"] = wasmExports["ts_parser_set_language"]; + var _ts_parser_timeout_micros = Module["_ts_parser_timeout_micros"] = wasmExports["ts_parser_timeout_micros"]; + var _ts_parser_set_timeout_micros = Module["_ts_parser_set_timeout_micros"] = wasmExports["ts_parser_set_timeout_micros"]; + var _ts_parser_set_included_ranges = Module["_ts_parser_set_included_ranges"] = wasmExports["ts_parser_set_included_ranges"]; + var _ts_query_new = Module["_ts_query_new"] = wasmExports["ts_query_new"]; + var _ts_query_delete = Module["_ts_query_delete"] = wasmExports["ts_query_delete"]; + var _iswspace = Module["_iswspace"] = wasmExports["iswspace"]; + var _iswalnum = Module["_iswalnum"] = wasmExports["iswalnum"]; + var _ts_query_pattern_count = Module["_ts_query_pattern_count"] = wasmExports["ts_query_pattern_count"]; + var _ts_query_capture_count = Module["_ts_query_capture_count"] = wasmExports["ts_query_capture_count"]; + var _ts_query_string_count = Module["_ts_query_string_count"] = wasmExports["ts_query_string_count"]; + var _ts_query_capture_name_for_id = Module["_ts_query_capture_name_for_id"] = wasmExports["ts_query_capture_name_for_id"]; + var _ts_query_capture_quantifier_for_id = Module["_ts_query_capture_quantifier_for_id"] = wasmExports["ts_query_capture_quantifier_for_id"]; + var _ts_query_string_value_for_id = Module["_ts_query_string_value_for_id"] = wasmExports["ts_query_string_value_for_id"]; + var _ts_query_predicates_for_pattern = Module["_ts_query_predicates_for_pattern"] = wasmExports["ts_query_predicates_for_pattern"]; + var _ts_query_start_byte_for_pattern = Module["_ts_query_start_byte_for_pattern"] = wasmExports["ts_query_start_byte_for_pattern"]; + var _ts_query_end_byte_for_pattern = Module["_ts_query_end_byte_for_pattern"] = wasmExports["ts_query_end_byte_for_pattern"]; + var _ts_query_is_pattern_rooted = Module["_ts_query_is_pattern_rooted"] = wasmExports["ts_query_is_pattern_rooted"]; + var _ts_query_is_pattern_non_local = Module["_ts_query_is_pattern_non_local"] = wasmExports["ts_query_is_pattern_non_local"]; + var _ts_query_is_pattern_guaranteed_at_step = Module["_ts_query_is_pattern_guaranteed_at_step"] = wasmExports["ts_query_is_pattern_guaranteed_at_step"]; + var _ts_query_disable_capture = Module["_ts_query_disable_capture"] = wasmExports["ts_query_disable_capture"]; + var _ts_query_disable_pattern = Module["_ts_query_disable_pattern"] = wasmExports["ts_query_disable_pattern"]; + var _ts_tree_copy = Module["_ts_tree_copy"] = wasmExports["ts_tree_copy"]; + var _ts_tree_delete = Module["_ts_tree_delete"] = wasmExports["ts_tree_delete"]; + var _ts_init = Module["_ts_init"] = wasmExports["ts_init"]; + var _ts_parser_new_wasm = Module["_ts_parser_new_wasm"] = wasmExports["ts_parser_new_wasm"]; + var _ts_parser_enable_logger_wasm = Module["_ts_parser_enable_logger_wasm"] = wasmExports["ts_parser_enable_logger_wasm"]; + var _ts_parser_parse_wasm = Module["_ts_parser_parse_wasm"] = wasmExports["ts_parser_parse_wasm"]; + var _ts_parser_included_ranges_wasm = Module["_ts_parser_included_ranges_wasm"] = wasmExports["ts_parser_included_ranges_wasm"]; + var _ts_language_type_is_named_wasm = Module["_ts_language_type_is_named_wasm"] = wasmExports["ts_language_type_is_named_wasm"]; + var _ts_language_type_is_visible_wasm = Module["_ts_language_type_is_visible_wasm"] = wasmExports["ts_language_type_is_visible_wasm"]; + var _ts_language_supertypes_wasm = Module["_ts_language_supertypes_wasm"] = wasmExports["ts_language_supertypes_wasm"]; + var _ts_language_subtypes_wasm = Module["_ts_language_subtypes_wasm"] = wasmExports["ts_language_subtypes_wasm"]; + var _ts_tree_root_node_wasm = Module["_ts_tree_root_node_wasm"] = wasmExports["ts_tree_root_node_wasm"]; + var _ts_tree_root_node_with_offset_wasm = Module["_ts_tree_root_node_with_offset_wasm"] = wasmExports["ts_tree_root_node_with_offset_wasm"]; + var _ts_tree_edit_wasm = Module["_ts_tree_edit_wasm"] = wasmExports["ts_tree_edit_wasm"]; + var _ts_tree_included_ranges_wasm = Module["_ts_tree_included_ranges_wasm"] = wasmExports["ts_tree_included_ranges_wasm"]; + var _ts_tree_get_changed_ranges_wasm = Module["_ts_tree_get_changed_ranges_wasm"] = wasmExports["ts_tree_get_changed_ranges_wasm"]; + var _ts_tree_cursor_new_wasm = Module["_ts_tree_cursor_new_wasm"] = wasmExports["ts_tree_cursor_new_wasm"]; + var _ts_tree_cursor_copy_wasm = Module["_ts_tree_cursor_copy_wasm"] = wasmExports["ts_tree_cursor_copy_wasm"]; + var _ts_tree_cursor_delete_wasm = Module["_ts_tree_cursor_delete_wasm"] = wasmExports["ts_tree_cursor_delete_wasm"]; + var _ts_tree_cursor_reset_wasm = Module["_ts_tree_cursor_reset_wasm"] = wasmExports["ts_tree_cursor_reset_wasm"]; + var _ts_tree_cursor_reset_to_wasm = Module["_ts_tree_cursor_reset_to_wasm"] = wasmExports["ts_tree_cursor_reset_to_wasm"]; + var _ts_tree_cursor_goto_first_child_wasm = Module["_ts_tree_cursor_goto_first_child_wasm"] = wasmExports["ts_tree_cursor_goto_first_child_wasm"]; + var _ts_tree_cursor_goto_last_child_wasm = Module["_ts_tree_cursor_goto_last_child_wasm"] = wasmExports["ts_tree_cursor_goto_last_child_wasm"]; + var _ts_tree_cursor_goto_first_child_for_index_wasm = Module["_ts_tree_cursor_goto_first_child_for_index_wasm"] = wasmExports["ts_tree_cursor_goto_first_child_for_index_wasm"]; + var _ts_tree_cursor_goto_first_child_for_position_wasm = Module["_ts_tree_cursor_goto_first_child_for_position_wasm"] = wasmExports["ts_tree_cursor_goto_first_child_for_position_wasm"]; + var _ts_tree_cursor_goto_next_sibling_wasm = Module["_ts_tree_cursor_goto_next_sibling_wasm"] = wasmExports["ts_tree_cursor_goto_next_sibling_wasm"]; + var _ts_tree_cursor_goto_previous_sibling_wasm = Module["_ts_tree_cursor_goto_previous_sibling_wasm"] = wasmExports["ts_tree_cursor_goto_previous_sibling_wasm"]; + var _ts_tree_cursor_goto_descendant_wasm = Module["_ts_tree_cursor_goto_descendant_wasm"] = wasmExports["ts_tree_cursor_goto_descendant_wasm"]; + var _ts_tree_cursor_goto_parent_wasm = Module["_ts_tree_cursor_goto_parent_wasm"] = wasmExports["ts_tree_cursor_goto_parent_wasm"]; + var _ts_tree_cursor_current_node_type_id_wasm = Module["_ts_tree_cursor_current_node_type_id_wasm"] = wasmExports["ts_tree_cursor_current_node_type_id_wasm"]; + var _ts_tree_cursor_current_node_state_id_wasm = Module["_ts_tree_cursor_current_node_state_id_wasm"] = wasmExports["ts_tree_cursor_current_node_state_id_wasm"]; + var _ts_tree_cursor_current_node_is_named_wasm = Module["_ts_tree_cursor_current_node_is_named_wasm"] = wasmExports["ts_tree_cursor_current_node_is_named_wasm"]; + var _ts_tree_cursor_current_node_is_missing_wasm = Module["_ts_tree_cursor_current_node_is_missing_wasm"] = wasmExports["ts_tree_cursor_current_node_is_missing_wasm"]; + var _ts_tree_cursor_current_node_id_wasm = Module["_ts_tree_cursor_current_node_id_wasm"] = wasmExports["ts_tree_cursor_current_node_id_wasm"]; + var _ts_tree_cursor_start_position_wasm = Module["_ts_tree_cursor_start_position_wasm"] = wasmExports["ts_tree_cursor_start_position_wasm"]; + var _ts_tree_cursor_end_position_wasm = Module["_ts_tree_cursor_end_position_wasm"] = wasmExports["ts_tree_cursor_end_position_wasm"]; + var _ts_tree_cursor_start_index_wasm = Module["_ts_tree_cursor_start_index_wasm"] = wasmExports["ts_tree_cursor_start_index_wasm"]; + var _ts_tree_cursor_end_index_wasm = Module["_ts_tree_cursor_end_index_wasm"] = wasmExports["ts_tree_cursor_end_index_wasm"]; + var _ts_tree_cursor_current_field_id_wasm = Module["_ts_tree_cursor_current_field_id_wasm"] = wasmExports["ts_tree_cursor_current_field_id_wasm"]; + var _ts_tree_cursor_current_depth_wasm = Module["_ts_tree_cursor_current_depth_wasm"] = wasmExports["ts_tree_cursor_current_depth_wasm"]; + var _ts_tree_cursor_current_descendant_index_wasm = Module["_ts_tree_cursor_current_descendant_index_wasm"] = wasmExports["ts_tree_cursor_current_descendant_index_wasm"]; + var _ts_tree_cursor_current_node_wasm = Module["_ts_tree_cursor_current_node_wasm"] = wasmExports["ts_tree_cursor_current_node_wasm"]; + var _ts_node_symbol_wasm = Module["_ts_node_symbol_wasm"] = wasmExports["ts_node_symbol_wasm"]; + var _ts_node_field_name_for_child_wasm = Module["_ts_node_field_name_for_child_wasm"] = wasmExports["ts_node_field_name_for_child_wasm"]; + var _ts_node_field_name_for_named_child_wasm = Module["_ts_node_field_name_for_named_child_wasm"] = wasmExports["ts_node_field_name_for_named_child_wasm"]; + var _ts_node_children_by_field_id_wasm = Module["_ts_node_children_by_field_id_wasm"] = wasmExports["ts_node_children_by_field_id_wasm"]; + var _ts_node_first_child_for_byte_wasm = Module["_ts_node_first_child_for_byte_wasm"] = wasmExports["ts_node_first_child_for_byte_wasm"]; + var _ts_node_first_named_child_for_byte_wasm = Module["_ts_node_first_named_child_for_byte_wasm"] = wasmExports["ts_node_first_named_child_for_byte_wasm"]; + var _ts_node_grammar_symbol_wasm = Module["_ts_node_grammar_symbol_wasm"] = wasmExports["ts_node_grammar_symbol_wasm"]; + var _ts_node_child_count_wasm = Module["_ts_node_child_count_wasm"] = wasmExports["ts_node_child_count_wasm"]; + var _ts_node_named_child_count_wasm = Module["_ts_node_named_child_count_wasm"] = wasmExports["ts_node_named_child_count_wasm"]; + var _ts_node_child_wasm = Module["_ts_node_child_wasm"] = wasmExports["ts_node_child_wasm"]; + var _ts_node_named_child_wasm = Module["_ts_node_named_child_wasm"] = wasmExports["ts_node_named_child_wasm"]; + var _ts_node_child_by_field_id_wasm = Module["_ts_node_child_by_field_id_wasm"] = wasmExports["ts_node_child_by_field_id_wasm"]; + var _ts_node_next_sibling_wasm = Module["_ts_node_next_sibling_wasm"] = wasmExports["ts_node_next_sibling_wasm"]; + var _ts_node_prev_sibling_wasm = Module["_ts_node_prev_sibling_wasm"] = wasmExports["ts_node_prev_sibling_wasm"]; + var _ts_node_next_named_sibling_wasm = Module["_ts_node_next_named_sibling_wasm"] = wasmExports["ts_node_next_named_sibling_wasm"]; + var _ts_node_prev_named_sibling_wasm = Module["_ts_node_prev_named_sibling_wasm"] = wasmExports["ts_node_prev_named_sibling_wasm"]; + var _ts_node_descendant_count_wasm = Module["_ts_node_descendant_count_wasm"] = wasmExports["ts_node_descendant_count_wasm"]; + var _ts_node_parent_wasm = Module["_ts_node_parent_wasm"] = wasmExports["ts_node_parent_wasm"]; + var _ts_node_child_with_descendant_wasm = Module["_ts_node_child_with_descendant_wasm"] = wasmExports["ts_node_child_with_descendant_wasm"]; + var _ts_node_descendant_for_index_wasm = Module["_ts_node_descendant_for_index_wasm"] = wasmExports["ts_node_descendant_for_index_wasm"]; + var _ts_node_named_descendant_for_index_wasm = Module["_ts_node_named_descendant_for_index_wasm"] = wasmExports["ts_node_named_descendant_for_index_wasm"]; + var _ts_node_descendant_for_position_wasm = Module["_ts_node_descendant_for_position_wasm"] = wasmExports["ts_node_descendant_for_position_wasm"]; + var _ts_node_named_descendant_for_position_wasm = Module["_ts_node_named_descendant_for_position_wasm"] = wasmExports["ts_node_named_descendant_for_position_wasm"]; + var _ts_node_start_point_wasm = Module["_ts_node_start_point_wasm"] = wasmExports["ts_node_start_point_wasm"]; + var _ts_node_end_point_wasm = Module["_ts_node_end_point_wasm"] = wasmExports["ts_node_end_point_wasm"]; + var _ts_node_start_index_wasm = Module["_ts_node_start_index_wasm"] = wasmExports["ts_node_start_index_wasm"]; + var _ts_node_end_index_wasm = Module["_ts_node_end_index_wasm"] = wasmExports["ts_node_end_index_wasm"]; + var _ts_node_to_string_wasm = Module["_ts_node_to_string_wasm"] = wasmExports["ts_node_to_string_wasm"]; + var _ts_node_children_wasm = Module["_ts_node_children_wasm"] = wasmExports["ts_node_children_wasm"]; + var _ts_node_named_children_wasm = Module["_ts_node_named_children_wasm"] = wasmExports["ts_node_named_children_wasm"]; + var _ts_node_descendants_of_type_wasm = Module["_ts_node_descendants_of_type_wasm"] = wasmExports["ts_node_descendants_of_type_wasm"]; + var _ts_node_is_named_wasm = Module["_ts_node_is_named_wasm"] = wasmExports["ts_node_is_named_wasm"]; + var _ts_node_has_changes_wasm = Module["_ts_node_has_changes_wasm"] = wasmExports["ts_node_has_changes_wasm"]; + var _ts_node_has_error_wasm = Module["_ts_node_has_error_wasm"] = wasmExports["ts_node_has_error_wasm"]; + var _ts_node_is_error_wasm = Module["_ts_node_is_error_wasm"] = wasmExports["ts_node_is_error_wasm"]; + var _ts_node_is_missing_wasm = Module["_ts_node_is_missing_wasm"] = wasmExports["ts_node_is_missing_wasm"]; + var _ts_node_is_extra_wasm = Module["_ts_node_is_extra_wasm"] = wasmExports["ts_node_is_extra_wasm"]; + var _ts_node_parse_state_wasm = Module["_ts_node_parse_state_wasm"] = wasmExports["ts_node_parse_state_wasm"]; + var _ts_node_next_parse_state_wasm = Module["_ts_node_next_parse_state_wasm"] = wasmExports["ts_node_next_parse_state_wasm"]; + var _ts_query_matches_wasm = Module["_ts_query_matches_wasm"] = wasmExports["ts_query_matches_wasm"]; + var _ts_query_captures_wasm = Module["_ts_query_captures_wasm"] = wasmExports["ts_query_captures_wasm"]; + var _memset = Module["_memset"] = wasmExports["memset"]; + var _memcpy = Module["_memcpy"] = wasmExports["memcpy"]; + var _memmove = Module["_memmove"] = wasmExports["memmove"]; + var _iswalpha = Module["_iswalpha"] = wasmExports["iswalpha"]; + var _iswblank = Module["_iswblank"] = wasmExports["iswblank"]; + var _iswdigit = Module["_iswdigit"] = wasmExports["iswdigit"]; + var _iswlower = Module["_iswlower"] = wasmExports["iswlower"]; + var _iswupper = Module["_iswupper"] = wasmExports["iswupper"]; + var _iswxdigit = Module["_iswxdigit"] = wasmExports["iswxdigit"]; + var _memchr = Module["_memchr"] = wasmExports["memchr"]; + var _strlen = Module["_strlen"] = wasmExports["strlen"]; + var _strcmp = Module["_strcmp"] = wasmExports["strcmp"]; + var _strncat = Module["_strncat"] = wasmExports["strncat"]; + var _strncpy = Module["_strncpy"] = wasmExports["strncpy"]; + var _towlower = Module["_towlower"] = wasmExports["towlower"]; + var _towupper = Module["_towupper"] = wasmExports["towupper"]; + var _setThrew = wasmExports["setThrew"]; + var __emscripten_stack_restore = wasmExports["_emscripten_stack_restore"]; + var __emscripten_stack_alloc = wasmExports["_emscripten_stack_alloc"]; + var _emscripten_stack_get_current = wasmExports["emscripten_stack_get_current"]; + var ___wasm_apply_data_relocs = wasmExports["__wasm_apply_data_relocs"]; + Module["setValue"] = setValue; + Module["getValue"] = getValue; + Module["UTF8ToString"] = UTF8ToString; + Module["stringToUTF8"] = stringToUTF8; + Module["lengthBytesUTF8"] = lengthBytesUTF8; + Module["AsciiToString"] = AsciiToString; + Module["stringToUTF16"] = stringToUTF16; + Module["loadWebAssemblyModule"] = loadWebAssemblyModule; + function callMain(args2 = []) { + var entryFunction = resolveGlobalSymbol("main").sym; + if (!entryFunction) return; + args2.unshift(thisProgram); + var argc = args2.length; + var argv = stackAlloc((argc + 1) * 4); + var argv_ptr = argv; + args2.forEach((arg) => { + LE_HEAP_STORE_U32((argv_ptr >> 2) * 4, stringToUTF8OnStack(arg)); + argv_ptr += 4; + }); + LE_HEAP_STORE_U32((argv_ptr >> 2) * 4, 0); + try { + var ret = entryFunction(argc, argv); + exitJS( + ret, + /* implicit = */ + true + ); + return ret; + } catch (e) { + return handleException(e); + } + } + __name(callMain, "callMain"); + function run(args2 = arguments_) { + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + preRun(); + if (runDependencies > 0) { + dependenciesFulfilled = run; + return; + } + function doRun() { + Module["calledRun"] = true; + if (ABORT) return; + initRuntime(); + preMain(); + readyPromiseResolve(Module); + Module["onRuntimeInitialized"]?.(); + var noInitialRun = Module["noInitialRun"]; + if (!noInitialRun) callMain(args2); + postRun(); + } + __name(doRun, "doRun"); + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(() => { + setTimeout(() => Module["setStatus"](""), 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + __name(run, "run"); + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + moduleRtn = readyPromise; + return moduleRtn; + }; +})(); +var tree_sitter_default = Module2; + +// src/bindings.ts +var Module3 = null; +async function initializeBinding(moduleOptions) { + if (!Module3) { + Module3 = await tree_sitter_default(moduleOptions); + } + return Module3; +} +__name(initializeBinding, "initializeBinding"); +function checkModule() { + return !!Module3; +} +__name(checkModule, "checkModule"); + +// src/parser.ts +var TRANSFER_BUFFER; +var LANGUAGE_VERSION; +var MIN_COMPATIBLE_VERSION; +var Parser = class { + static { + __name(this, "Parser"); + } + /** @internal */ + [0] = 0; + // Internal handle for WASM + /** @internal */ + [1] = 0; + // Internal handle for WASM + /** @internal */ + logCallback = null; + /** The parser's current language. */ + language = null; + /** + * This must always be called before creating a Parser. + * + * You can optionally pass in options to configure the WASM module, the most common + * one being `locateFile` to help the module find the `.wasm` file. + */ + static async init(moduleOptions) { + setModule(await initializeBinding(moduleOptions)); + TRANSFER_BUFFER = C._ts_init(); + LANGUAGE_VERSION = C.getValue(TRANSFER_BUFFER, "i32"); + MIN_COMPATIBLE_VERSION = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + } + /** + * Create a new parser. + */ + constructor() { + this.initialize(); + } + /** @internal */ + initialize() { + if (!checkModule()) { + throw new Error("cannot construct a Parser before calling `init()`"); + } + C._ts_parser_new_wasm(); + this[0] = C.getValue(TRANSFER_BUFFER, "i32"); + this[1] = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + } + /** Delete the parser, freeing its resources. */ + delete() { + C._ts_parser_delete(this[0]); + C._free(this[1]); + this[0] = 0; + this[1] = 0; + } + /** + * Set the language that the parser should use for parsing. + * + * If the language was not successfully assigned, an error will be thrown. + * This happens if the language was generated with an incompatible + * version of the Tree-sitter CLI. Check the language's version using + * {@link Language#version} and compare it to this library's + * {@link LANGUAGE_VERSION} and {@link MIN_COMPATIBLE_VERSION} constants. + */ + setLanguage(language) { + let address; + if (!language) { + address = 0; + this.language = null; + } else if (language.constructor === Language) { + address = language[0]; + const version = C._ts_language_version(address); + if (version < MIN_COMPATIBLE_VERSION || LANGUAGE_VERSION < version) { + throw new Error( + `Incompatible language version ${version}. Compatibility range ${MIN_COMPATIBLE_VERSION} through ${LANGUAGE_VERSION}.` + ); + } + this.language = language; + } else { + throw new Error("Argument must be a Language"); + } + C._ts_parser_set_language(this[0], address); + return this; + } + /** + * Parse a slice of UTF8 text. + * + * @param {string | ParseCallback} callback - The UTF8-encoded text to parse or a callback function. + * + * @param {Tree | null} [oldTree] - A previous syntax tree parsed from the same document. If the text of the + * document has changed since `oldTree` was created, then you must edit `oldTree` to match + * the new text using {@link Tree#edit}. + * + * @param {ParseOptions} [options] - Options for parsing the text. + * This can be used to set the included ranges, or a progress callback. + * + * @returns {Tree | null} A {@link Tree} if parsing succeeded, or `null` if: + * - The parser has not yet had a language assigned with {@link Parser#setLanguage}. + * - The progress callback returned true. + */ + parse(callback, oldTree, options) { + if (typeof callback === "string") { + C.currentParseCallback = (index) => callback.slice(index); + } else if (typeof callback === "function") { + C.currentParseCallback = callback; + } else { + throw new Error("Argument must be a string or a function"); + } + if (options?.progressCallback) { + C.currentProgressCallback = options.progressCallback; + } else { + C.currentProgressCallback = null; + } + if (this.logCallback) { + C.currentLogCallback = this.logCallback; + C._ts_parser_enable_logger_wasm(this[0], 1); + } else { + C.currentLogCallback = null; + C._ts_parser_enable_logger_wasm(this[0], 0); + } + let rangeCount = 0; + let rangeAddress = 0; + if (options?.includedRanges) { + rangeCount = options.includedRanges.length; + rangeAddress = C._calloc(rangeCount, SIZE_OF_RANGE); + let address = rangeAddress; + for (let i2 = 0; i2 < rangeCount; i2++) { + marshalRange(address, options.includedRanges[i2]); + address += SIZE_OF_RANGE; + } + } + const treeAddress = C._ts_parser_parse_wasm( + this[0], + this[1], + oldTree ? oldTree[0] : 0, + rangeAddress, + rangeCount + ); + if (!treeAddress) { + C.currentParseCallback = null; + C.currentLogCallback = null; + C.currentProgressCallback = null; + return null; + } + if (!this.language) { + throw new Error("Parser must have a language to parse"); + } + const result = new Tree(INTERNAL, treeAddress, this.language, C.currentParseCallback); + C.currentParseCallback = null; + C.currentLogCallback = null; + C.currentProgressCallback = null; + return result; + } + /** + * Instruct the parser to start the next parse from the beginning. + * + * If the parser previously failed because of a timeout, cancellation, + * or callback, then by default, it will resume where it left off on the + * next call to {@link Parser#parse} or other parsing functions. + * If you don't want to resume, and instead intend to use this parser to + * parse some other document, you must call `reset` first. + */ + reset() { + C._ts_parser_reset(this[0]); + } + /** Get the ranges of text that the parser will include when parsing. */ + getIncludedRanges() { + C._ts_parser_included_ranges_wasm(this[0]); + const count = C.getValue(TRANSFER_BUFFER, "i32"); + const buffer = C.getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); + const result = new Array(count); + if (count > 0) { + let address = buffer; + for (let i2 = 0; i2 < count; i2++) { + result[i2] = unmarshalRange(address); + address += SIZE_OF_RANGE; + } + C._free(buffer); + } + return result; + } + /** + * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse} + * + * Get the duration in microseconds that parsing is allowed to take. + * + * This is set via {@link Parser#setTimeoutMicros}. + */ + getTimeoutMicros() { + return C._ts_parser_timeout_micros(this[0]); + } + /** + * @deprecated since version 0.25.0, prefer passing a progress callback to {@link Parser#parse} + * + * Set the maximum duration in microseconds that parsing should be allowed + * to take before halting. + * + * If parsing takes longer than this, it will halt early, returning `null`. + * See {@link Parser#parse} for more information. + */ + setTimeoutMicros(timeout) { + C._ts_parser_set_timeout_micros(this[0], 0, timeout); + } + /** Set the logging callback that a parser should use during parsing. */ + setLogger(callback) { + if (!callback) { + this.logCallback = null; + } else if (typeof callback !== "function") { + throw new Error("Logger callback must be a function"); + } else { + this.logCallback = callback; + } + return this; + } + /** Get the parser's current logger. */ + getLogger() { + return this.logCallback; + } +}; +export { + CaptureQuantifier, + LANGUAGE_VERSION, + Language, + LookaheadIterator, + MIN_COMPATIBLE_VERSION, + Node, + Parser, + Query, + Tree, + TreeCursor +}; +//# sourceMappingURL=tree-sitter.js.map diff --git a/web/lib/tree-sitter.wasm b/web/lib/tree-sitter.wasm new file mode 100644 index 0000000000000000000000000000000000000000..54a7a110d3c5fdf7c7e7fc8e426530e2e230f634 GIT binary patch literal 205491 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%0A7Az>J6p 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 literal 0 HcmV?d00001