#!/usr/bin/env node "use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); // ../../../node_modules/.pnpm/web-tree-sitter@0.22.6/node_modules/web-tree-sitter/tree-sitter.js var require_tree_sitter = __commonJS({ "../../../node_modules/.pnpm/web-tree-sitter@0.22.6/node_modules/web-tree-sitter/tree-sitter.js"(exports, module) { var Module = void 0 !== Module ? Module : {}; var TreeSitter = function() { var initPromise, document = "object" == typeof window ? { currentScript: window.document.currentScript } : null; class Parser { constructor() { this.initialize(); } initialize() { throw new Error("cannot construct a Parser before calling `init()`"); } static init(moduleOptions) { return initPromise || (Module = Object.assign({}, Module, moduleOptions), initPromise = new Promise((resolveInitPromise) => { var moduleOverrides = Object.assign({}, Module), arguments_ = [], thisProgram = "./this.program", quit_ = (e, t) => { throw t; }, ENVIRONMENT_IS_WEB = "object" == typeof window, ENVIRONMENT_IS_WORKER = "function" == typeof importScripts, ENVIRONMENT_IS_NODE = "object" == typeof process && "object" == typeof process.versions && "string" == typeof process.versions.node, scriptDirectory = "", read_, readAsync, readBinary; function locateFile(e) { return Module.locateFile ? Module.locateFile(e, scriptDirectory) : scriptDirectory + e; } if (ENVIRONMENT_IS_NODE) { var fs = require("fs"), nodePath = require("path"); scriptDirectory = ENVIRONMENT_IS_WORKER ? nodePath.dirname(scriptDirectory) + "/" : __dirname + "/", read_ = (e, t) => (e = isFileURI(e) ? new URL(e) : nodePath.normalize(e), fs.readFileSync(e, t ? void 0 : "utf8")), readBinary = (e) => { var t = read_(e, true); return t.buffer || (t = new Uint8Array(t)), t; }, readAsync = (e, t, _, s = true) => { e = isFileURI(e) ? new URL(e) : nodePath.normalize(e), fs.readFile(e, s ? void 0 : "utf8", (e2, r) => { e2 ? _(e2) : t(s ? r.buffer : r); }); }, !Module.thisProgram && process.argv.length > 1 && (thisProgram = process.argv[1].replace(/\\/g, "/")), arguments_ = process.argv.slice(2), "undefined" != typeof module && (module.exports = Module), quit_ = (e, t) => { throw process.exitCode = e, t; }; } else (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && (ENVIRONMENT_IS_WORKER ? scriptDirectory = self.location.href : void 0 !== document && document.currentScript && (scriptDirectory = document.currentScript.src), scriptDirectory = scriptDirectory.startsWith("blob:") ? "" : scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1), read_ = (e) => { var t = new XMLHttpRequest(); return t.open("GET", e, false), t.send(null), t.responseText; }, ENVIRONMENT_IS_WORKER && (readBinary = (e) => { var t = new XMLHttpRequest(); return t.open("GET", e, false), t.responseType = "arraybuffer", t.send(null), new Uint8Array(t.response); }), readAsync = (e, t, _) => { var s = new XMLHttpRequest(); s.open("GET", e, true), s.responseType = "arraybuffer", s.onload = () => { 200 == s.status || 0 == s.status && s.response ? t(s.response) : _(); }, s.onerror = _, s.send(null); }); var out = Module.print || console.log.bind(console), err = Module.printErr || console.error.bind(console); Object.assign(Module, moduleOverrides), moduleOverrides = null, Module.arguments && (arguments_ = Module.arguments), Module.thisProgram && (thisProgram = Module.thisProgram), Module.quit && (quit_ = Module.quit); var dynamicLibraries = Module.dynamicLibraries || [], wasmBinary, wasmMemory; Module.wasmBinary && (wasmBinary = Module.wasmBinary), "object" != typeof WebAssembly && abort("no native wasm support detected"); var ABORT = false, EXITSTATUS, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; function updateMemoryViews() { var e = wasmMemory.buffer; Module.HEAP8 = HEAP8 = new Int8Array(e), Module.HEAP16 = HEAP16 = new Int16Array(e), Module.HEAPU8 = HEAPU8 = new Uint8Array(e), Module.HEAPU16 = HEAPU16 = new Uint16Array(e), Module.HEAP32 = HEAP32 = new Int32Array(e), Module.HEAPU32 = HEAPU32 = new Uint32Array(e), Module.HEAPF32 = HEAPF32 = new Float32Array(e), Module.HEAPF64 = HEAPF64 = new Float64Array(e); } var INITIAL_MEMORY = Module.INITIAL_MEMORY || 33554432; wasmMemory = Module.wasmMemory ? Module.wasmMemory : new WebAssembly.Memory({ initial: INITIAL_MEMORY / 65536, maximum: 32768 }), updateMemoryViews(), INITIAL_MEMORY = wasmMemory.buffer.byteLength; var __ATPRERUN__ = [], __ATINIT__ = [], __ATMAIN__ = [], __ATPOSTRUN__ = [], __RELOC_FUNCS__ = [], runtimeInitialized = false; function preRun() { if (Module.preRun) for ("function" == typeof Module.preRun && (Module.preRun = [Module.preRun]); Module.preRun.length; ) addOnPreRun(Module.preRun.shift()); callRuntimeCallbacks(__ATPRERUN__); } function initRuntime() { runtimeInitialized = true, callRuntimeCallbacks(__RELOC_FUNCS__), callRuntimeCallbacks(__ATINIT__); } function preMain() { callRuntimeCallbacks(__ATMAIN__); } function postRun() { if (Module.postRun) for ("function" == typeof Module.postRun && (Module.postRun = [Module.postRun]); Module.postRun.length; ) addOnPostRun(Module.postRun.shift()); callRuntimeCallbacks(__ATPOSTRUN__); } function addOnPreRun(e) { __ATPRERUN__.unshift(e); } function addOnInit(e) { __ATINIT__.unshift(e); } function addOnPostRun(e) { __ATPOSTRUN__.unshift(e); } var runDependencies = 0, runDependencyWatcher = null, dependenciesFulfilled = null; function getUniqueRunDependency(e) { return e; } function addRunDependency(e) { runDependencies++, Module.monitorRunDependencies?.(runDependencies); } function removeRunDependency(e) { if (runDependencies--, Module.monitorRunDependencies?.(runDependencies), 0 == runDependencies && (null !== runDependencyWatcher && (clearInterval(runDependencyWatcher), runDependencyWatcher = null), dependenciesFulfilled)) { var t = dependenciesFulfilled; dependenciesFulfilled = null, t(); } } function abort(e) { throw Module.onAbort?.(e), err(e = "Aborted(" + e + ")"), ABORT = true, EXITSTATUS = 1, e += ". Build with -sASSERTIONS for more info.", new WebAssembly.RuntimeError(e); } var dataURIPrefix = "data:application/octet-stream;base64,", isDataURI = (e) => e.startsWith(dataURIPrefix), isFileURI = (e) => e.startsWith("file://"), wasmBinaryFile; function getBinarySync(e) { if (e == wasmBinaryFile && wasmBinary) return new Uint8Array(wasmBinary); if (readBinary) return readBinary(e); throw "both async and sync fetching of the wasm failed"; } function getBinaryPromise(e) { if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { if ("function" == typeof fetch && !isFileURI(e)) return fetch(e, { credentials: "same-origin" }).then((t) => { if (!t.ok) throw `failed to load wasm binary file at '${e}'`; return t.arrayBuffer(); }).catch(() => getBinarySync(e)); if (readAsync) return new Promise((t, _) => { readAsync(e, (e2) => t(new Uint8Array(e2)), _); }); } return Promise.resolve().then(() => getBinarySync(e)); } function instantiateArrayBuffer(e, t, _) { return getBinaryPromise(e).then((e2) => WebAssembly.instantiate(e2, t)).then(_, (e2) => { err(`failed to asynchronously prepare wasm: ${e2}`), abort(e2); }); } function instantiateAsync(e, t, _, s) { return e || "function" != typeof WebAssembly.instantiateStreaming || isDataURI(t) || isFileURI(t) || ENVIRONMENT_IS_NODE || "function" != typeof fetch ? instantiateArrayBuffer(t, _, s) : fetch(t, { credentials: "same-origin" }).then((e2) => WebAssembly.instantiateStreaming(e2, _).then(s, function(e3) { return err(`wasm streaming compile failed: ${e3}`), err("falling back to ArrayBuffer instantiation"), instantiateArrayBuffer(t, _, s); })); } function createWasm() { var e = { env: wasmImports, wasi_snapshot_preview1: wasmImports, "GOT.mem": new Proxy(wasmImports, GOTHandler), "GOT.func": new Proxy(wasmImports, GOTHandler) }; function t(e2, t2) { wasmExports = e2.exports, wasmExports = relocateExports(wasmExports, 1024); var _ = getDylinkMetadata(t2); return _.neededDynlibs && (dynamicLibraries = _.neededDynlibs.concat(dynamicLibraries)), mergeLibSymbols(wasmExports, "main"), LDSO.init(), loadDylibs(), addOnInit(wasmExports.__wasm_call_ctors), __RELOC_FUNCS__.push(wasmExports.__wasm_apply_data_relocs), removeRunDependency("wasm-instantiate"), wasmExports; } if (addRunDependency("wasm-instantiate"), Module.instantiateWasm) try { return Module.instantiateWasm(e, t); } catch (e2) { return err(`Module.instantiateWasm callback failed with error: ${e2}`), false; } return instantiateAsync(wasmBinary, wasmBinaryFile, e, function(e2) { t(e2.instance, e2.module); }), {}; } wasmBinaryFile = "tree-sitter.wasm", isDataURI(wasmBinaryFile) || (wasmBinaryFile = locateFile(wasmBinaryFile)); var ASM_CONSTS = {}; function ExitStatus(e) { this.name = "ExitStatus", this.message = `Program terminated with exit(${e})`, this.status = e; } var GOT = {}, currentModuleWeakSymbols = /* @__PURE__ */ new Set([]), GOTHandler = { get(e, t) { var _ = GOT[t]; return _ || (_ = GOT[t] = new WebAssembly.Global({ value: "i32", mutable: true })), currentModuleWeakSymbols.has(t) || (_.required = true), _; } }, callRuntimeCallbacks = (e) => { for (; e.length > 0; ) e.shift()(Module); }, UTF8Decoder = "undefined" != typeof TextDecoder ? new TextDecoder("utf8") : void 0, UTF8ArrayToString = (e, t, _) => { for (var s = t + _, r = t; e[r] && !(r >= s); ) ++r; if (r - t > 16 && e.buffer && UTF8Decoder) return UTF8Decoder.decode(e.subarray(t, r)); for (var a = ""; t < r; ) { var o = e[t++]; if (128 & o) { var n = 63 & e[t++]; if (192 != (224 & o)) { var l = 63 & e[t++]; if ((o = 224 == (240 & o) ? (15 & o) << 12 | n << 6 | l : (7 & o) << 18 | n << 12 | l << 6 | 63 & e[t++]) < 65536) a += String.fromCharCode(o); else { var d = o - 65536; a += String.fromCharCode(55296 | d >> 10, 56320 | 1023 & d); } } else a += String.fromCharCode((31 & o) << 6 | n); } else a += String.fromCharCode(o); } return a; }, getDylinkMetadata = (e) => { var t = 0, _ = 0; function s() { for (var _2 = 0, s2 = 1; ; ) { var r2 = e[t++]; if (_2 += (127 & r2) * s2, s2 *= 128, !(128 & r2)) break; } return _2; } function r() { var _2 = s(); return UTF8ArrayToString(e, (t += _2) - _2, _2); } function a(e2, t2) { if (e2) throw new Error(t2); } var o = "dylink.0"; if (e instanceof WebAssembly.Module) { var n = WebAssembly.Module.customSections(e, o); 0 === n.length && (o = "dylink", n = WebAssembly.Module.customSections(e, o)), a(0 === n.length, "need dylink section"), _ = (e = new Uint8Array(n[0])).length; } else { a(!(1836278016 == new Uint32Array(new Uint8Array(e.subarray(0, 24)).buffer)[0]), "need to see wasm magic number"), a(0 !== e[8], "need the dylink section to be first"), t = 9; var l = s(); _ = t + l, o = r(); } var d = { neededDynlibs: [], tlsExports: /* @__PURE__ */ new Set(), weakImports: /* @__PURE__ */ new Set() }; if ("dylink" == o) { d.memorySize = s(), d.memoryAlign = s(), d.tableSize = s(), d.tableAlign = s(); for (var u = s(), m = 0; m < u; ++m) { var c = r(); d.neededDynlibs.push(c); } } else { a("dylink.0" !== o); for (; t < _; ) { var w = e[t++], p = s(); if (1 === w) d.memorySize = s(), d.memoryAlign = s(), d.tableSize = s(), d.tableAlign = s(); else if (2 === w) for (u = s(), m = 0; m < u; ++m) c = r(), d.neededDynlibs.push(c); else if (3 === w) for (var h = s(); h--; ) { var g = r(); 256 & s() && d.tlsExports.add(g); } else if (4 === w) for (h = s(); h--; ) { r(), g = r(); 1 == (3 & s()) && d.weakImports.add(g); } else t += p; } } return d; }; function getValue(e, t = "i8") { switch (t.endsWith("*") && (t = "*"), t) { case "i1": case "i8": return HEAP8[e]; case "i16": return HEAP16[e >> 1]; case "i32": return HEAP32[e >> 2]; case "i64": abort("to do getValue(i64) use WASM_BIGINT"); case "float": return HEAPF32[e >> 2]; case "double": return HEAPF64[e >> 3]; case "*": return HEAPU32[e >> 2]; default: abort(`invalid type for getValue: ${t}`); } } var newDSO = (e, t, _) => { var s = { refcount: 1 / 0, name: e, exports: _, global: true }; return LDSO.loadedLibsByName[e] = s, null != t && (LDSO.loadedLibsByHandle[t] = s), s; }, LDSO = { loadedLibsByName: {}, loadedLibsByHandle: {}, init() { newDSO("__main__", 0, wasmImports); } }, ___heap_base = 78096, zeroMemory = (e, t) => (HEAPU8.fill(0, e, e + t), e), alignMemory = (e, t) => Math.ceil(e / t) * t, getMemory = (e) => { if (runtimeInitialized) return zeroMemory(_malloc(e), e); var t = ___heap_base, _ = t + alignMemory(e, 16); return ___heap_base = _, GOT.__heap_base.value = _, t; }, isInternalSym = (e) => ["__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(e) || e.startsWith("__em_js__"), uleb128Encode = (e, t) => { e < 128 ? t.push(e) : t.push(e % 128 | 128, e >> 7); }, sigToWasmTypes = (e) => { for (var t = { i: "i32", j: "i64", f: "f32", d: "f64", e: "externref", p: "i32" }, _ = { parameters: [], results: "v" == e[0] ? [] : [t[e[0]]] }, s = 1; s < e.length; ++s) _.parameters.push(t[e[s]]); return _; }, generateFuncType = (e, t) => { var _ = e.slice(0, 1), s = e.slice(1), r = { i: 127, p: 127, j: 126, f: 125, d: 124, e: 111 }; t.push(96), uleb128Encode(s.length, t); for (var a = 0; a < s.length; ++a) t.push(r[s[a]]); "v" == _ ? t.push(0) : t.push(1, r[_]); }, convertJsFunctionToWasm = (e, t) => { if ("function" == typeof WebAssembly.Function) return new WebAssembly.Function(sigToWasmTypes(t), e); var _ = [1]; generateFuncType(t, _); var s = [0, 97, 115, 109, 1, 0, 0, 0, 1]; uleb128Encode(_.length, s), s.push(..._), s.push(2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0); var r = new WebAssembly.Module(new Uint8Array(s)); return new WebAssembly.Instance(r, { e: { f: e } }).exports.f; }, wasmTableMirror = [], wasmTable = new WebAssembly.Table({ initial: 27, element: "anyfunc" }), getWasmTableEntry = (e) => { var t = wasmTableMirror[e]; return t || (e >= wasmTableMirror.length && (wasmTableMirror.length = e + 1), wasmTableMirror[e] = t = wasmTable.get(e)), t; }, updateTableMap = (e, t) => { if (functionsInTableMap) for (var _ = e; _ < e + t; _++) { var s = getWasmTableEntry(_); s && functionsInTableMap.set(s, _); } }, functionsInTableMap, getFunctionAddress = (e) => (functionsInTableMap || (functionsInTableMap = /* @__PURE__ */ new WeakMap(), updateTableMap(0, wasmTable.length)), functionsInTableMap.get(e) || 0), freeTableIndexes = [], getEmptyTableSlot = () => { if (freeTableIndexes.length) return freeTableIndexes.pop(); try { wasmTable.grow(1); } catch (e) { if (!(e instanceof RangeError)) throw e; throw "Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."; } return wasmTable.length - 1; }, setWasmTableEntry = (e, t) => { wasmTable.set(e, t), wasmTableMirror[e] = wasmTable.get(e); }, addFunction = (e, t) => { var _ = getFunctionAddress(e); if (_) return _; var s = getEmptyTableSlot(); try { setWasmTableEntry(s, e); } catch (_2) { if (!(_2 instanceof TypeError)) throw _2; var r = convertJsFunctionToWasm(e, t); setWasmTableEntry(s, r); } return functionsInTableMap.set(e, s), s; }, updateGOT = (e, t) => { for (var _ in e) if (!isInternalSym(_)) { var s = e[_]; _.startsWith("orig$") && (_ = _.split("$")[1], t = true), GOT[_] ||= new WebAssembly.Global({ value: "i32", mutable: true }), (t || 0 == GOT[_].value) && ("function" == typeof s ? GOT[_].value = addFunction(s) : "number" == typeof s ? GOT[_].value = s : err(`unhandled export type for '${_}': ${typeof s}`)); } }, relocateExports = (e, t, _) => { var s = {}; for (var r in e) { var a = e[r]; "object" == typeof a && (a = a.value), "number" == typeof a && (a += t), s[r] = a; } return updateGOT(s, _), s; }, isSymbolDefined = (e) => { var t = wasmImports[e]; return !(!t || t.stub); }, dynCallLegacy = (e, t, _) => (0, Module["dynCall_" + e])(t, ..._), dynCall = (e, t, _ = []) => e.includes("j") ? dynCallLegacy(e, t, _) : getWasmTableEntry(t)(..._), createInvokeFunction = (e) => function() { var t = stackSave(); try { return dynCall(e, arguments[0], Array.prototype.slice.call(arguments, 1)); } catch (e2) { if (stackRestore(t), e2 !== e2 + 0) throw e2; _setThrew(1, 0); } }, resolveGlobalSymbol = (e, t = false) => { var _; return t && "orig$" + e in wasmImports && (e = "orig$" + e), isSymbolDefined(e) ? _ = wasmImports[e] : e.startsWith("invoke_") && (_ = wasmImports[e] = createInvokeFunction(e.split("_")[1])), { sym: _, name: e }; }, UTF8ToString = (e, t) => e ? UTF8ArrayToString(HEAPU8, e, t) : "", loadWebAssemblyModule = (binary, flags, libName, localScope, handle) => { var metadata = getDylinkMetadata(binary); function loadModule() { var firstLoad = !handle || !HEAP8[handle + 8]; if (firstLoad) { var memAlign = Math.pow(2, metadata.memoryAlign), memoryBase = metadata.memorySize ? alignMemory(getMemory(metadata.memorySize + memAlign), memAlign) : 0, tableBase = metadata.tableSize ? wasmTable.length : 0; handle && (HEAP8[handle + 8] = 1, HEAPU32[handle + 12 >> 2] = memoryBase, HEAP32[handle + 16 >> 2] = metadata.memorySize, HEAPU32[handle + 20 >> 2] = tableBase, HEAP32[handle + 24 >> 2] = metadata.tableSize); } else memoryBase = HEAPU32[handle + 12 >> 2], tableBase = HEAPU32[handle + 20 >> 2]; var tableGrowthNeeded = tableBase + metadata.tableSize - wasmTable.length, moduleExports; function resolveSymbol(e) { var t = resolveGlobalSymbol(e).sym; return !t && localScope && (t = localScope[e]), t || (t = moduleExports[e]), t; } tableGrowthNeeded > 0 && wasmTable.grow(tableGrowthNeeded); var proxyHandler = { get(e, t) { switch (t) { case "__memory_base": return memoryBase; case "__table_base": return tableBase; } if (t in wasmImports && !wasmImports[t].stub) return wasmImports[t]; var _; t in e || (e[t] = (...e2) => (_ ||= resolveSymbol(t), _(...e2))); return e[t]; } }, proxy = new Proxy({}, proxyHandler), info = { "GOT.mem": new Proxy({}, GOTHandler), "GOT.func": new Proxy({}, GOTHandler), env: proxy, wasi_snapshot_preview1: proxy }; function postInstantiation(module, instance) { function addEmAsm(addr, body) { for (var args = [], arity = 0; arity < 16 && -1 != body.indexOf("$" + arity); arity++) args.push("$" + arity); args = args.join(","); var func = `(${args}) => { ${body} };`; ASM_CONSTS[start] = eval(func); } if (updateTableMap(tableBase, metadata.tableSize), moduleExports = relocateExports(instance.exports, memoryBase), flags.allowUndefined || reportUndefinedSymbols(), "__start_em_asm" in moduleExports) for (var start = moduleExports.__start_em_asm, stop = moduleExports.__stop_em_asm; start < stop; ) { var jsString = UTF8ToString(start); addEmAsm(start, jsString), start = HEAPU8.indexOf(0, start) + 1; } function addEmJs(name, cSig, body) { var jsArgs = []; if (cSig = cSig.slice(1, -1), "void" != cSig) for (var i in cSig = cSig.split(","), cSig) { var jsArg = cSig[i].split(" ").pop(); jsArgs.push(jsArg.replace("*", "")); } var func = `(${jsArgs}) => ${body};`; moduleExports[name] = eval(func); } for (var name in moduleExports) if (name.startsWith("__em_js__")) { var start = moduleExports[name], jsString = UTF8ToString(start), parts = jsString.split("<::>"); addEmJs(name.replace("__em_js__", ""), parts[0], parts[1]), delete moduleExports[name]; } var applyRelocs = moduleExports.__wasm_apply_data_relocs; applyRelocs && (runtimeInitialized ? applyRelocs() : __RELOC_FUNCS__.push(applyRelocs)); var init = moduleExports.__wasm_call_ctors; return init && (runtimeInitialized ? init() : __ATINIT__.push(init)), moduleExports; } 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((e) => postInstantiation(e.module, e.instance)); } var module = binary instanceof WebAssembly.Module ? binary : new WebAssembly.Module(binary), instance = new WebAssembly.Instance(module, info); return postInstantiation(module, instance); } return currentModuleWeakSymbols = metadata.weakImports, flags.loadAsync ? metadata.neededDynlibs.reduce((e, t) => e.then(() => loadDynamicLibrary(t, flags)), Promise.resolve()).then(loadModule) : (metadata.neededDynlibs.forEach((e) => loadDynamicLibrary(e, flags, localScope)), loadModule()); }, mergeLibSymbols = (e, t) => { for (var [_, s] of Object.entries(e)) { const e2 = (e3) => { isSymbolDefined(e3) || (wasmImports[e3] = s); }; e2(_); const t2 = "__main_argc_argv"; "main" == _ && e2(t2), _ == t2 && e2("main"), _.startsWith("dynCall_") && !Module.hasOwnProperty(_) && (Module[_] = s); } }, asyncLoad = (e, t, _, s) => { var r = s ? "" : getUniqueRunDependency(`al ${e}`); readAsync(e, (e2) => { t(new Uint8Array(e2)), r && removeRunDependency(r); }, (t2) => { if (!_) throw `Loading data file "${e}" failed.`; _(); }), r && addRunDependency(r); }; function loadDynamicLibrary(e, t = { global: true, nodelete: true }, _, s) { var r = LDSO.loadedLibsByName[e]; if (r) return t.global ? r.global || (r.global = true, mergeLibSymbols(r.exports, e)) : _ && Object.assign(_, r.exports), t.nodelete && r.refcount !== 1 / 0 && (r.refcount = 1 / 0), r.refcount++, s && (LDSO.loadedLibsByHandle[s] = r), !t.loadAsync || Promise.resolve(true); function a() { if (s) { var _2 = HEAPU32[s + 28 >> 2], r2 = HEAPU32[s + 32 >> 2]; if (_2 && r2) { var a2 = HEAP8.slice(_2, _2 + r2); return t.loadAsync ? Promise.resolve(a2) : a2; } } var o2 = locateFile(e); if (t.loadAsync) return new Promise(function(e2, t2) { asyncLoad(o2, e2, t2); }); if (!readBinary) throw new Error(`${o2}: file not found, and synchronous loading of external files is not available`); return readBinary(o2); } function o() { return t.loadAsync ? a().then((r2) => loadWebAssemblyModule(r2, t, e, _, s)) : loadWebAssemblyModule(a(), t, e, _, s); } function n(t2) { r.global ? mergeLibSymbols(t2, e) : _ && Object.assign(_, t2), r.exports = t2; } return (r = newDSO(e, s, "loading")).refcount = t.nodelete ? 1 / 0 : 1, r.global = t.global, t.loadAsync ? o().then((e2) => (n(e2), true)) : (n(o()), true); } var reportUndefinedSymbols = () => { for (var [e, t] of Object.entries(GOT)) if (0 == t.value) { var _ = resolveGlobalSymbol(e, true).sym; if (!_ && !t.required) continue; if ("function" == typeof _) t.value = addFunction(_, _.sig); else { if ("number" != typeof _) throw new Error(`bad export type for '${e}': ${typeof _}`); t.value = _; } } }, loadDylibs = () => { dynamicLibraries.length ? (addRunDependency("loadDylibs"), dynamicLibraries.reduce((e, t) => e.then(() => loadDynamicLibrary(t, { loadAsync: true, global: true, nodelete: true, allowUndefined: true })), Promise.resolve()).then(() => { reportUndefinedSymbols(), removeRunDependency("loadDylibs"); })) : reportUndefinedSymbols(); }, noExitRuntime = Module.noExitRuntime || true; function setValue(e, t, _ = "i8") { switch (_.endsWith("*") && (_ = "*"), _) { case "i1": case "i8": HEAP8[e] = t; break; case "i16": HEAP16[e >> 1] = t; break; case "i32": HEAP32[e >> 2] = t; break; case "i64": abort("to do setValue(i64) use WASM_BIGINT"); case "float": HEAPF32[e >> 2] = t; break; case "double": HEAPF64[e >> 3] = t; break; case "*": HEAPU32[e >> 2] = t; break; default: abort(`invalid type for setValue: ${_}`); } } var ___memory_base = new WebAssembly.Global({ value: "i32", mutable: false }, 1024), ___stack_pointer = new WebAssembly.Global({ value: "i32", mutable: true }, 78096), ___table_base = new WebAssembly.Global({ value: "i32", mutable: false }, 1), nowIsMonotonic = 1, __emscripten_get_now_is_monotonic = () => nowIsMonotonic; __emscripten_get_now_is_monotonic.sig = "i"; var _abort = () => { abort(""); }; _abort.sig = "v"; var _emscripten_date_now = () => Date.now(), _emscripten_get_now; _emscripten_date_now.sig = "d", _emscripten_get_now = () => performance.now(), _emscripten_get_now.sig = "d"; var _emscripten_memcpy_js = (e, t, _) => HEAPU8.copyWithin(e, t, t + _); _emscripten_memcpy_js.sig = "vppp"; var getHeapMax = () => 2147483648, growMemory = (e) => { var t = (e - wasmMemory.buffer.byteLength + 65535) / 65536; try { return wasmMemory.grow(t), updateMemoryViews(), 1; } catch (e2) { } }, _emscripten_resize_heap = (e) => { var t = HEAPU8.length; e >>>= 0; var _ = getHeapMax(); if (e > _) return false; for (var s, r, a = 1; a <= 4; a *= 2) { var o = t * (1 + 0.2 / a); o = Math.min(o, e + 100663296); var n = Math.min(_, (s = Math.max(e, o)) + ((r = 65536) - s % r) % r); if (growMemory(n)) return true; } return false; }; _emscripten_resize_heap.sig = "ip"; var _fd_close = (e) => 52; _fd_close.sig = "ii"; var convertI32PairToI53Checked = (e, t) => t + 2097152 >>> 0 < 4194305 - !!e ? (e >>> 0) + 4294967296 * t : NaN; function _fd_seek(e, t, _, s, r) { convertI32PairToI53Checked(t, _); return 70; } _fd_seek.sig = "iiiiip"; var printCharBuffers = [null, [], []], printChar = (e, t) => { var _ = printCharBuffers[e]; 0 === t || 10 === t ? ((1 === e ? out : err)(UTF8ArrayToString(_, 0)), _.length = 0) : _.push(t); }, SYSCALLS = { varargs: void 0, get() { var e = HEAP32[+SYSCALLS.varargs >> 2]; return SYSCALLS.varargs += 4, e; }, getp: () => SYSCALLS.get(), getStr: (e) => UTF8ToString(e) }, _fd_write = (e, t, _, s) => { for (var r = 0, a = 0; a < _; a++) { var o = HEAPU32[t >> 2], n = HEAPU32[t + 4 >> 2]; t += 8; for (var l = 0; l < n; l++) printChar(e, HEAPU8[o + l]); r += n; } return HEAPU32[s >> 2] = r, 0; }; function _tree_sitter_log_callback(e, t) { if (currentLogCallback) { const _ = UTF8ToString(t); currentLogCallback(_, 0 !== e); } } function _tree_sitter_parse_callback(e, t, _, s, r) { const a = currentParseCallback(t, { row: _, column: s }); "string" == typeof a ? (setValue(r, a.length, "i32"), stringToUTF16(a, e, 10240)) : setValue(r, 0, "i32"); } _fd_write.sig = "iippp"; var runtimeKeepaliveCounter = 0, keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0, _proc_exit = (e) => { EXITSTATUS = e, keepRuntimeAlive() || (Module.onExit?.(e), ABORT = true), quit_(e, new ExitStatus(e)); }; _proc_exit.sig = "vi"; var exitJS = (e, t) => { EXITSTATUS = e, _proc_exit(e); }, handleException = (e) => { if (e instanceof ExitStatus || "unwind" == e) return EXITSTATUS; quit_(1, e); }, lengthBytesUTF8 = (e) => { for (var t = 0, _ = 0; _ < e.length; ++_) { var s = e.charCodeAt(_); s <= 127 ? t++ : s <= 2047 ? t += 2 : s >= 55296 && s <= 57343 ? (t += 4, ++_) : t += 3; } return t; }, stringToUTF8Array = (e, t, _, s) => { if (!(s > 0)) return 0; for (var r = _, a = _ + s - 1, o = 0; o < e.length; ++o) { var n = e.charCodeAt(o); if (n >= 55296 && n <= 57343) n = 65536 + ((1023 & n) << 10) | 1023 & e.charCodeAt(++o); if (n <= 127) { if (_ >= a) break; t[_++] = n; } else if (n <= 2047) { if (_ + 1 >= a) break; t[_++] = 192 | n >> 6, t[_++] = 128 | 63 & n; } else if (n <= 65535) { if (_ + 2 >= a) break; t[_++] = 224 | n >> 12, t[_++] = 128 | n >> 6 & 63, t[_++] = 128 | 63 & n; } else { if (_ + 3 >= a) break; t[_++] = 240 | n >> 18, t[_++] = 128 | n >> 12 & 63, t[_++] = 128 | n >> 6 & 63, t[_++] = 128 | 63 & n; } } return t[_] = 0, _ - r; }, stringToUTF8 = (e, t, _) => stringToUTF8Array(e, HEAPU8, t, _), stringToUTF8OnStack = (e) => { var t = lengthBytesUTF8(e) + 1, _ = stackAlloc(t); return stringToUTF8(e, _, t), _; }, stringToUTF16 = (e, t, _) => { if (_ ??= 2147483647, _ < 2) return 0; for (var s = t, r = (_ -= 2) < 2 * e.length ? _ / 2 : e.length, a = 0; a < r; ++a) { var o = e.charCodeAt(a); HEAP16[t >> 1] = o, t += 2; } return HEAP16[t >> 1] = 0, t - s; }, AsciiToString = (e) => { for (var t = ""; ; ) { var _ = HEAPU8[e++]; if (!_) return t; t += String.fromCharCode(_); } }, wasmImports = { __heap_base: ___heap_base, __indirect_function_table: wasmTable, __memory_base: ___memory_base, __stack_pointer: ___stack_pointer, __table_base: ___table_base, _emscripten_get_now_is_monotonic: __emscripten_get_now_is_monotonic, abort: _abort, emscripten_get_now: _emscripten_get_now, emscripten_memcpy_js: _emscripten_memcpy_js, emscripten_resize_heap: _emscripten_resize_heap, fd_close: _fd_close, fd_seek: _fd_seek, fd_write: _fd_write, memory: wasmMemory, tree_sitter_log_callback: _tree_sitter_log_callback, tree_sitter_parse_callback: _tree_sitter_parse_callback }, wasmExports = createWasm(), ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports.__wasm_call_ctors)(), ___wasm_apply_data_relocs = () => (___wasm_apply_data_relocs = wasmExports.__wasm_apply_data_relocs)(), _malloc = Module._malloc = (e) => (_malloc = Module._malloc = wasmExports.malloc)(e), _calloc = Module._calloc = (e, t) => (_calloc = Module._calloc = wasmExports.calloc)(e, t), _realloc = Module._realloc = (e, t) => (_realloc = Module._realloc = wasmExports.realloc)(e, t), _free = Module._free = (e) => (_free = Module._free = wasmExports.free)(e), _ts_language_symbol_count = Module._ts_language_symbol_count = (e) => (_ts_language_symbol_count = Module._ts_language_symbol_count = wasmExports.ts_language_symbol_count)(e), _ts_language_state_count = Module._ts_language_state_count = (e) => (_ts_language_state_count = Module._ts_language_state_count = wasmExports.ts_language_state_count)(e), _ts_language_version = Module._ts_language_version = (e) => (_ts_language_version = Module._ts_language_version = wasmExports.ts_language_version)(e), _ts_language_field_count = Module._ts_language_field_count = (e) => (_ts_language_field_count = Module._ts_language_field_count = wasmExports.ts_language_field_count)(e), _ts_language_next_state = Module._ts_language_next_state = (e, t, _) => (_ts_language_next_state = Module._ts_language_next_state = wasmExports.ts_language_next_state)(e, t, _), _ts_language_symbol_name = Module._ts_language_symbol_name = (e, t) => (_ts_language_symbol_name = Module._ts_language_symbol_name = wasmExports.ts_language_symbol_name)(e, t), _ts_language_symbol_for_name = Module._ts_language_symbol_for_name = (e, t, _, s) => (_ts_language_symbol_for_name = Module._ts_language_symbol_for_name = wasmExports.ts_language_symbol_for_name)(e, t, _, s), _strncmp = Module._strncmp = (e, t, _) => (_strncmp = Module._strncmp = wasmExports.strncmp)(e, t, _), _ts_language_symbol_type = Module._ts_language_symbol_type = (e, t) => (_ts_language_symbol_type = Module._ts_language_symbol_type = wasmExports.ts_language_symbol_type)(e, t), _ts_language_field_name_for_id = Module._ts_language_field_name_for_id = (e, t) => (_ts_language_field_name_for_id = Module._ts_language_field_name_for_id = wasmExports.ts_language_field_name_for_id)(e, t), _ts_lookahead_iterator_new = Module._ts_lookahead_iterator_new = (e, t) => (_ts_lookahead_iterator_new = Module._ts_lookahead_iterator_new = wasmExports.ts_lookahead_iterator_new)(e, t), _ts_lookahead_iterator_delete = Module._ts_lookahead_iterator_delete = (e) => (_ts_lookahead_iterator_delete = Module._ts_lookahead_iterator_delete = wasmExports.ts_lookahead_iterator_delete)(e), _ts_lookahead_iterator_reset_state = Module._ts_lookahead_iterator_reset_state = (e, t) => (_ts_lookahead_iterator_reset_state = Module._ts_lookahead_iterator_reset_state = wasmExports.ts_lookahead_iterator_reset_state)(e, t), _ts_lookahead_iterator_reset = Module._ts_lookahead_iterator_reset = (e, t, _) => (_ts_lookahead_iterator_reset = Module._ts_lookahead_iterator_reset = wasmExports.ts_lookahead_iterator_reset)(e, t, _), _ts_lookahead_iterator_next = Module._ts_lookahead_iterator_next = (e) => (_ts_lookahead_iterator_next = Module._ts_lookahead_iterator_next = wasmExports.ts_lookahead_iterator_next)(e), _ts_lookahead_iterator_current_symbol = Module._ts_lookahead_iterator_current_symbol = (e) => (_ts_lookahead_iterator_current_symbol = Module._ts_lookahead_iterator_current_symbol = wasmExports.ts_lookahead_iterator_current_symbol)(e), _memset = Module._memset = (e, t, _) => (_memset = Module._memset = wasmExports.memset)(e, t, _), _memcpy = Module._memcpy = (e, t, _) => (_memcpy = Module._memcpy = wasmExports.memcpy)(e, t, _), _ts_parser_delete = Module._ts_parser_delete = (e) => (_ts_parser_delete = Module._ts_parser_delete = wasmExports.ts_parser_delete)(e), _ts_parser_reset = Module._ts_parser_reset = (e) => (_ts_parser_reset = Module._ts_parser_reset = wasmExports.ts_parser_reset)(e), _ts_parser_set_language = Module._ts_parser_set_language = (e, t) => (_ts_parser_set_language = Module._ts_parser_set_language = wasmExports.ts_parser_set_language)(e, t), _ts_parser_timeout_micros = Module._ts_parser_timeout_micros = (e) => (_ts_parser_timeout_micros = Module._ts_parser_timeout_micros = wasmExports.ts_parser_timeout_micros)(e), _ts_parser_set_timeout_micros = Module._ts_parser_set_timeout_micros = (e, t, _) => (_ts_parser_set_timeout_micros = Module._ts_parser_set_timeout_micros = wasmExports.ts_parser_set_timeout_micros)(e, t, _), _ts_parser_set_included_ranges = Module._ts_parser_set_included_ranges = (e, t, _) => (_ts_parser_set_included_ranges = Module._ts_parser_set_included_ranges = wasmExports.ts_parser_set_included_ranges)(e, t, _), _memmove = Module._memmove = (e, t, _) => (_memmove = Module._memmove = wasmExports.memmove)(e, t, _), _memcmp = Module._memcmp = (e, t, _) => (_memcmp = Module._memcmp = wasmExports.memcmp)(e, t, _), _ts_query_new = Module._ts_query_new = (e, t, _, s, r) => (_ts_query_new = Module._ts_query_new = wasmExports.ts_query_new)(e, t, _, s, r), _ts_query_delete = Module._ts_query_delete = (e) => (_ts_query_delete = Module._ts_query_delete = wasmExports.ts_query_delete)(e), _iswspace = Module._iswspace = (e) => (_iswspace = Module._iswspace = wasmExports.iswspace)(e), _iswalnum = Module._iswalnum = (e) => (_iswalnum = Module._iswalnum = wasmExports.iswalnum)(e), _ts_query_pattern_count = Module._ts_query_pattern_count = (e) => (_ts_query_pattern_count = Module._ts_query_pattern_count = wasmExports.ts_query_pattern_count)(e), _ts_query_capture_count = Module._ts_query_capture_count = (e) => (_ts_query_capture_count = Module._ts_query_capture_count = wasmExports.ts_query_capture_count)(e), _ts_query_string_count = Module._ts_query_string_count = (e) => (_ts_query_string_count = Module._ts_query_string_count = wasmExports.ts_query_string_count)(e), _ts_query_capture_name_for_id = Module._ts_query_capture_name_for_id = (e, t, _) => (_ts_query_capture_name_for_id = Module._ts_query_capture_name_for_id = wasmExports.ts_query_capture_name_for_id)(e, t, _), _ts_query_string_value_for_id = Module._ts_query_string_value_for_id = (e, t, _) => (_ts_query_string_value_for_id = Module._ts_query_string_value_for_id = wasmExports.ts_query_string_value_for_id)(e, t, _), _ts_query_predicates_for_pattern = Module._ts_query_predicates_for_pattern = (e, t, _) => (_ts_query_predicates_for_pattern = Module._ts_query_predicates_for_pattern = wasmExports.ts_query_predicates_for_pattern)(e, t, _), _ts_query_disable_capture = Module._ts_query_disable_capture = (e, t, _) => (_ts_query_disable_capture = Module._ts_query_disable_capture = wasmExports.ts_query_disable_capture)(e, t, _), _ts_tree_copy = Module._ts_tree_copy = (e) => (_ts_tree_copy = Module._ts_tree_copy = wasmExports.ts_tree_copy)(e), _ts_tree_delete = Module._ts_tree_delete = (e) => (_ts_tree_delete = Module._ts_tree_delete = wasmExports.ts_tree_delete)(e), _ts_init = Module._ts_init = () => (_ts_init = Module._ts_init = wasmExports.ts_init)(), _ts_parser_new_wasm = Module._ts_parser_new_wasm = () => (_ts_parser_new_wasm = Module._ts_parser_new_wasm = wasmExports.ts_parser_new_wasm)(), _ts_parser_enable_logger_wasm = Module._ts_parser_enable_logger_wasm = (e, t) => (_ts_parser_enable_logger_wasm = Module._ts_parser_enable_logger_wasm = wasmExports.ts_parser_enable_logger_wasm)(e, t), _ts_parser_parse_wasm = Module._ts_parser_parse_wasm = (e, t, _, s, r) => (_ts_parser_parse_wasm = Module._ts_parser_parse_wasm = wasmExports.ts_parser_parse_wasm)(e, t, _, s, r), _ts_parser_included_ranges_wasm = Module._ts_parser_included_ranges_wasm = (e) => (_ts_parser_included_ranges_wasm = Module._ts_parser_included_ranges_wasm = wasmExports.ts_parser_included_ranges_wasm)(e), _ts_language_type_is_named_wasm = Module._ts_language_type_is_named_wasm = (e, t) => (_ts_language_type_is_named_wasm = Module._ts_language_type_is_named_wasm = wasmExports.ts_language_type_is_named_wasm)(e, t), _ts_language_type_is_visible_wasm = Module._ts_language_type_is_visible_wasm = (e, t) => (_ts_language_type_is_visible_wasm = Module._ts_language_type_is_visible_wasm = wasmExports.ts_language_type_is_visible_wasm)(e, t), _ts_tree_root_node_wasm = Module._ts_tree_root_node_wasm = (e) => (_ts_tree_root_node_wasm = Module._ts_tree_root_node_wasm = wasmExports.ts_tree_root_node_wasm)(e), _ts_tree_root_node_with_offset_wasm = Module._ts_tree_root_node_with_offset_wasm = (e) => (_ts_tree_root_node_with_offset_wasm = Module._ts_tree_root_node_with_offset_wasm = wasmExports.ts_tree_root_node_with_offset_wasm)(e), _ts_tree_edit_wasm = Module._ts_tree_edit_wasm = (e) => (_ts_tree_edit_wasm = Module._ts_tree_edit_wasm = wasmExports.ts_tree_edit_wasm)(e), _ts_tree_included_ranges_wasm = Module._ts_tree_included_ranges_wasm = (e) => (_ts_tree_included_ranges_wasm = Module._ts_tree_included_ranges_wasm = wasmExports.ts_tree_included_ranges_wasm)(e), _ts_tree_get_changed_ranges_wasm = Module._ts_tree_get_changed_ranges_wasm = (e, t) => (_ts_tree_get_changed_ranges_wasm = Module._ts_tree_get_changed_ranges_wasm = wasmExports.ts_tree_get_changed_ranges_wasm)(e, t), _ts_tree_cursor_new_wasm = Module._ts_tree_cursor_new_wasm = (e) => (_ts_tree_cursor_new_wasm = Module._ts_tree_cursor_new_wasm = wasmExports.ts_tree_cursor_new_wasm)(e), _ts_tree_cursor_delete_wasm = Module._ts_tree_cursor_delete_wasm = (e) => (_ts_tree_cursor_delete_wasm = Module._ts_tree_cursor_delete_wasm = wasmExports.ts_tree_cursor_delete_wasm)(e), _ts_tree_cursor_reset_wasm = Module._ts_tree_cursor_reset_wasm = (e) => (_ts_tree_cursor_reset_wasm = Module._ts_tree_cursor_reset_wasm = wasmExports.ts_tree_cursor_reset_wasm)(e), _ts_tree_cursor_reset_to_wasm = Module._ts_tree_cursor_reset_to_wasm = (e, t) => (_ts_tree_cursor_reset_to_wasm = Module._ts_tree_cursor_reset_to_wasm = wasmExports.ts_tree_cursor_reset_to_wasm)(e, t), _ts_tree_cursor_goto_first_child_wasm = Module._ts_tree_cursor_goto_first_child_wasm = (e) => (_ts_tree_cursor_goto_first_child_wasm = Module._ts_tree_cursor_goto_first_child_wasm = wasmExports.ts_tree_cursor_goto_first_child_wasm)(e), _ts_tree_cursor_goto_last_child_wasm = Module._ts_tree_cursor_goto_last_child_wasm = (e) => (_ts_tree_cursor_goto_last_child_wasm = Module._ts_tree_cursor_goto_last_child_wasm = wasmExports.ts_tree_cursor_goto_last_child_wasm)(e), _ts_tree_cursor_goto_first_child_for_index_wasm = Module._ts_tree_cursor_goto_first_child_for_index_wasm = (e) => (_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)(e), _ts_tree_cursor_goto_first_child_for_position_wasm = Module._ts_tree_cursor_goto_first_child_for_position_wasm = (e) => (_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)(e), _ts_tree_cursor_goto_next_sibling_wasm = Module._ts_tree_cursor_goto_next_sibling_wasm = (e) => (_ts_tree_cursor_goto_next_sibling_wasm = Module._ts_tree_cursor_goto_next_sibling_wasm = wasmExports.ts_tree_cursor_goto_next_sibling_wasm)(e), _ts_tree_cursor_goto_previous_sibling_wasm = Module._ts_tree_cursor_goto_previous_sibling_wasm = (e) => (_ts_tree_cursor_goto_previous_sibling_wasm = Module._ts_tree_cursor_goto_previous_sibling_wasm = wasmExports.ts_tree_cursor_goto_previous_sibling_wasm)(e), _ts_tree_cursor_goto_descendant_wasm = Module._ts_tree_cursor_goto_descendant_wasm = (e, t) => (_ts_tree_cursor_goto_descendant_wasm = Module._ts_tree_cursor_goto_descendant_wasm = wasmExports.ts_tree_cursor_goto_descendant_wasm)(e, t), _ts_tree_cursor_goto_parent_wasm = Module._ts_tree_cursor_goto_parent_wasm = (e) => (_ts_tree_cursor_goto_parent_wasm = Module._ts_tree_cursor_goto_parent_wasm = wasmExports.ts_tree_cursor_goto_parent_wasm)(e), _ts_tree_cursor_current_node_type_id_wasm = Module._ts_tree_cursor_current_node_type_id_wasm = (e) => (_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)(e), _ts_tree_cursor_current_node_state_id_wasm = Module._ts_tree_cursor_current_node_state_id_wasm = (e) => (_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)(e), _ts_tree_cursor_current_node_is_named_wasm = Module._ts_tree_cursor_current_node_is_named_wasm = (e) => (_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)(e), _ts_tree_cursor_current_node_is_missing_wasm = Module._ts_tree_cursor_current_node_is_missing_wasm = (e) => (_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)(e), _ts_tree_cursor_current_node_id_wasm = Module._ts_tree_cursor_current_node_id_wasm = (e) => (_ts_tree_cursor_current_node_id_wasm = Module._ts_tree_cursor_current_node_id_wasm = wasmExports.ts_tree_cursor_current_node_id_wasm)(e), _ts_tree_cursor_start_position_wasm = Module._ts_tree_cursor_start_position_wasm = (e) => (_ts_tree_cursor_start_position_wasm = Module._ts_tree_cursor_start_position_wasm = wasmExports.ts_tree_cursor_start_position_wasm)(e), _ts_tree_cursor_end_position_wasm = Module._ts_tree_cursor_end_position_wasm = (e) => (_ts_tree_cursor_end_position_wasm = Module._ts_tree_cursor_end_position_wasm = wasmExports.ts_tree_cursor_end_position_wasm)(e), _ts_tree_cursor_start_index_wasm = Module._ts_tree_cursor_start_index_wasm = (e) => (_ts_tree_cursor_start_index_wasm = Module._ts_tree_cursor_start_index_wasm = wasmExports.ts_tree_cursor_start_index_wasm)(e), _ts_tree_cursor_end_index_wasm = Module._ts_tree_cursor_end_index_wasm = (e) => (_ts_tree_cursor_end_index_wasm = Module._ts_tree_cursor_end_index_wasm = wasmExports.ts_tree_cursor_end_index_wasm)(e), _ts_tree_cursor_current_field_id_wasm = Module._ts_tree_cursor_current_field_id_wasm = (e) => (_ts_tree_cursor_current_field_id_wasm = Module._ts_tree_cursor_current_field_id_wasm = wasmExports.ts_tree_cursor_current_field_id_wasm)(e), _ts_tree_cursor_current_depth_wasm = Module._ts_tree_cursor_current_depth_wasm = (e) => (_ts_tree_cursor_current_depth_wasm = Module._ts_tree_cursor_current_depth_wasm = wasmExports.ts_tree_cursor_current_depth_wasm)(e), _ts_tree_cursor_current_descendant_index_wasm = Module._ts_tree_cursor_current_descendant_index_wasm = (e) => (_ts_tree_cursor_current_descendant_index_wasm = Module._ts_tree_cursor_current_descendant_index_wasm = wasmExports.ts_tree_cursor_current_descendant_index_wasm)(e), _ts_tree_cursor_current_node_wasm = Module._ts_tree_cursor_current_node_wasm = (e) => (_ts_tree_cursor_current_node_wasm = Module._ts_tree_cursor_current_node_wasm = wasmExports.ts_tree_cursor_current_node_wasm)(e), _ts_node_symbol_wasm = Module._ts_node_symbol_wasm = (e) => (_ts_node_symbol_wasm = Module._ts_node_symbol_wasm = wasmExports.ts_node_symbol_wasm)(e), _ts_node_field_name_for_child_wasm = Module._ts_node_field_name_for_child_wasm = (e, t) => (_ts_node_field_name_for_child_wasm = Module._ts_node_field_name_for_child_wasm = wasmExports.ts_node_field_name_for_child_wasm)(e, t), _ts_node_children_by_field_id_wasm = Module._ts_node_children_by_field_id_wasm = (e, t) => (_ts_node_children_by_field_id_wasm = Module._ts_node_children_by_field_id_wasm = wasmExports.ts_node_children_by_field_id_wasm)(e, t), _ts_node_first_child_for_byte_wasm = Module._ts_node_first_child_for_byte_wasm = (e) => (_ts_node_first_child_for_byte_wasm = Module._ts_node_first_child_for_byte_wasm = wasmExports.ts_node_first_child_for_byte_wasm)(e), _ts_node_first_named_child_for_byte_wasm = Module._ts_node_first_named_child_for_byte_wasm = (e) => (_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)(e), _ts_node_grammar_symbol_wasm = Module._ts_node_grammar_symbol_wasm = (e) => (_ts_node_grammar_symbol_wasm = Module._ts_node_grammar_symbol_wasm = wasmExports.ts_node_grammar_symbol_wasm)(e), _ts_node_child_count_wasm = Module._ts_node_child_count_wasm = (e) => (_ts_node_child_count_wasm = Module._ts_node_child_count_wasm = wasmExports.ts_node_child_count_wasm)(e), _ts_node_named_child_count_wasm = Module._ts_node_named_child_count_wasm = (e) => (_ts_node_named_child_count_wasm = Module._ts_node_named_child_count_wasm = wasmExports.ts_node_named_child_count_wasm)(e), _ts_node_child_wasm = Module._ts_node_child_wasm = (e, t) => (_ts_node_child_wasm = Module._ts_node_child_wasm = wasmExports.ts_node_child_wasm)(e, t), _ts_node_named_child_wasm = Module._ts_node_named_child_wasm = (e, t) => (_ts_node_named_child_wasm = Module._ts_node_named_child_wasm = wasmExports.ts_node_named_child_wasm)(e, t), _ts_node_child_by_field_id_wasm = Module._ts_node_child_by_field_id_wasm = (e, t) => (_ts_node_child_by_field_id_wasm = Module._ts_node_child_by_field_id_wasm = wasmExports.ts_node_child_by_field_id_wasm)(e, t), _ts_node_next_sibling_wasm = Module._ts_node_next_sibling_wasm = (e) => (_ts_node_next_sibling_wasm = Module._ts_node_next_sibling_wasm = wasmExports.ts_node_next_sibling_wasm)(e), _ts_node_prev_sibling_wasm = Module._ts_node_prev_sibling_wasm = (e) => (_ts_node_prev_sibling_wasm = Module._ts_node_prev_sibling_wasm = wasmExports.ts_node_prev_sibling_wasm)(e), _ts_node_next_named_sibling_wasm = Module._ts_node_next_named_sibling_wasm = (e) => (_ts_node_next_named_sibling_wasm = Module._ts_node_next_named_sibling_wasm = wasmExports.ts_node_next_named_sibling_wasm)(e), _ts_node_prev_named_sibling_wasm = Module._ts_node_prev_named_sibling_wasm = (e) => (_ts_node_prev_named_sibling_wasm = Module._ts_node_prev_named_sibling_wasm = wasmExports.ts_node_prev_named_sibling_wasm)(e), _ts_node_descendant_count_wasm = Module._ts_node_descendant_count_wasm = (e) => (_ts_node_descendant_count_wasm = Module._ts_node_descendant_count_wasm = wasmExports.ts_node_descendant_count_wasm)(e), _ts_node_parent_wasm = Module._ts_node_parent_wasm = (e) => (_ts_node_parent_wasm = Module._ts_node_parent_wasm = wasmExports.ts_node_parent_wasm)(e), _ts_node_descendant_for_index_wasm = Module._ts_node_descendant_for_index_wasm = (e) => (_ts_node_descendant_for_index_wasm = Module._ts_node_descendant_for_index_wasm = wasmExports.ts_node_descendant_for_index_wasm)(e), _ts_node_named_descendant_for_index_wasm = Module._ts_node_named_descendant_for_index_wasm = (e) => (_ts_node_named_descendant_for_index_wasm = Module._ts_node_named_descendant_for_index_wasm = wasmExports.ts_node_named_descendant_for_index_wasm)(e), _ts_node_descendant_for_position_wasm = Module._ts_node_descendant_for_position_wasm = (e) => (_ts_node_descendant_for_position_wasm = Module._ts_node_descendant_for_position_wasm = wasmExports.ts_node_descendant_for_position_wasm)(e), _ts_node_named_descendant_for_position_wasm = Module._ts_node_named_descendant_for_position_wasm = (e) => (_ts_node_named_descendant_for_position_wasm = Module._ts_node_named_descendant_for_position_wasm = wasmExports.ts_node_named_descendant_for_position_wasm)(e), _ts_node_start_point_wasm = Module._ts_node_start_point_wasm = (e) => (_ts_node_start_point_wasm = Module._ts_node_start_point_wasm = wasmExports.ts_node_start_point_wasm)(e), _ts_node_end_point_wasm = Module._ts_node_end_point_wasm = (e) => (_ts_node_end_point_wasm = Module._ts_node_end_point_wasm = wasmExports.ts_node_end_point_wasm)(e), _ts_node_start_index_wasm = Module._ts_node_start_index_wasm = (e) => (_ts_node_start_index_wasm = Module._ts_node_start_index_wasm = wasmExports.ts_node_start_index_wasm)(e), _ts_node_end_index_wasm = Module._ts_node_end_index_wasm = (e) => (_ts_node_end_index_wasm = Module._ts_node_end_index_wasm = wasmExports.ts_node_end_index_wasm)(e), _ts_node_to_string_wasm = Module._ts_node_to_string_wasm = (e) => (_ts_node_to_string_wasm = Module._ts_node_to_string_wasm = wasmExports.ts_node_to_string_wasm)(e), _ts_node_children_wasm = Module._ts_node_children_wasm = (e) => (_ts_node_children_wasm = Module._ts_node_children_wasm = wasmExports.ts_node_children_wasm)(e), _ts_node_named_children_wasm = Module._ts_node_named_children_wasm = (e) => (_ts_node_named_children_wasm = Module._ts_node_named_children_wasm = wasmExports.ts_node_named_children_wasm)(e), _ts_node_descendants_of_type_wasm = Module._ts_node_descendants_of_type_wasm = (e, t, _, s, r, a, o) => (_ts_node_descendants_of_type_wasm = Module._ts_node_descendants_of_type_wasm = wasmExports.ts_node_descendants_of_type_wasm)(e, t, _, s, r, a, o), _ts_node_is_named_wasm = Module._ts_node_is_named_wasm = (e) => (_ts_node_is_named_wasm = Module._ts_node_is_named_wasm = wasmExports.ts_node_is_named_wasm)(e), _ts_node_has_changes_wasm = Module._ts_node_has_changes_wasm = (e) => (_ts_node_has_changes_wasm = Module._ts_node_has_changes_wasm = wasmExports.ts_node_has_changes_wasm)(e), _ts_node_has_error_wasm = Module._ts_node_has_error_wasm = (e) => (_ts_node_has_error_wasm = Module._ts_node_has_error_wasm = wasmExports.ts_node_has_error_wasm)(e), _ts_node_is_error_wasm = Module._ts_node_is_error_wasm = (e) => (_ts_node_is_error_wasm = Module._ts_node_is_error_wasm = wasmExports.ts_node_is_error_wasm)(e), _ts_node_is_missing_wasm = Module._ts_node_is_missing_wasm = (e) => (_ts_node_is_missing_wasm = Module._ts_node_is_missing_wasm = wasmExports.ts_node_is_missing_wasm)(e), _ts_node_is_extra_wasm = Module._ts_node_is_extra_wasm = (e) => (_ts_node_is_extra_wasm = Module._ts_node_is_extra_wasm = wasmExports.ts_node_is_extra_wasm)(e), _ts_node_parse_state_wasm = Module._ts_node_parse_state_wasm = (e) => (_ts_node_parse_state_wasm = Module._ts_node_parse_state_wasm = wasmExports.ts_node_parse_state_wasm)(e), _ts_node_next_parse_state_wasm = Module._ts_node_next_parse_state_wasm = (e) => (_ts_node_next_parse_state_wasm = Module._ts_node_next_parse_state_wasm = wasmExports.ts_node_next_parse_state_wasm)(e), _ts_query_matches_wasm = Module._ts_query_matches_wasm = (e, t, _, s, r, a, o, n, l, d) => (_ts_query_matches_wasm = Module._ts_query_matches_wasm = wasmExports.ts_query_matches_wasm)(e, t, _, s, r, a, o, n, l, d), _ts_query_captures_wasm = Module._ts_query_captures_wasm = (e, t, _, s, r, a, o, n, l, d) => (_ts_query_captures_wasm = Module._ts_query_captures_wasm = wasmExports.ts_query_captures_wasm)(e, t, _, s, r, a, o, n, l, d), _iswalpha = Module._iswalpha = (e) => (_iswalpha = Module._iswalpha = wasmExports.iswalpha)(e), _iswblank = Module._iswblank = (e) => (_iswblank = Module._iswblank = wasmExports.iswblank)(e), _iswdigit = Module._iswdigit = (e) => (_iswdigit = Module._iswdigit = wasmExports.iswdigit)(e), _iswlower = Module._iswlower = (e) => (_iswlower = Module._iswlower = wasmExports.iswlower)(e), _iswupper = Module._iswupper = (e) => (_iswupper = Module._iswupper = wasmExports.iswupper)(e), _iswxdigit = Module._iswxdigit = (e) => (_iswxdigit = Module._iswxdigit = wasmExports.iswxdigit)(e), _memchr = Module._memchr = (e, t, _) => (_memchr = Module._memchr = wasmExports.memchr)(e, t, _), _strlen = Module._strlen = (e) => (_strlen = Module._strlen = wasmExports.strlen)(e), _strcmp = Module._strcmp = (e, t) => (_strcmp = Module._strcmp = wasmExports.strcmp)(e, t), _strncat = Module._strncat = (e, t, _) => (_strncat = Module._strncat = wasmExports.strncat)(e, t, _), _strncpy = Module._strncpy = (e, t, _) => (_strncpy = Module._strncpy = wasmExports.strncpy)(e, t, _), _towlower = Module._towlower = (e) => (_towlower = Module._towlower = wasmExports.towlower)(e), _towupper = Module._towupper = (e) => (_towupper = Module._towupper = wasmExports.towupper)(e), _setThrew = (e, t) => (_setThrew = wasmExports.setThrew)(e, t), stackSave = () => (stackSave = wasmExports.stackSave)(), stackRestore = (e) => (stackRestore = wasmExports.stackRestore)(e), stackAlloc = (e) => (stackAlloc = wasmExports.stackAlloc)(e), dynCall_jiji = Module.dynCall_jiji = (e, t, _, s, r) => (dynCall_jiji = Module.dynCall_jiji = wasmExports.dynCall_jiji)(e, t, _, s, r), _orig$ts_parser_timeout_micros = Module._orig$ts_parser_timeout_micros = (e) => (_orig$ts_parser_timeout_micros = Module._orig$ts_parser_timeout_micros = wasmExports.orig$ts_parser_timeout_micros)(e), _orig$ts_parser_set_timeout_micros = Module._orig$ts_parser_set_timeout_micros = (e, t) => (_orig$ts_parser_set_timeout_micros = Module._orig$ts_parser_set_timeout_micros = wasmExports.orig$ts_parser_set_timeout_micros)(e, t), calledRun; function callMain(e = []) { var t = resolveGlobalSymbol("main").sym; if (t) { e.unshift(thisProgram); var _ = e.length, s = stackAlloc(4 * (_ + 1)), r = s; e.forEach((e2) => { HEAPU32[r >> 2] = stringToUTF8OnStack(e2), r += 4; }), HEAPU32[r >> 2] = 0; try { var a = t(_, s); return exitJS(a, true), a; } catch (e2) { return handleException(e2); } } } function run(e = arguments_) { function t() { calledRun || (calledRun = true, Module.calledRun = true, ABORT || (initRuntime(), preMain(), Module.onRuntimeInitialized && Module.onRuntimeInitialized(), shouldRunNow && callMain(e), postRun())); } runDependencies > 0 || (preRun(), runDependencies > 0 || (Module.setStatus ? (Module.setStatus("Running..."), setTimeout(function() { setTimeout(function() { Module.setStatus(""); }, 1), t(); }, 1)) : t())); } if (Module.AsciiToString = AsciiToString, Module.stringToUTF16 = stringToUTF16, dependenciesFulfilled = function e() { calledRun || run(), calledRun || (dependenciesFulfilled = e); }, Module.preInit) for ("function" == typeof Module.preInit && (Module.preInit = [Module.preInit]); Module.preInit.length > 0; ) Module.preInit.pop()(); var shouldRunNow = true; Module.noInitialRun && (shouldRunNow = false), run(); const C = Module, INTERNAL = {}, SIZE_OF_INT = 4, SIZE_OF_CURSOR = 4 * SIZE_OF_INT, SIZE_OF_NODE = 5 * SIZE_OF_INT, SIZE_OF_POINT = 2 * SIZE_OF_INT, SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT, ZERO_POINT = { row: 0, column: 0 }, QUERY_WORD_REGEX = /[\w-.]*/g, PREDICATE_STEP_TYPE_CAPTURE = 1, PREDICATE_STEP_TYPE_STRING = 2, LANGUAGE_FUNCTION_REGEX = /^_?tree_sitter_\w+/; let VERSION, MIN_COMPATIBLE_VERSION, TRANSFER_BUFFER, currentParseCallback, currentLogCallback; class ParserImpl { static init() { TRANSFER_BUFFER = C._ts_init(), VERSION = getValue(TRANSFER_BUFFER, "i32"), MIN_COMPATIBLE_VERSION = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); } initialize() { C._ts_parser_new_wasm(), this[0] = getValue(TRANSFER_BUFFER, "i32"), this[1] = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); } delete() { C._ts_parser_delete(this[0]), C._free(this[1]), this[0] = 0, this[1] = 0; } setLanguage(e) { let t; if (e) { if (e.constructor !== Language) throw new Error("Argument must be a Language"); { t = e[0]; const _ = C._ts_language_version(t); if (_ < MIN_COMPATIBLE_VERSION || VERSION < _) throw new Error(`Incompatible language version ${_}. Compatibility range ${MIN_COMPATIBLE_VERSION} through ${VERSION}.`); } } else t = 0, e = null; return this.language = e, C._ts_parser_set_language(this[0], t), this; } getLanguage() { return this.language; } parse(e, t, _) { if ("string" == typeof e) currentParseCallback = (t2, _2) => e.slice(t2); else { if ("function" != typeof e) throw new Error("Argument must be a string or a function"); currentParseCallback = e; } this.logCallback ? (currentLogCallback = this.logCallback, C._ts_parser_enable_logger_wasm(this[0], 1)) : (currentLogCallback = null, C._ts_parser_enable_logger_wasm(this[0], 0)); let s = 0, r = 0; if (_?.includedRanges) { s = _.includedRanges.length, r = C._calloc(s, SIZE_OF_RANGE); let e2 = r; for (let t2 = 0; t2 < s; t2++) marshalRange(e2, _.includedRanges[t2]), e2 += SIZE_OF_RANGE; } const a = C._ts_parser_parse_wasm(this[0], this[1], t ? t[0] : 0, r, s); if (!a) throw currentParseCallback = null, currentLogCallback = null, new Error("Parsing failed"); const o = new Tree(INTERNAL, a, this.language, currentParseCallback); return currentParseCallback = null, currentLogCallback = null, o; } reset() { C._ts_parser_reset(this[0]); } getIncludedRanges() { C._ts_parser_included_ranges_wasm(this[0]); const e = getValue(TRANSFER_BUFFER, "i32"), t = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), _ = new Array(e); if (e > 0) { let s = t; for (let t2 = 0; t2 < e; t2++) _[t2] = unmarshalRange(s), s += SIZE_OF_RANGE; C._free(t); } return _; } getTimeoutMicros() { return C._ts_parser_timeout_micros(this[0]); } setTimeoutMicros(e) { C._ts_parser_set_timeout_micros(this[0], e); } setLogger(e) { if (e) { if ("function" != typeof e) throw new Error("Logger callback must be a function"); } else e = null; return this.logCallback = e, this; } getLogger() { return this.logCallback; } } class Tree { constructor(e, t, _, s) { assertInternal(e), this[0] = t, this.language = _, this.textCallback = s; } copy() { const e = C._ts_tree_copy(this[0]); return new Tree(INTERNAL, e, this.language, this.textCallback); } delete() { C._ts_tree_delete(this[0]), this[0] = 0; } edit(e) { marshalEdit(e), C._ts_tree_edit_wasm(this[0]); } get rootNode() { return C._ts_tree_root_node_wasm(this[0]), unmarshalNode(this); } rootNodeWithOffset(e, t) { const _ = TRANSFER_BUFFER + SIZE_OF_NODE; return setValue(_, e, "i32"), marshalPoint(_ + SIZE_OF_INT, t), C._ts_tree_root_node_with_offset_wasm(this[0]), unmarshalNode(this); } getLanguage() { return this.language; } walk() { return this.rootNode.walk(); } getChangedRanges(e) { if (e.constructor !== Tree) throw new TypeError("Argument must be a Tree"); C._ts_tree_get_changed_ranges_wasm(this[0], e[0]); const t = getValue(TRANSFER_BUFFER, "i32"), _ = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), s = new Array(t); if (t > 0) { let e2 = _; for (let _2 = 0; _2 < t; _2++) s[_2] = unmarshalRange(e2), e2 += SIZE_OF_RANGE; C._free(_); } return s; } getIncludedRanges() { C._ts_tree_included_ranges_wasm(this[0]); const e = getValue(TRANSFER_BUFFER, "i32"), t = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), _ = new Array(e); if (e > 0) { let s = t; for (let t2 = 0; t2 < e; t2++) _[t2] = unmarshalRange(s), s += SIZE_OF_RANGE; C._free(t); } return _; } } class Node { constructor(e, t) { assertInternal(e), this.tree = t; } get typeId() { return marshalNode(this), C._ts_node_symbol_wasm(this.tree[0]); } get grammarId() { return marshalNode(this), C._ts_node_grammar_symbol_wasm(this.tree[0]); } get type() { return this.tree.language.types[this.typeId] || "ERROR"; } get grammarType() { return this.tree.language.types[this.grammarId] || "ERROR"; } get endPosition() { return marshalNode(this), C._ts_node_end_point_wasm(this.tree[0]), unmarshalPoint(TRANSFER_BUFFER); } get endIndex() { return marshalNode(this), C._ts_node_end_index_wasm(this.tree[0]); } get text() { return getText(this.tree, this.startIndex, this.endIndex); } get parseState() { return marshalNode(this), C._ts_node_parse_state_wasm(this.tree[0]); } get nextParseState() { return marshalNode(this), C._ts_node_next_parse_state_wasm(this.tree[0]); } get isNamed() { return marshalNode(this), 1 === C._ts_node_is_named_wasm(this.tree[0]); } get hasError() { return marshalNode(this), 1 === C._ts_node_has_error_wasm(this.tree[0]); } get hasChanges() { return marshalNode(this), 1 === C._ts_node_has_changes_wasm(this.tree[0]); } get isError() { return marshalNode(this), 1 === C._ts_node_is_error_wasm(this.tree[0]); } get isMissing() { return marshalNode(this), 1 === C._ts_node_is_missing_wasm(this.tree[0]); } get isExtra() { return marshalNode(this), 1 === C._ts_node_is_extra_wasm(this.tree[0]); } equals(e) { return this.id === e.id; } child(e) { return marshalNode(this), C._ts_node_child_wasm(this.tree[0], e), unmarshalNode(this.tree); } namedChild(e) { return marshalNode(this), C._ts_node_named_child_wasm(this.tree[0], e), unmarshalNode(this.tree); } childForFieldId(e) { return marshalNode(this), C._ts_node_child_by_field_id_wasm(this.tree[0], e), unmarshalNode(this.tree); } childForFieldName(e) { const t = this.tree.language.fields.indexOf(e); return -1 !== t ? this.childForFieldId(t) : null; } fieldNameForChild(e) { marshalNode(this); const t = C._ts_node_field_name_for_child_wasm(this.tree[0], e); if (!t) return null; return AsciiToString(t); } childrenForFieldName(e) { const t = this.tree.language.fields.indexOf(e); return -1 !== t && 0 !== t ? this.childrenForFieldId(t) : []; } childrenForFieldId(e) { marshalNode(this), C._ts_node_children_by_field_id_wasm(this.tree[0], e); const t = getValue(TRANSFER_BUFFER, "i32"), _ = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), s = new Array(t); if (t > 0) { let e2 = _; for (let _2 = 0; _2 < t; _2++) s[_2] = unmarshalNode(this.tree, e2), e2 += SIZE_OF_NODE; C._free(_); } return s; } firstChildForIndex(e) { marshalNode(this); return setValue(TRANSFER_BUFFER + SIZE_OF_NODE, e, "i32"), C._ts_node_first_child_for_byte_wasm(this.tree[0]), unmarshalNode(this.tree); } firstNamedChildForIndex(e) { marshalNode(this); return setValue(TRANSFER_BUFFER + SIZE_OF_NODE, e, "i32"), C._ts_node_first_named_child_for_byte_wasm(this.tree[0]), unmarshalNode(this.tree); } get childCount() { return marshalNode(this), C._ts_node_child_count_wasm(this.tree[0]); } get namedChildCount() { return marshalNode(this), C._ts_node_named_child_count_wasm(this.tree[0]); } get firstChild() { return this.child(0); } get firstNamedChild() { return this.namedChild(0); } get lastChild() { return this.child(this.childCount - 1); } get lastNamedChild() { return this.namedChild(this.namedChildCount - 1); } get children() { if (!this._children) { marshalNode(this), C._ts_node_children_wasm(this.tree[0]); const e = getValue(TRANSFER_BUFFER, "i32"), t = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); if (this._children = new Array(e), e > 0) { let _ = t; for (let t2 = 0; t2 < e; t2++) this._children[t2] = unmarshalNode(this.tree, _), _ += SIZE_OF_NODE; C._free(t); } } return this._children; } get namedChildren() { if (!this._namedChildren) { marshalNode(this), C._ts_node_named_children_wasm(this.tree[0]); const e = getValue(TRANSFER_BUFFER, "i32"), t = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"); if (this._namedChildren = new Array(e), e > 0) { let _ = t; for (let t2 = 0; t2 < e; t2++) this._namedChildren[t2] = unmarshalNode(this.tree, _), _ += SIZE_OF_NODE; C._free(t); } } return this._namedChildren; } descendantsOfType(e, t, _) { Array.isArray(e) || (e = [e]), t || (t = ZERO_POINT), _ || (_ = ZERO_POINT); const s = [], r = this.tree.language.types; for (let t2 = 0, _2 = r.length; t2 < _2; t2++) e.includes(r[t2]) && s.push(t2); const a = C._malloc(SIZE_OF_INT * s.length); for (let e2 = 0, t2 = s.length; e2 < t2; e2++) setValue(a + e2 * SIZE_OF_INT, s[e2], "i32"); marshalNode(this), C._ts_node_descendants_of_type_wasm(this.tree[0], a, s.length, t.row, t.column, _.row, _.column); const o = getValue(TRANSFER_BUFFER, "i32"), n = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), l = new Array(o); if (o > 0) { let e2 = n; for (let t2 = 0; t2 < o; t2++) l[t2] = unmarshalNode(this.tree, e2), e2 += SIZE_OF_NODE; } return C._free(n), C._free(a), l; } get nextSibling() { return marshalNode(this), C._ts_node_next_sibling_wasm(this.tree[0]), unmarshalNode(this.tree); } get previousSibling() { return marshalNode(this), C._ts_node_prev_sibling_wasm(this.tree[0]), unmarshalNode(this.tree); } get nextNamedSibling() { return marshalNode(this), C._ts_node_next_named_sibling_wasm(this.tree[0]), unmarshalNode(this.tree); } get previousNamedSibling() { return marshalNode(this), C._ts_node_prev_named_sibling_wasm(this.tree[0]), unmarshalNode(this.tree); } get descendantCount() { return marshalNode(this), C._ts_node_descendant_count_wasm(this.tree[0]); } get parent() { return marshalNode(this), C._ts_node_parent_wasm(this.tree[0]), unmarshalNode(this.tree); } descendantForIndex(e, t = e) { if ("number" != typeof e || "number" != typeof t) throw new Error("Arguments must be numbers"); marshalNode(this); const _ = TRANSFER_BUFFER + SIZE_OF_NODE; return setValue(_, e, "i32"), setValue(_ + SIZE_OF_INT, t, "i32"), C._ts_node_descendant_for_index_wasm(this.tree[0]), unmarshalNode(this.tree); } namedDescendantForIndex(e, t = e) { if ("number" != typeof e || "number" != typeof t) throw new Error("Arguments must be numbers"); marshalNode(this); const _ = TRANSFER_BUFFER + SIZE_OF_NODE; return setValue(_, e, "i32"), setValue(_ + SIZE_OF_INT, t, "i32"), C._ts_node_named_descendant_for_index_wasm(this.tree[0]), unmarshalNode(this.tree); } descendantForPosition(e, t = e) { if (!isPoint(e) || !isPoint(t)) throw new Error("Arguments must be {row, column} objects"); marshalNode(this); const _ = TRANSFER_BUFFER + SIZE_OF_NODE; return marshalPoint(_, e), marshalPoint(_ + SIZE_OF_POINT, t), C._ts_node_descendant_for_position_wasm(this.tree[0]), unmarshalNode(this.tree); } namedDescendantForPosition(e, t = e) { if (!isPoint(e) || !isPoint(t)) throw new Error("Arguments must be {row, column} objects"); marshalNode(this); const _ = TRANSFER_BUFFER + SIZE_OF_NODE; return marshalPoint(_, e), marshalPoint(_ + SIZE_OF_POINT, t), C._ts_node_named_descendant_for_position_wasm(this.tree[0]), unmarshalNode(this.tree); } walk() { return marshalNode(this), C._ts_tree_cursor_new_wasm(this.tree[0]), new TreeCursor(INTERNAL, this.tree); } toString() { marshalNode(this); const e = C._ts_node_to_string_wasm(this.tree[0]), t = AsciiToString(e); return C._free(e), t; } } class TreeCursor { constructor(e, t) { assertInternal(e), this.tree = t, unmarshalTreeCursor(this); } delete() { marshalTreeCursor(this), C._ts_tree_cursor_delete_wasm(this.tree[0]), this[0] = this[1] = this[2] = 0; } reset(e) { marshalNode(e), marshalTreeCursor(this, TRANSFER_BUFFER + SIZE_OF_NODE), C._ts_tree_cursor_reset_wasm(this.tree[0]), unmarshalTreeCursor(this); } resetTo(e) { marshalTreeCursor(this, TRANSFER_BUFFER), marshalTreeCursor(e, TRANSFER_BUFFER + SIZE_OF_CURSOR), C._ts_tree_cursor_reset_to_wasm(this.tree[0], e.tree[0]), unmarshalTreeCursor(this); } get nodeType() { return this.tree.language.types[this.nodeTypeId] || "ERROR"; } get nodeTypeId() { return marshalTreeCursor(this), C._ts_tree_cursor_current_node_type_id_wasm(this.tree[0]); } get nodeStateId() { return marshalTreeCursor(this), C._ts_tree_cursor_current_node_state_id_wasm(this.tree[0]); } get nodeId() { return marshalTreeCursor(this), C._ts_tree_cursor_current_node_id_wasm(this.tree[0]); } get nodeIsNamed() { return marshalTreeCursor(this), 1 === C._ts_tree_cursor_current_node_is_named_wasm(this.tree[0]); } get nodeIsMissing() { return marshalTreeCursor(this), 1 === C._ts_tree_cursor_current_node_is_missing_wasm(this.tree[0]); } get nodeText() { marshalTreeCursor(this); const e = C._ts_tree_cursor_start_index_wasm(this.tree[0]), t = C._ts_tree_cursor_end_index_wasm(this.tree[0]); return getText(this.tree, e, t); } get startPosition() { return marshalTreeCursor(this), C._ts_tree_cursor_start_position_wasm(this.tree[0]), unmarshalPoint(TRANSFER_BUFFER); } get endPosition() { return marshalTreeCursor(this), C._ts_tree_cursor_end_position_wasm(this.tree[0]), unmarshalPoint(TRANSFER_BUFFER); } get startIndex() { return marshalTreeCursor(this), C._ts_tree_cursor_start_index_wasm(this.tree[0]); } get endIndex() { return marshalTreeCursor(this), C._ts_tree_cursor_end_index_wasm(this.tree[0]); } get currentNode() { return marshalTreeCursor(this), C._ts_tree_cursor_current_node_wasm(this.tree[0]), unmarshalNode(this.tree); } get currentFieldId() { return marshalTreeCursor(this), C._ts_tree_cursor_current_field_id_wasm(this.tree[0]); } get currentFieldName() { return this.tree.language.fields[this.currentFieldId]; } get currentDepth() { return marshalTreeCursor(this), C._ts_tree_cursor_current_depth_wasm(this.tree[0]); } get currentDescendantIndex() { return marshalTreeCursor(this), C._ts_tree_cursor_current_descendant_index_wasm(this.tree[0]); } gotoFirstChild() { marshalTreeCursor(this); const e = C._ts_tree_cursor_goto_first_child_wasm(this.tree[0]); return unmarshalTreeCursor(this), 1 === e; } gotoLastChild() { marshalTreeCursor(this); const e = C._ts_tree_cursor_goto_last_child_wasm(this.tree[0]); return unmarshalTreeCursor(this), 1 === e; } gotoFirstChildForIndex(e) { marshalTreeCursor(this), setValue(TRANSFER_BUFFER + SIZE_OF_CURSOR, e, "i32"); const t = C._ts_tree_cursor_goto_first_child_for_index_wasm(this.tree[0]); return unmarshalTreeCursor(this), 1 === t; } gotoFirstChildForPosition(e) { marshalTreeCursor(this), marshalPoint(TRANSFER_BUFFER + SIZE_OF_CURSOR, e); const t = C._ts_tree_cursor_goto_first_child_for_position_wasm(this.tree[0]); return unmarshalTreeCursor(this), 1 === t; } gotoNextSibling() { marshalTreeCursor(this); const e = C._ts_tree_cursor_goto_next_sibling_wasm(this.tree[0]); return unmarshalTreeCursor(this), 1 === e; } gotoPreviousSibling() { marshalTreeCursor(this); const e = C._ts_tree_cursor_goto_previous_sibling_wasm(this.tree[0]); return unmarshalTreeCursor(this), 1 === e; } gotoDescendant(e) { marshalTreeCursor(this), C._ts_tree_cursor_goto_descendant_wasm(this.tree[0], e), unmarshalTreeCursor(this); } gotoParent() { marshalTreeCursor(this); const e = C._ts_tree_cursor_goto_parent_wasm(this.tree[0]); return unmarshalTreeCursor(this), 1 === e; } } class Language { constructor(e, t) { assertInternal(e), this[0] = t, this.types = new Array(C._ts_language_symbol_count(this[0])); for (let e2 = 0, t2 = this.types.length; e2 < t2; e2++) C._ts_language_symbol_type(this[0], e2) < 2 && (this.types[e2] = UTF8ToString(C._ts_language_symbol_name(this[0], e2))); this.fields = new Array(C._ts_language_field_count(this[0]) + 1); for (let e2 = 0, t2 = this.fields.length; e2 < t2; e2++) { const t3 = C._ts_language_field_name_for_id(this[0], e2); this.fields[e2] = 0 !== t3 ? UTF8ToString(t3) : null; } } get version() { return C._ts_language_version(this[0]); } get fieldCount() { return this.fields.length - 1; } get stateCount() { return C._ts_language_state_count(this[0]); } fieldIdForName(e) { const t = this.fields.indexOf(e); return -1 !== t ? t : null; } fieldNameForId(e) { return this.fields[e] || null; } idForNodeType(e, t) { const _ = lengthBytesUTF8(e), s = C._malloc(_ + 1); stringToUTF8(e, s, _ + 1); const r = C._ts_language_symbol_for_name(this[0], s, _, t); return C._free(s), r || null; } get nodeTypeCount() { return C._ts_language_symbol_count(this[0]); } nodeTypeForId(e) { const t = C._ts_language_symbol_name(this[0], e); return t ? UTF8ToString(t) : null; } nodeTypeIsNamed(e) { return !!C._ts_language_type_is_named_wasm(this[0], e); } nodeTypeIsVisible(e) { return !!C._ts_language_type_is_visible_wasm(this[0], e); } nextState(e, t) { return C._ts_language_next_state(this[0], e, t); } lookaheadIterator(e) { const t = C._ts_lookahead_iterator_new(this[0], e); return t ? new LookaheadIterable(INTERNAL, t, this) : null; } query(e) { const t = lengthBytesUTF8(e), _ = C._malloc(t + 1); stringToUTF8(e, _, t + 1); const s = C._ts_query_new(this[0], _, t, TRANSFER_BUFFER, TRANSFER_BUFFER + SIZE_OF_INT); if (!s) { const t2 = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), s2 = getValue(TRANSFER_BUFFER, "i32"), r2 = UTF8ToString(_, s2).length, a2 = e.substr(r2, 100).split("\n")[0]; let o2, n2 = a2.match(QUERY_WORD_REGEX)[0]; switch (t2) { case 2: o2 = new RangeError(`Bad node name '${n2}'`); break; case 3: o2 = new RangeError(`Bad field name '${n2}'`); break; case 4: o2 = new RangeError(`Bad capture name @${n2}`); break; case 5: o2 = new TypeError(`Bad pattern structure at offset ${r2}: '${a2}'...`), n2 = ""; break; default: o2 = new SyntaxError(`Bad syntax at offset ${r2}: '${a2}'...`), n2 = ""; } throw o2.index = r2, o2.length = n2.length, C._free(_), o2; } const r = C._ts_query_string_count(s), a = C._ts_query_capture_count(s), o = C._ts_query_pattern_count(s), n = new Array(a), l = new Array(r); for (let e2 = 0; e2 < a; e2++) { const t2 = C._ts_query_capture_name_for_id(s, e2, TRANSFER_BUFFER), _2 = getValue(TRANSFER_BUFFER, "i32"); n[e2] = UTF8ToString(t2, _2); } for (let e2 = 0; e2 < r; e2++) { const t2 = C._ts_query_string_value_for_id(s, e2, TRANSFER_BUFFER), _2 = getValue(TRANSFER_BUFFER, "i32"); l[e2] = UTF8ToString(t2, _2); } const d = new Array(o), u = new Array(o), m = new Array(o), c = new Array(o), w = new Array(o); for (let e2 = 0; e2 < o; e2++) { const t2 = C._ts_query_predicates_for_pattern(s, e2, TRANSFER_BUFFER), _2 = getValue(TRANSFER_BUFFER, "i32"); c[e2] = [], w[e2] = []; const r2 = []; let a2 = t2; for (let t3 = 0; t3 < _2; t3++) { const t4 = getValue(a2, "i32"); a2 += SIZE_OF_INT; const _3 = getValue(a2, "i32"); if (a2 += SIZE_OF_INT, t4 === PREDICATE_STEP_TYPE_CAPTURE) r2.push({ type: "capture", name: n[_3] }); else if (t4 === PREDICATE_STEP_TYPE_STRING) r2.push({ type: "string", value: l[_3] }); else if (r2.length > 0) { if ("string" !== r2[0].type) throw new Error("Predicates must begin with a literal value"); const t5 = r2[0].value; let _4, s2 = true, a3 = true; switch (t5) { case "any-not-eq?": case "not-eq?": s2 = false; case "any-eq?": case "eq?": if (3 !== r2.length) throw new Error(`Wrong number of arguments to \`#${t5}\` predicate. Expected 2, got ${r2.length - 1}`); if ("capture" !== r2[1].type) throw new Error(`First argument of \`#${t5}\` predicate must be a capture. Got "${r2[1].value}"`); if (a3 = !t5.startsWith("any-"), "capture" === r2[2].type) { const t6 = r2[1].name, _5 = r2[2].name; w[e2].push((e3) => { const r3 = [], o3 = []; for (const s3 of e3) s3.name === t6 && r3.push(s3.node), s3.name === _5 && o3.push(s3.node); const n3 = (e4, t7, _6) => _6 ? e4.text === t7.text : e4.text !== t7.text; return a3 ? r3.every((e4) => o3.some((t7) => n3(e4, t7, s2))) : r3.some((e4) => o3.some((t7) => n3(e4, t7, s2))); }); } else { _4 = r2[1].name; const t6 = r2[2].value, o3 = (e3) => e3.text === t6, n3 = (e3) => e3.text !== t6; w[e2].push((e3) => { const t7 = []; for (const s3 of e3) s3.name === _4 && t7.push(s3.node); const r3 = s2 ? o3 : n3; return a3 ? t7.every(r3) : t7.some(r3); }); } break; case "any-not-match?": case "not-match?": s2 = false; case "any-match?": case "match?": if (3 !== r2.length) throw new Error(`Wrong number of arguments to \`#${t5}\` predicate. Expected 2, got ${r2.length - 1}.`); if ("capture" !== r2[1].type) throw new Error(`First argument of \`#${t5}\` predicate must be a capture. Got "${r2[1].value}".`); if ("string" !== r2[2].type) throw new Error(`Second argument of \`#${t5}\` predicate must be a string. Got @${r2[2].value}.`); _4 = r2[1].name; const o2 = new RegExp(r2[2].value); a3 = !t5.startsWith("any-"), w[e2].push((e3) => { const t6 = []; for (const s3 of e3) s3.name === _4 && t6.push(s3.node.text); const r3 = (e4, t7) => t7 ? o2.test(e4) : !o2.test(e4); return 0 === t6.length ? !s2 : a3 ? t6.every((e4) => r3(e4, s2)) : t6.some((e4) => r3(e4, s2)); }); break; case "set!": if (r2.length < 2 || r2.length > 3) throw new Error(`Wrong number of arguments to \`#set!\` predicate. Expected 1 or 2. Got ${r2.length - 1}.`); if (r2.some((e3) => "string" !== e3.type)) throw new Error('Arguments to `#set!` predicate must be a strings.".'); d[e2] || (d[e2] = {}), d[e2][r2[1].value] = r2[2] ? r2[2].value : null; break; case "is?": case "is-not?": if (r2.length < 2 || r2.length > 3) throw new Error(`Wrong number of arguments to \`#${t5}\` predicate. Expected 1 or 2. Got ${r2.length - 1}.`); if (r2.some((e3) => "string" !== e3.type)) throw new Error(`Arguments to \`#${t5}\` predicate must be a strings.".`); const n2 = "is?" === t5 ? u : m; n2[e2] || (n2[e2] = {}), n2[e2][r2[1].value] = r2[2] ? r2[2].value : null; break; case "not-any-of?": s2 = false; case "any-of?": if (r2.length < 2) throw new Error(`Wrong number of arguments to \`#${t5}\` predicate. Expected at least 1. Got ${r2.length - 1}.`); if ("capture" !== r2[1].type) throw new Error(`First argument of \`#${t5}\` predicate must be a capture. Got "${r2[1].value}".`); for (let e3 = 2; e3 < r2.length; e3++) if ("string" !== r2[e3].type) throw new Error(`Arguments to \`#${t5}\` predicate must be a strings.".`); _4 = r2[1].name; const l2 = r2.slice(2).map((e3) => e3.value); w[e2].push((e3) => { const t6 = []; for (const s3 of e3) s3.name === _4 && t6.push(s3.node.text); return 0 === t6.length ? !s2 : t6.every((e4) => l2.includes(e4)) === s2; }); break; default: c[e2].push({ operator: t5, operands: r2.slice(1) }); } r2.length = 0; } } Object.freeze(d[e2]), Object.freeze(u[e2]), Object.freeze(m[e2]); } return C._free(_), new Query(INTERNAL, s, n, w, c, Object.freeze(d), Object.freeze(u), Object.freeze(m)); } static load(e) { let t; if (e instanceof Uint8Array) t = Promise.resolve(e); else { const _ = e; if ("undefined" != typeof process && process.versions && process.versions.node) { const e2 = require("fs"); t = Promise.resolve(e2.readFileSync(_)); } else t = fetch(_).then((e2) => e2.arrayBuffer().then((t2) => { if (e2.ok) return new Uint8Array(t2); { const _2 = new TextDecoder("utf-8").decode(t2); throw new Error(`Language.load failed with status ${e2.status}. ${_2}`); } })); } return t.then((e2) => loadWebAssemblyModule(e2, { loadAsync: true })).then((e2) => { const t2 = Object.keys(e2), _ = t2.find((e3) => LANGUAGE_FUNCTION_REGEX.test(e3) && !e3.includes("external_scanner_")); _ || console.log(`Couldn't find language function in WASM file. Symbols: ${JSON.stringify(t2, null, 2)}`); const s = e2[_](); return new Language(INTERNAL, s); }); } } class LookaheadIterable { constructor(e, t, _) { assertInternal(e), this[0] = t, this.language = _; } get currentTypeId() { return C._ts_lookahead_iterator_current_symbol(this[0]); } get currentType() { return this.language.types[this.currentTypeId] || "ERROR"; } delete() { C._ts_lookahead_iterator_delete(this[0]), this[0] = 0; } resetState(e) { return C._ts_lookahead_iterator_reset_state(this[0], e); } reset(e, t) { return !!C._ts_lookahead_iterator_reset(this[0], e[0], t) && (this.language = e, true); } [Symbol.iterator]() { const e = this; return { next: () => C._ts_lookahead_iterator_next(e[0]) ? { done: false, value: e.currentType } : { done: true, value: "" } }; } } class Query { constructor(e, t, _, s, r, a, o, n) { assertInternal(e), this[0] = t, this.captureNames = _, this.textPredicates = s, this.predicates = r, this.setProperties = a, this.assertedProperties = o, this.refutedProperties = n, this.exceededMatchLimit = false; } delete() { C._ts_query_delete(this[0]), this[0] = 0; } matches(e, { startPosition: t = ZERO_POINT, endPosition: _ = ZERO_POINT, startIndex: s = 0, endIndex: r = 0, matchLimit: a = 4294967295, maxStartDepth: o = 4294967295 } = {}) { if ("number" != typeof a) throw new Error("Arguments must be numbers"); marshalNode(e), C._ts_query_matches_wasm(this[0], e.tree[0], t.row, t.column, _.row, _.column, s, r, a, o); const n = getValue(TRANSFER_BUFFER, "i32"), l = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), d = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"), u = new Array(n); this.exceededMatchLimit = Boolean(d); let m = 0, c = l; for (let t2 = 0; t2 < n; t2++) { const t3 = getValue(c, "i32"); c += SIZE_OF_INT; const _2 = getValue(c, "i32"); c += SIZE_OF_INT; const s2 = new Array(_2); if (c = unmarshalCaptures(this, e.tree, c, s2), this.textPredicates[t3].every((e2) => e2(s2))) { u[m] = { pattern: t3, captures: s2 }; const e2 = this.setProperties[t3]; e2 && (u[m].setProperties = e2); const _3 = this.assertedProperties[t3]; _3 && (u[m].assertedProperties = _3); const r2 = this.refutedProperties[t3]; r2 && (u[m].refutedProperties = r2), m++; } } return u.length = m, C._free(l), u; } captures(e, { startPosition: t = ZERO_POINT, endPosition: _ = ZERO_POINT, startIndex: s = 0, endIndex: r = 0, matchLimit: a = 4294967295, maxStartDepth: o = 4294967295 } = {}) { if ("number" != typeof a) throw new Error("Arguments must be numbers"); marshalNode(e), C._ts_query_captures_wasm(this[0], e.tree[0], t.row, t.column, _.row, _.column, s, r, a, o); const n = getValue(TRANSFER_BUFFER, "i32"), l = getValue(TRANSFER_BUFFER + SIZE_OF_INT, "i32"), d = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"), u = []; this.exceededMatchLimit = Boolean(d); const m = []; let c = l; for (let t2 = 0; t2 < n; t2++) { const t3 = getValue(c, "i32"); c += SIZE_OF_INT; const _2 = getValue(c, "i32"); c += SIZE_OF_INT; const s2 = getValue(c, "i32"); if (c += SIZE_OF_INT, m.length = _2, c = unmarshalCaptures(this, e.tree, c, m), this.textPredicates[t3].every((e2) => e2(m))) { const e2 = m[s2], _3 = this.setProperties[t3]; _3 && (e2.setProperties = _3); const r2 = this.assertedProperties[t3]; r2 && (e2.assertedProperties = r2); const a2 = this.refutedProperties[t3]; a2 && (e2.refutedProperties = a2), u.push(e2); } } return C._free(l), u; } predicatesForPattern(e) { return this.predicates[e]; } disableCapture(e) { const t = lengthBytesUTF8(e), _ = C._malloc(t + 1); stringToUTF8(e, _, t + 1), C._ts_query_disable_capture(this[0], _, t), C._free(_); } didExceedMatchLimit() { return this.exceededMatchLimit; } } function getText(e, t, _) { const s = _ - t; let r = e.textCallback(t, null, _); for (t += r.length; t < _; ) { const s2 = e.textCallback(t, null, _); if (!(s2 && s2.length > 0)) break; t += s2.length, r += s2; } return t > _ && (r = r.slice(0, s)), r; } function unmarshalCaptures(e, t, _, s) { for (let r = 0, a = s.length; r < a; r++) { const a2 = getValue(_, "i32"), o = unmarshalNode(t, _ += SIZE_OF_INT); _ += SIZE_OF_NODE, s[r] = { name: e.captureNames[a2], node: o }; } return _; } function assertInternal(e) { if (e !== INTERNAL) throw new Error("Illegal constructor"); } function isPoint(e) { return e && "number" == typeof e.row && "number" == typeof e.column; } function marshalNode(e) { let t = TRANSFER_BUFFER; setValue(t, e.id, "i32"), t += SIZE_OF_INT, setValue(t, e.startIndex, "i32"), t += SIZE_OF_INT, setValue(t, e.startPosition.row, "i32"), t += SIZE_OF_INT, setValue(t, e.startPosition.column, "i32"), t += SIZE_OF_INT, setValue(t, e[0], "i32"); } function unmarshalNode(e, t = TRANSFER_BUFFER) { const _ = getValue(t, "i32"); if (0 === _) return null; const s = getValue(t += SIZE_OF_INT, "i32"), r = getValue(t += SIZE_OF_INT, "i32"), a = getValue(t += SIZE_OF_INT, "i32"), o = getValue(t += SIZE_OF_INT, "i32"), n = new Node(INTERNAL, e); return n.id = _, n.startIndex = s, n.startPosition = { row: r, column: a }, n[0] = o, n; } function marshalTreeCursor(e, t = TRANSFER_BUFFER) { setValue(t + 0 * SIZE_OF_INT, e[0], "i32"), setValue(t + 1 * SIZE_OF_INT, e[1], "i32"), setValue(t + 2 * SIZE_OF_INT, e[2], "i32"), setValue(t + 3 * SIZE_OF_INT, e[3], "i32"); } function unmarshalTreeCursor(e) { e[0] = getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, "i32"), e[1] = getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, "i32"), e[2] = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, "i32"), e[3] = getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, "i32"); } function marshalPoint(e, t) { setValue(e, t.row, "i32"), setValue(e + SIZE_OF_INT, t.column, "i32"); } function unmarshalPoint(e) { return { row: getValue(e, "i32") >>> 0, column: getValue(e + SIZE_OF_INT, "i32") >>> 0 }; } function marshalRange(e, t) { marshalPoint(e, t.startPosition), marshalPoint(e += SIZE_OF_POINT, t.endPosition), setValue(e += SIZE_OF_POINT, t.startIndex, "i32"), setValue(e += SIZE_OF_INT, t.endIndex, "i32"), e += SIZE_OF_INT; } function unmarshalRange(e) { const t = {}; return t.startPosition = unmarshalPoint(e), e += SIZE_OF_POINT, t.endPosition = unmarshalPoint(e), e += SIZE_OF_POINT, t.startIndex = getValue(e, "i32") >>> 0, e += SIZE_OF_INT, t.endIndex = getValue(e, "i32") >>> 0, t; } function marshalEdit(e) { let t = TRANSFER_BUFFER; marshalPoint(t, e.startPosition), t += SIZE_OF_POINT, marshalPoint(t, e.oldEndPosition), t += SIZE_OF_POINT, marshalPoint(t, e.newEndPosition), t += SIZE_OF_POINT, setValue(t, e.startIndex, "i32"), t += SIZE_OF_INT, setValue(t, e.oldEndIndex, "i32"), t += SIZE_OF_INT, setValue(t, e.newEndIndex, "i32"), t += SIZE_OF_INT; } for (const e of Object.getOwnPropertyNames(ParserImpl.prototype)) Object.defineProperty(Parser.prototype, e, { value: ParserImpl.prototype[e], enumerable: false, writable: false }); Parser.Language = Language, Module.onRuntimeInitialized = () => { ParserImpl.init(), resolveInitPromise(); }; })); } } return Parser; }(); "object" == typeof exports && (module.exports = TreeSitter); } }); // node_modules/commander/lib/error.js var require_error = __commonJS({ "node_modules/commander/lib/error.js"(exports2) { var CommanderError = class extends Error { /** * Constructs the CommanderError class * @param {number} exitCode suggested exit code which could be used with process.exit * @param {string} code an id string representing the error * @param {string} message human-readable description of the error */ constructor(exitCode, code, message) { super(message); Error.captureStackTrace(this, this.constructor); this.name = this.constructor.name; this.code = code; this.exitCode = exitCode; this.nestedError = void 0; } }; var InvalidArgumentError = class extends CommanderError { /** * Constructs the InvalidArgumentError class * @param {string} [message] explanation of why argument is invalid */ constructor(message) { super(1, "commander.invalidArgument", message); Error.captureStackTrace(this, this.constructor); this.name = this.constructor.name; } }; exports2.CommanderError = CommanderError; exports2.InvalidArgumentError = InvalidArgumentError; } }); // node_modules/commander/lib/argument.js var require_argument = __commonJS({ "node_modules/commander/lib/argument.js"(exports2) { var { InvalidArgumentError } = require_error(); var Argument = class { /** * Initialize a new command argument with the given name and description. * The default is that the argument is required, and you can explicitly * indicate this with <> around the name. Put [] around the name for an optional argument. * * @param {string} name * @param {string} [description] */ constructor(name2, description) { this.description = description || ""; this.variadic = false; this.parseArg = void 0; this.defaultValue = void 0; this.defaultValueDescription = void 0; this.argChoices = void 0; switch (name2[0]) { case "<": this.required = true; this._name = name2.slice(1, -1); break; case "[": this.required = false; this._name = name2.slice(1, -1); break; default: this.required = true; this._name = name2; break; } if (this._name.length > 3 && this._name.slice(-3) === "...") { this.variadic = true; this._name = this._name.slice(0, -3); } } /** * Return argument name. * * @return {string} */ name() { return this._name; } /** * @package */ _concatValue(value, previous) { if (previous === this.defaultValue || !Array.isArray(previous)) { return [value]; } return previous.concat(value); } /** * Set the default value, and optionally supply the description to be displayed in the help. * * @param {*} value * @param {string} [description] * @return {Argument} */ default(value, description) { this.defaultValue = value; this.defaultValueDescription = description; return this; } /** * Set the custom handler for processing CLI command arguments into argument values. * * @param {Function} [fn] * @return {Argument} */ argParser(fn) { this.parseArg = fn; return this; } /** * Only allow argument value to be one of choices. * * @param {string[]} values * @return {Argument} */ choices(values) { this.argChoices = values.slice(); this.parseArg = (arg, previous) => { if (!this.argChoices.includes(arg)) { throw new InvalidArgumentError( `Allowed choices are ${this.argChoices.join(", ")}.` ); } if (this.variadic) { return this._concatValue(arg, previous); } return arg; }; return this; } /** * Make argument required. * * @returns {Argument} */ argRequired() { this.required = true; return this; } /** * Make argument optional. * * @returns {Argument} */ argOptional() { this.required = false; return this; } }; function humanReadableArgName(arg) { const nameOutput = arg.name() + (arg.variadic === true ? "..." : ""); return arg.required ? "<" + nameOutput + ">" : "[" + nameOutput + "]"; } exports2.Argument = Argument; exports2.humanReadableArgName = humanReadableArgName; } }); // node_modules/commander/lib/help.js var require_help = __commonJS({ "node_modules/commander/lib/help.js"(exports2) { var { humanReadableArgName } = require_argument(); var Help = class { constructor() { this.helpWidth = void 0; this.minWidthToWrap = 40; this.sortSubcommands = false; this.sortOptions = false; this.showGlobalOptions = false; } /** * prepareContext is called by Commander after applying overrides from `Command.configureHelp()` * and just before calling `formatHelp()`. * * Commander just uses the helpWidth and the rest is provided for optional use by more complex subclasses. * * @param {{ error?: boolean, helpWidth?: number, outputHasColors?: boolean }} contextOptions */ prepareContext(contextOptions) { this.helpWidth = this.helpWidth ?? contextOptions.helpWidth ?? 80; } /** * Get an array of the visible subcommands. Includes a placeholder for the implicit help command, if there is one. * * @param {Command} cmd * @returns {Command[]} */ visibleCommands(cmd) { const visibleCommands = cmd.commands.filter((cmd2) => !cmd2._hidden); const helpCommand = cmd._getHelpCommand(); if (helpCommand && !helpCommand._hidden) { visibleCommands.push(helpCommand); } if (this.sortSubcommands) { visibleCommands.sort((a, b) => { return a.name().localeCompare(b.name()); }); } return visibleCommands; } /** * Compare options for sort. * * @param {Option} a * @param {Option} b * @returns {number} */ compareOptions(a, b) { const getSortKey = (option) => { return option.short ? option.short.replace(/^-/, "") : option.long.replace(/^--/, ""); }; return getSortKey(a).localeCompare(getSortKey(b)); } /** * Get an array of the visible options. Includes a placeholder for the implicit help option, if there is one. * * @param {Command} cmd * @returns {Option[]} */ visibleOptions(cmd) { const visibleOptions = cmd.options.filter((option) => !option.hidden); const helpOption = cmd._getHelpOption(); if (helpOption && !helpOption.hidden) { const removeShort = helpOption.short && cmd._findOption(helpOption.short); const removeLong = helpOption.long && cmd._findOption(helpOption.long); if (!removeShort && !removeLong) { visibleOptions.push(helpOption); } else if (helpOption.long && !removeLong) { visibleOptions.push( cmd.createOption(helpOption.long, helpOption.description) ); } else if (helpOption.short && !removeShort) { visibleOptions.push( cmd.createOption(helpOption.short, helpOption.description) ); } } if (this.sortOptions) { visibleOptions.sort(this.compareOptions); } return visibleOptions; } /** * Get an array of the visible global options. (Not including help.) * * @param {Command} cmd * @returns {Option[]} */ visibleGlobalOptions(cmd) { if (!this.showGlobalOptions) return []; const globalOptions = []; for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) { const visibleOptions = ancestorCmd.options.filter( (option) => !option.hidden ); globalOptions.push(...visibleOptions); } if (this.sortOptions) { globalOptions.sort(this.compareOptions); } return globalOptions; } /** * Get an array of the arguments if any have a description. * * @param {Command} cmd * @returns {Argument[]} */ visibleArguments(cmd) { if (cmd._argsDescription) { cmd.registeredArguments.forEach((argument) => { argument.description = argument.description || cmd._argsDescription[argument.name()] || ""; }); } if (cmd.registeredArguments.find((argument) => argument.description)) { return cmd.registeredArguments; } return []; } /** * Get the command term to show in the list of subcommands. * * @param {Command} cmd * @returns {string} */ subcommandTerm(cmd) { const args2 = cmd.registeredArguments.map((arg) => humanReadableArgName(arg)).join(" "); return cmd._name + (cmd._aliases[0] ? "|" + cmd._aliases[0] : "") + (cmd.options.length ? " [options]" : "") + // simplistic check for non-help option (args2 ? " " + args2 : ""); } /** * Get the option term to show in the list of options. * * @param {Option} option * @returns {string} */ optionTerm(option) { return option.flags; } /** * Get the argument term to show in the list of arguments. * * @param {Argument} argument * @returns {string} */ argumentTerm(argument) { return argument.name(); } /** * Get the longest command term length. * * @param {Command} cmd * @param {Help} helper * @returns {number} */ longestSubcommandTermLength(cmd, helper) { return helper.visibleCommands(cmd).reduce((max, command) => { return Math.max( max, this.displayWidth( helper.styleSubcommandTerm(helper.subcommandTerm(command)) ) ); }, 0); } /** * Get the longest option term length. * * @param {Command} cmd * @param {Help} helper * @returns {number} */ longestOptionTermLength(cmd, helper) { return helper.visibleOptions(cmd).reduce((max, option) => { return Math.max( max, this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))) ); }, 0); } /** * Get the longest global option term length. * * @param {Command} cmd * @param {Help} helper * @returns {number} */ longestGlobalOptionTermLength(cmd, helper) { return helper.visibleGlobalOptions(cmd).reduce((max, option) => { return Math.max( max, this.displayWidth(helper.styleOptionTerm(helper.optionTerm(option))) ); }, 0); } /** * Get the longest argument term length. * * @param {Command} cmd * @param {Help} helper * @returns {number} */ longestArgumentTermLength(cmd, helper) { return helper.visibleArguments(cmd).reduce((max, argument) => { return Math.max( max, this.displayWidth( helper.styleArgumentTerm(helper.argumentTerm(argument)) ) ); }, 0); } /** * Get the command usage to be displayed at the top of the built-in help. * * @param {Command} cmd * @returns {string} */ commandUsage(cmd) { let cmdName = cmd._name; if (cmd._aliases[0]) { cmdName = cmdName + "|" + cmd._aliases[0]; } let ancestorCmdNames = ""; for (let ancestorCmd = cmd.parent; ancestorCmd; ancestorCmd = ancestorCmd.parent) { ancestorCmdNames = ancestorCmd.name() + " " + ancestorCmdNames; } return ancestorCmdNames + cmdName + " " + cmd.usage(); } /** * Get the description for the command. * * @param {Command} cmd * @returns {string} */ commandDescription(cmd) { return cmd.description(); } /** * Get the subcommand summary to show in the list of subcommands. * (Fallback to description for backwards compatibility.) * * @param {Command} cmd * @returns {string} */ subcommandDescription(cmd) { return cmd.summary() || cmd.description(); } /** * Get the option description to show in the list of options. * * @param {Option} option * @return {string} */ optionDescription(option) { const extraInfo = []; if (option.argChoices) { extraInfo.push( // use stringify to match the display of the default value `choices: ${option.argChoices.map((choice) => JSON.stringify(choice)).join(", ")}` ); } if (option.defaultValue !== void 0) { const showDefault = option.required || option.optional || option.isBoolean() && typeof option.defaultValue === "boolean"; if (showDefault) { extraInfo.push( `default: ${option.defaultValueDescription || JSON.stringify(option.defaultValue)}` ); } } if (option.presetArg !== void 0 && option.optional) { extraInfo.push(`preset: ${JSON.stringify(option.presetArg)}`); } if (option.envVar !== void 0) { extraInfo.push(`env: ${option.envVar}`); } if (extraInfo.length > 0) { const extraDescription = `(${extraInfo.join(", ")})`; if (option.description) { return `${option.description} ${extraDescription}`; } return extraDescription; } return option.description; } /** * Get the argument description to show in the list of arguments. * * @param {Argument} argument * @return {string} */ argumentDescription(argument) { const extraInfo = []; if (argument.argChoices) { extraInfo.push( // use stringify to match the display of the default value `choices: ${argument.argChoices.map((choice) => JSON.stringify(choice)).join(", ")}` ); } if (argument.defaultValue !== void 0) { extraInfo.push( `default: ${argument.defaultValueDescription || JSON.stringify(argument.defaultValue)}` ); } if (extraInfo.length > 0) { const extraDescription = `(${extraInfo.join(", ")})`; if (argument.description) { return `${argument.description} ${extraDescription}`; } return extraDescription; } return argument.description; } /** * Format a list of items, given a heading and an array of formatted items. * * @param {string} heading * @param {string[]} items * @param {Help} helper * @returns string[] */ formatItemList(heading, items, helper) { if (items.length === 0) return []; return [helper.styleTitle(heading), ...items, ""]; } /** * Group items by their help group heading. * * @param {Command[] | Option[]} unsortedItems * @param {Command[] | Option[]} visibleItems * @param {Function} getGroup * @returns {Map} */ groupItems(unsortedItems, visibleItems, getGroup) { const result = /* @__PURE__ */ new Map(); unsortedItems.forEach((item) => { const group = getGroup(item); if (!result.has(group)) result.set(group, []); }); visibleItems.forEach((item) => { const group = getGroup(item); if (!result.has(group)) { result.set(group, []); } result.get(group).push(item); }); return result; } /** * Generate the built-in help text. * * @param {Command} cmd * @param {Help} helper * @returns {string} */ formatHelp(cmd, helper) { const termWidth = helper.padWidth(cmd, helper); const helpWidth = helper.helpWidth ?? 80; function callFormatItem(term, description) { return helper.formatItem(term, termWidth, description, helper); } let output = [ `${helper.styleTitle("Usage:")} ${helper.styleUsage(helper.commandUsage(cmd))}`, "" ]; const commandDescription = helper.commandDescription(cmd); if (commandDescription.length > 0) { output = output.concat([ helper.boxWrap( helper.styleCommandDescription(commandDescription), helpWidth ), "" ]); } const argumentList = helper.visibleArguments(cmd).map((argument) => { return callFormatItem( helper.styleArgumentTerm(helper.argumentTerm(argument)), helper.styleArgumentDescription(helper.argumentDescription(argument)) ); }); output = output.concat( this.formatItemList("Arguments:", argumentList, helper) ); const optionGroups = this.groupItems( cmd.options, helper.visibleOptions(cmd), (option) => option.helpGroupHeading ?? "Options:" ); optionGroups.forEach((options, group) => { const optionList = options.map((option) => { return callFormatItem( helper.styleOptionTerm(helper.optionTerm(option)), helper.styleOptionDescription(helper.optionDescription(option)) ); }); output = output.concat(this.formatItemList(group, optionList, helper)); }); if (helper.showGlobalOptions) { const globalOptionList = helper.visibleGlobalOptions(cmd).map((option) => { return callFormatItem( helper.styleOptionTerm(helper.optionTerm(option)), helper.styleOptionDescription(helper.optionDescription(option)) ); }); output = output.concat( this.formatItemList("Global Options:", globalOptionList, helper) ); } const commandGroups = this.groupItems( cmd.commands, helper.visibleCommands(cmd), (sub) => sub.helpGroup() || "Commands:" ); commandGroups.forEach((commands, group) => { const commandList = commands.map((sub) => { return callFormatItem( helper.styleSubcommandTerm(helper.subcommandTerm(sub)), helper.styleSubcommandDescription(helper.subcommandDescription(sub)) ); }); output = output.concat(this.formatItemList(group, commandList, helper)); }); return output.join("\n"); } /** * Return display width of string, ignoring ANSI escape sequences. Used in padding and wrapping calculations. * * @param {string} str * @returns {number} */ displayWidth(str) { return stripColor(str).length; } /** * Style the title for displaying in the help. Called with 'Usage:', 'Options:', etc. * * @param {string} str * @returns {string} */ styleTitle(str) { return str; } styleUsage(str) { return str.split(" ").map((word) => { if (word === "[options]") return this.styleOptionText(word); if (word === "[command]") return this.styleSubcommandText(word); if (word[0] === "[" || word[0] === "<") return this.styleArgumentText(word); return this.styleCommandText(word); }).join(" "); } styleCommandDescription(str) { return this.styleDescriptionText(str); } styleOptionDescription(str) { return this.styleDescriptionText(str); } styleSubcommandDescription(str) { return this.styleDescriptionText(str); } styleArgumentDescription(str) { return this.styleDescriptionText(str); } styleDescriptionText(str) { return str; } styleOptionTerm(str) { return this.styleOptionText(str); } styleSubcommandTerm(str) { return str.split(" ").map((word) => { if (word === "[options]") return this.styleOptionText(word); if (word[0] === "[" || word[0] === "<") return this.styleArgumentText(word); return this.styleSubcommandText(word); }).join(" "); } styleArgumentTerm(str) { return this.styleArgumentText(str); } styleOptionText(str) { return str; } styleArgumentText(str) { return str; } styleSubcommandText(str) { return str; } styleCommandText(str) { return str; } /** * Calculate the pad width from the maximum term length. * * @param {Command} cmd * @param {Help} helper * @returns {number} */ padWidth(cmd, helper) { return Math.max( helper.longestOptionTermLength(cmd, helper), helper.longestGlobalOptionTermLength(cmd, helper), helper.longestSubcommandTermLength(cmd, helper), helper.longestArgumentTermLength(cmd, helper) ); } /** * Detect manually wrapped and indented strings by checking for line break followed by whitespace. * * @param {string} str * @returns {boolean} */ preformatted(str) { return /\n[^\S\r\n]/.test(str); } /** * Format the "item", which consists of a term and description. Pad the term and wrap the description, indenting the following lines. * * So "TTT", 5, "DDD DDDD DD DDD" might be formatted for this.helpWidth=17 like so: * TTT DDD DDDD * DD DDD * * @param {string} term * @param {number} termWidth * @param {string} description * @param {Help} helper * @returns {string} */ formatItem(term, termWidth, description, helper) { const itemIndent = 2; const itemIndentStr = " ".repeat(itemIndent); if (!description) return itemIndentStr + term; const paddedTerm = term.padEnd( termWidth + term.length - helper.displayWidth(term) ); const spacerWidth = 2; const helpWidth = this.helpWidth ?? 80; const remainingWidth = helpWidth - termWidth - spacerWidth - itemIndent; let formattedDescription; if (remainingWidth < this.minWidthToWrap || helper.preformatted(description)) { formattedDescription = description; } else { const wrappedDescription = helper.boxWrap(description, remainingWidth); formattedDescription = wrappedDescription.replace( /\n/g, "\n" + " ".repeat(termWidth + spacerWidth) ); } return itemIndentStr + paddedTerm + " ".repeat(spacerWidth) + formattedDescription.replace(/\n/g, ` ${itemIndentStr}`); } /** * Wrap a string at whitespace, preserving existing line breaks. * Wrapping is skipped if the width is less than `minWidthToWrap`. * * @param {string} str * @param {number} width * @returns {string} */ boxWrap(str, width) { if (width < this.minWidthToWrap) return str; const rawLines = str.split(/\r\n|\n/); const chunkPattern = /[\s]*[^\s]+/g; const wrappedLines = []; rawLines.forEach((line) => { const chunks = line.match(chunkPattern); if (chunks === null) { wrappedLines.push(""); return; } let sumChunks = [chunks.shift()]; let sumWidth = this.displayWidth(sumChunks[0]); chunks.forEach((chunk) => { const visibleWidth = this.displayWidth(chunk); if (sumWidth + visibleWidth <= width) { sumChunks.push(chunk); sumWidth += visibleWidth; return; } wrappedLines.push(sumChunks.join("")); const nextChunk = chunk.trimStart(); sumChunks = [nextChunk]; sumWidth = this.displayWidth(nextChunk); }); wrappedLines.push(sumChunks.join("")); }); return wrappedLines.join("\n"); } }; function stripColor(str) { const sgrPattern = /\x1b\[\d*(;\d*)*m/g; return str.replace(sgrPattern, ""); } exports2.Help = Help; exports2.stripColor = stripColor; } }); // node_modules/commander/lib/option.js var require_option = __commonJS({ "node_modules/commander/lib/option.js"(exports2) { var { InvalidArgumentError } = require_error(); var Option = class { /** * Initialize a new `Option` with the given `flags` and `description`. * * @param {string} flags * @param {string} [description] */ constructor(flags2, description) { this.flags = flags2; this.description = description || ""; this.required = flags2.includes("<"); this.optional = flags2.includes("["); this.variadic = /\w\.\.\.[>\]]$/.test(flags2); this.mandatory = false; const optionFlags = splitOptionFlags(flags2); this.short = optionFlags.shortFlag; this.long = optionFlags.longFlag; this.negate = false; if (this.long) { this.negate = this.long.startsWith("--no-"); } this.defaultValue = void 0; this.defaultValueDescription = void 0; this.presetArg = void 0; this.envVar = void 0; this.parseArg = void 0; this.hidden = false; this.argChoices = void 0; this.conflictsWith = []; this.implied = void 0; this.helpGroupHeading = void 0; } /** * Set the default value, and optionally supply the description to be displayed in the help. * * @param {*} value * @param {string} [description] * @return {Option} */ default(value, description) { this.defaultValue = value; this.defaultValueDescription = description; return this; } /** * Preset to use when option used without option-argument, especially optional but also boolean and negated. * The custom processing (parseArg) is called. * * @example * new Option('--color').default('GREYSCALE').preset('RGB'); * new Option('--donate [amount]').preset('20').argParser(parseFloat); * * @param {*} arg * @return {Option} */ preset(arg) { this.presetArg = arg; return this; } /** * Add option name(s) that conflict with this option. * An error will be displayed if conflicting options are found during parsing. * * @example * new Option('--rgb').conflicts('cmyk'); * new Option('--js').conflicts(['ts', 'jsx']); * * @param {(string | string[])} names * @return {Option} */ conflicts(names) { this.conflictsWith = this.conflictsWith.concat(names); return this; } /** * Specify implied option values for when this option is set and the implied options are not. * * The custom processing (parseArg) is not called on the implied values. * * @example * program * .addOption(new Option('--log', 'write logging information to file')) * .addOption(new Option('--trace', 'log extra details').implies({ log: 'trace.txt' })); * * @param {object} impliedOptionValues * @return {Option} */ implies(impliedOptionValues) { let newImplied = impliedOptionValues; if (typeof impliedOptionValues === "string") { newImplied = { [impliedOptionValues]: true }; } this.implied = Object.assign(this.implied || {}, newImplied); return this; } /** * Set environment variable to check for option value. * * An environment variable is only used if when processed the current option value is * undefined, or the source of the current value is 'default' or 'config' or 'env'. * * @param {string} name * @return {Option} */ env(name2) { this.envVar = name2; return this; } /** * Set the custom handler for processing CLI option arguments into option values. * * @param {Function} [fn] * @return {Option} */ argParser(fn) { this.parseArg = fn; return this; } /** * Whether the option is mandatory and must have a value after parsing. * * @param {boolean} [mandatory=true] * @return {Option} */ makeOptionMandatory(mandatory = true) { this.mandatory = !!mandatory; return this; } /** * Hide option in help. * * @param {boolean} [hide=true] * @return {Option} */ hideHelp(hide = true) { this.hidden = !!hide; return this; } /** * @package */ _concatValue(value, previous) { if (previous === this.defaultValue || !Array.isArray(previous)) { return [value]; } return previous.concat(value); } /** * Only allow option value to be one of choices. * * @param {string[]} values * @return {Option} */ choices(values) { this.argChoices = values.slice(); this.parseArg = (arg, previous) => { if (!this.argChoices.includes(arg)) { throw new InvalidArgumentError( `Allowed choices are ${this.argChoices.join(", ")}.` ); } if (this.variadic) { return this._concatValue(arg, previous); } return arg; }; return this; } /** * Return option name. * * @return {string} */ name() { if (this.long) { return this.long.replace(/^--/, ""); } return this.short.replace(/^-/, ""); } /** * Return option name, in a camelcase format that can be used * as an object attribute key. * * @return {string} */ attributeName() { if (this.negate) { return camelcase(this.name().replace(/^no-/, "")); } return camelcase(this.name()); } /** * Set the help group heading. * * @param {string} heading * @return {Option} */ helpGroup(heading) { this.helpGroupHeading = heading; return this; } /** * Check if `arg` matches the short or long flag. * * @param {string} arg * @return {boolean} * @package */ is(arg) { return this.short === arg || this.long === arg; } /** * Return whether a boolean option. * * Options are one of boolean, negated, required argument, or optional argument. * * @return {boolean} * @package */ isBoolean() { return !this.required && !this.optional && !this.negate; } }; var DualOptions = class { /** * @param {Option[]} options */ constructor(options) { this.positiveOptions = /* @__PURE__ */ new Map(); this.negativeOptions = /* @__PURE__ */ new Map(); this.dualOptions = /* @__PURE__ */ new Set(); options.forEach((option) => { if (option.negate) { this.negativeOptions.set(option.attributeName(), option); } else { this.positiveOptions.set(option.attributeName(), option); } }); this.negativeOptions.forEach((value, key) => { if (this.positiveOptions.has(key)) { this.dualOptions.add(key); } }); } /** * Did the value come from the option, and not from possible matching dual option? * * @param {*} value * @param {Option} option * @returns {boolean} */ valueFromOption(value, option) { const optionKey = option.attributeName(); if (!this.dualOptions.has(optionKey)) return true; const preset = this.negativeOptions.get(optionKey).presetArg; const negativeValue = preset !== void 0 ? preset : false; return option.negate === (negativeValue === value); } }; function camelcase(str) { return str.split("-").reduce((str2, word) => { return str2 + word[0].toUpperCase() + word.slice(1); }); } function splitOptionFlags(flags2) { let shortFlag; let longFlag; const shortFlagExp = /^-[^-]$/; const longFlagExp = /^--[^-]/; const flagParts = flags2.split(/[ |,]+/).concat("guard"); if (shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift(); if (longFlagExp.test(flagParts[0])) longFlag = flagParts.shift(); if (!shortFlag && shortFlagExp.test(flagParts[0])) shortFlag = flagParts.shift(); if (!shortFlag && longFlagExp.test(flagParts[0])) { shortFlag = longFlag; longFlag = flagParts.shift(); } if (flagParts[0].startsWith("-")) { const unsupportedFlag = flagParts[0]; const baseError = `option creation failed due to '${unsupportedFlag}' in option flags '${flags2}'`; if (/^-[^-][^-]/.test(unsupportedFlag)) throw new Error( `${baseError} - a short flag is a single dash and a single character - either use a single dash and a single character (for a short flag) - or use a double dash for a long option (and can have two, like '--ws, --workspace')` ); if (shortFlagExp.test(unsupportedFlag)) throw new Error(`${baseError} - too many short flags`); if (longFlagExp.test(unsupportedFlag)) throw new Error(`${baseError} - too many long flags`); throw new Error(`${baseError} - unrecognised flag format`); } if (shortFlag === void 0 && longFlag === void 0) throw new Error( `option creation failed due to no flags found in '${flags2}'.` ); return { shortFlag, longFlag }; } exports2.Option = Option; exports2.DualOptions = DualOptions; } }); // node_modules/commander/lib/suggestSimilar.js var require_suggestSimilar = __commonJS({ "node_modules/commander/lib/suggestSimilar.js"(exports2) { var maxDistance = 3; function editDistance(a, b) { if (Math.abs(a.length - b.length) > maxDistance) return Math.max(a.length, b.length); const d = []; for (let i2 = 0; i2 <= a.length; i2++) { d[i2] = [i2]; } for (let j = 0; j <= b.length; j++) { d[0][j] = j; } for (let j = 1; j <= b.length; j++) { for (let i2 = 1; i2 <= a.length; i2++) { let cost = 1; if (a[i2 - 1] === b[j - 1]) { cost = 0; } else { cost = 1; } d[i2][j] = Math.min( d[i2 - 1][j] + 1, // deletion d[i2][j - 1] + 1, // insertion d[i2 - 1][j - 1] + cost // substitution ); if (i2 > 1 && j > 1 && a[i2 - 1] === b[j - 2] && a[i2 - 2] === b[j - 1]) { d[i2][j] = Math.min(d[i2][j], d[i2 - 2][j - 2] + 1); } } } return d[a.length][b.length]; } function suggestSimilar(word, candidates) { if (!candidates || candidates.length === 0) return ""; candidates = Array.from(new Set(candidates)); const searchingOptions = word.startsWith("--"); if (searchingOptions) { word = word.slice(2); candidates = candidates.map((candidate) => candidate.slice(2)); } let similar = []; let bestDistance = maxDistance; const minSimilarity = 0.4; candidates.forEach((candidate) => { if (candidate.length <= 1) return; const distance = editDistance(word, candidate); const length = Math.max(word.length, candidate.length); const similarity = (length - distance) / length; if (similarity > minSimilarity) { if (distance < bestDistance) { bestDistance = distance; similar = [candidate]; } else if (distance === bestDistance) { similar.push(candidate); } } }); similar.sort((a, b) => a.localeCompare(b)); if (searchingOptions) { similar = similar.map((candidate) => `--${candidate}`); } if (similar.length > 1) { return ` (Did you mean one of ${similar.join(", ")}?)`; } if (similar.length === 1) { return ` (Did you mean ${similar[0]}?)`; } return ""; } exports2.suggestSimilar = suggestSimilar; } }); // node_modules/commander/lib/command.js var require_command = __commonJS({ "node_modules/commander/lib/command.js"(exports2) { var EventEmitter = require("node:events").EventEmitter; var childProcess = require("node:child_process"); var path5 = require("node:path"); var fs3 = require("node:fs"); var process2 = require("node:process"); var { Argument, humanReadableArgName } = require_argument(); var { CommanderError } = require_error(); var { Help, stripColor } = require_help(); var { Option, DualOptions } = require_option(); var { suggestSimilar } = require_suggestSimilar(); var Command = class _Command extends EventEmitter { /** * Initialize a new `Command`. * * @param {string} [name] */ constructor(name2) { super(); this.commands = []; this.options = []; this.parent = null; this._allowUnknownOption = false; this._allowExcessArguments = false; this.registeredArguments = []; this._args = this.registeredArguments; this.args = []; this.rawArgs = []; this.processedArgs = []; this._scriptPath = null; this._name = name2 || ""; this._optionValues = {}; this._optionValueSources = {}; this._storeOptionsAsProperties = false; this._actionHandler = null; this._executableHandler = false; this._executableFile = null; this._executableDir = null; this._defaultCommandName = null; this._exitCallback = null; this._aliases = []; this._combineFlagAndOptionalValue = true; this._description = ""; this._summary = ""; this._argsDescription = void 0; this._enablePositionalOptions = false; this._passThroughOptions = false; this._lifeCycleHooks = {}; this._showHelpAfterError = false; this._showSuggestionAfterError = true; this._savedState = null; this._outputConfiguration = { writeOut: (str) => process2.stdout.write(str), writeErr: (str) => process2.stderr.write(str), outputError: (str, write) => write(str), getOutHelpWidth: () => process2.stdout.isTTY ? process2.stdout.columns : void 0, getErrHelpWidth: () => process2.stderr.isTTY ? process2.stderr.columns : void 0, getOutHasColors: () => useColor() ?? (process2.stdout.isTTY && process2.stdout.hasColors?.()), getErrHasColors: () => useColor() ?? (process2.stderr.isTTY && process2.stderr.hasColors?.()), stripColor: (str) => stripColor(str) }; this._hidden = false; this._helpOption = void 0; this._addImplicitHelpCommand = void 0; this._helpCommand = void 0; this._helpConfiguration = {}; this._helpGroupHeading = void 0; this._defaultCommandGroup = void 0; this._defaultOptionGroup = void 0; } /** * Copy settings that are useful to have in common across root command and subcommands. * * (Used internally when adding a command using `.command()` so subcommands inherit parent settings.) * * @param {Command} sourceCommand * @return {Command} `this` command for chaining */ copyInheritedSettings(sourceCommand) { this._outputConfiguration = sourceCommand._outputConfiguration; this._helpOption = sourceCommand._helpOption; this._helpCommand = sourceCommand._helpCommand; this._helpConfiguration = sourceCommand._helpConfiguration; this._exitCallback = sourceCommand._exitCallback; this._storeOptionsAsProperties = sourceCommand._storeOptionsAsProperties; this._combineFlagAndOptionalValue = sourceCommand._combineFlagAndOptionalValue; this._allowExcessArguments = sourceCommand._allowExcessArguments; this._enablePositionalOptions = sourceCommand._enablePositionalOptions; this._showHelpAfterError = sourceCommand._showHelpAfterError; this._showSuggestionAfterError = sourceCommand._showSuggestionAfterError; return this; } /** * @returns {Command[]} * @private */ _getCommandAndAncestors() { const result = []; for (let command = this; command; command = command.parent) { result.push(command); } return result; } /** * Define a command. * * There are two styles of command: pay attention to where to put the description. * * @example * // Command implemented using action handler (description is supplied separately to `.command`) * program * .command('clone [destination]') * .description('clone a repository into a newly created directory') * .action((source, destination) => { * console.log('clone command called'); * }); * * // Command implemented using separate executable file (description is second parameter to `.command`) * program * .command('start ', 'start named service') * .command('stop [service]', 'stop named service, or all if no name supplied'); * * @param {string} nameAndArgs - command name and arguments, args are `` or `[optional]` and last may also be `variadic...` * @param {(object | string)} [actionOptsOrExecDesc] - configuration options (for action), or description (for executable) * @param {object} [execOpts] - configuration options (for executable) * @return {Command} returns new command for action handler, or `this` for executable command */ command(nameAndArgs, actionOptsOrExecDesc, execOpts) { let desc = actionOptsOrExecDesc; let opts = execOpts; if (typeof desc === "object" && desc !== null) { opts = desc; desc = null; } opts = opts || {}; const [, name2, args2] = nameAndArgs.match(/([^ ]+) *(.*)/); const cmd = this.createCommand(name2); if (desc) { cmd.description(desc); cmd._executableHandler = true; } if (opts.isDefault) this._defaultCommandName = cmd._name; cmd._hidden = !!(opts.noHelp || opts.hidden); cmd._executableFile = opts.executableFile || null; if (args2) cmd.arguments(args2); this._registerCommand(cmd); cmd.parent = this; cmd.copyInheritedSettings(this); if (desc) return this; return cmd; } /** * Factory routine to create a new unattached command. * * See .command() for creating an attached subcommand, which uses this routine to * create the command. You can override createCommand to customise subcommands. * * @param {string} [name] * @return {Command} new command */ createCommand(name2) { return new _Command(name2); } /** * You can customise the help with a subclass of Help by overriding createHelp, * or by overriding Help properties using configureHelp(). * * @return {Help} */ createHelp() { return Object.assign(new Help(), this.configureHelp()); } /** * You can customise the help by overriding Help properties using configureHelp(), * or with a subclass of Help by overriding createHelp(). * * @param {object} [configuration] - configuration options * @return {(Command | object)} `this` command for chaining, or stored configuration */ configureHelp(configuration) { if (configuration === void 0) return this._helpConfiguration; this._helpConfiguration = configuration; return this; } /** * The default output goes to stdout and stderr. You can customise this for special * applications. You can also customise the display of errors by overriding outputError. * * The configuration properties are all functions: * * // change how output being written, defaults to stdout and stderr * writeOut(str) * writeErr(str) * // change how output being written for errors, defaults to writeErr * outputError(str, write) // used for displaying errors and not used for displaying help * // specify width for wrapping help * getOutHelpWidth() * getErrHelpWidth() * // color support, currently only used with Help * getOutHasColors() * getErrHasColors() * stripColor() // used to remove ANSI escape codes if output does not have colors * * @param {object} [configuration] - configuration options * @return {(Command | object)} `this` command for chaining, or stored configuration */ configureOutput(configuration) { if (configuration === void 0) return this._outputConfiguration; this._outputConfiguration = Object.assign( {}, this._outputConfiguration, configuration ); return this; } /** * Display the help or a custom message after an error occurs. * * @param {(boolean|string)} [displayHelp] * @return {Command} `this` command for chaining */ showHelpAfterError(displayHelp = true) { if (typeof displayHelp !== "string") displayHelp = !!displayHelp; this._showHelpAfterError = displayHelp; return this; } /** * Display suggestion of similar commands for unknown commands, or options for unknown options. * * @param {boolean} [displaySuggestion] * @return {Command} `this` command for chaining */ showSuggestionAfterError(displaySuggestion = true) { this._showSuggestionAfterError = !!displaySuggestion; return this; } /** * Add a prepared subcommand. * * See .command() for creating an attached subcommand which inherits settings from its parent. * * @param {Command} cmd - new subcommand * @param {object} [opts] - configuration options * @return {Command} `this` command for chaining */ addCommand(cmd, opts) { if (!cmd._name) { throw new Error(`Command passed to .addCommand() must have a name - specify the name in Command constructor or using .name()`); } opts = opts || {}; if (opts.isDefault) this._defaultCommandName = cmd._name; if (opts.noHelp || opts.hidden) cmd._hidden = true; this._registerCommand(cmd); cmd.parent = this; cmd._checkForBrokenPassThrough(); return this; } /** * Factory routine to create a new unattached argument. * * See .argument() for creating an attached argument, which uses this routine to * create the argument. You can override createArgument to return a custom argument. * * @param {string} name * @param {string} [description] * @return {Argument} new argument */ createArgument(name2, description) { return new Argument(name2, description); } /** * Define argument syntax for command. * * The default is that the argument is required, and you can explicitly * indicate this with <> around the name. Put [] around the name for an optional argument. * * @example * program.argument(''); * program.argument('[output-file]'); * * @param {string} name * @param {string} [description] * @param {(Function|*)} [parseArg] - custom argument processing function or default value * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ argument(name2, description, parseArg, defaultValue) { const argument = this.createArgument(name2, description); if (typeof parseArg === "function") { argument.default(defaultValue).argParser(parseArg); } else { argument.default(parseArg); } this.addArgument(argument); return this; } /** * Define argument syntax for command, adding multiple at once (without descriptions). * * See also .argument(). * * @example * program.arguments(' [env]'); * * @param {string} names * @return {Command} `this` command for chaining */ arguments(names) { names.trim().split(/ +/).forEach((detail) => { this.argument(detail); }); return this; } /** * Define argument syntax for command, adding a prepared argument. * * @param {Argument} argument * @return {Command} `this` command for chaining */ addArgument(argument) { const previousArgument = this.registeredArguments.slice(-1)[0]; if (previousArgument && previousArgument.variadic) { throw new Error( `only the last argument can be variadic '${previousArgument.name()}'` ); } if (argument.required && argument.defaultValue !== void 0 && argument.parseArg === void 0) { throw new Error( `a default value for a required argument is never used: '${argument.name()}'` ); } this.registeredArguments.push(argument); return this; } /** * Customise or override default help command. By default a help command is automatically added if your command has subcommands. * * @example * program.helpCommand('help [cmd]'); * program.helpCommand('help [cmd]', 'show help'); * program.helpCommand(false); // suppress default help command * program.helpCommand(true); // add help command even if no subcommands * * @param {string|boolean} enableOrNameAndArgs - enable with custom name and/or arguments, or boolean to override whether added * @param {string} [description] - custom description * @return {Command} `this` command for chaining */ helpCommand(enableOrNameAndArgs, description) { if (typeof enableOrNameAndArgs === "boolean") { this._addImplicitHelpCommand = enableOrNameAndArgs; if (enableOrNameAndArgs && this._defaultCommandGroup) { this._initCommandGroup(this._getHelpCommand()); } return this; } const nameAndArgs = enableOrNameAndArgs ?? "help [command]"; const [, helpName, helpArgs] = nameAndArgs.match(/([^ ]+) *(.*)/); const helpDescription = description ?? "display help for command"; const helpCommand = this.createCommand(helpName); helpCommand.helpOption(false); if (helpArgs) helpCommand.arguments(helpArgs); if (helpDescription) helpCommand.description(helpDescription); this._addImplicitHelpCommand = true; this._helpCommand = helpCommand; if (enableOrNameAndArgs || description) this._initCommandGroup(helpCommand); return this; } /** * Add prepared custom help command. * * @param {(Command|string|boolean)} helpCommand - custom help command, or deprecated enableOrNameAndArgs as for `.helpCommand()` * @param {string} [deprecatedDescription] - deprecated custom description used with custom name only * @return {Command} `this` command for chaining */ addHelpCommand(helpCommand, deprecatedDescription) { if (typeof helpCommand !== "object") { this.helpCommand(helpCommand, deprecatedDescription); return this; } this._addImplicitHelpCommand = true; this._helpCommand = helpCommand; this._initCommandGroup(helpCommand); return this; } /** * Lazy create help command. * * @return {(Command|null)} * @package */ _getHelpCommand() { const hasImplicitHelpCommand = this._addImplicitHelpCommand ?? (this.commands.length && !this._actionHandler && !this._findCommand("help")); if (hasImplicitHelpCommand) { if (this._helpCommand === void 0) { this.helpCommand(void 0, void 0); } return this._helpCommand; } return null; } /** * Add hook for life cycle event. * * @param {string} event * @param {Function} listener * @return {Command} `this` command for chaining */ hook(event, listener) { const allowedValues = ["preSubcommand", "preAction", "postAction"]; if (!allowedValues.includes(event)) { throw new Error(`Unexpected value for event passed to hook : '${event}'. Expecting one of '${allowedValues.join("', '")}'`); } if (this._lifeCycleHooks[event]) { this._lifeCycleHooks[event].push(listener); } else { this._lifeCycleHooks[event] = [listener]; } return this; } /** * Register callback to use as replacement for calling process.exit. * * @param {Function} [fn] optional callback which will be passed a CommanderError, defaults to throwing * @return {Command} `this` command for chaining */ exitOverride(fn) { if (fn) { this._exitCallback = fn; } else { this._exitCallback = (err2) => { if (err2.code !== "commander.executeSubCommandAsync") { throw err2; } else { } }; } return this; } /** * Call process.exit, and _exitCallback if defined. * * @param {number} exitCode exit code for using with process.exit * @param {string} code an id string representing the error * @param {string} message human-readable description of the error * @return never * @private */ _exit(exitCode, code, message) { if (this._exitCallback) { this._exitCallback(new CommanderError(exitCode, code, message)); } process2.exit(exitCode); } /** * Register callback `fn` for the command. * * @example * program * .command('serve') * .description('start service') * .action(function() { * // do work here * }); * * @param {Function} fn * @return {Command} `this` command for chaining */ action(fn) { const listener = (args2) => { const expectedArgsCount = this.registeredArguments.length; const actionArgs = args2.slice(0, expectedArgsCount); if (this._storeOptionsAsProperties) { actionArgs[expectedArgsCount] = this; } else { actionArgs[expectedArgsCount] = this.opts(); } actionArgs.push(this); return fn.apply(this, actionArgs); }; this._actionHandler = listener; return this; } /** * Factory routine to create a new unattached option. * * See .option() for creating an attached option, which uses this routine to * create the option. You can override createOption to return a custom option. * * @param {string} flags * @param {string} [description] * @return {Option} new option */ createOption(flags2, description) { return new Option(flags2, description); } /** * Wrap parseArgs to catch 'commander.invalidArgument'. * * @param {(Option | Argument)} target * @param {string} value * @param {*} previous * @param {string} invalidArgumentMessage * @private */ _callParseArg(target, value, previous, invalidArgumentMessage) { try { return target.parseArg(value, previous); } catch (err2) { if (err2.code === "commander.invalidArgument") { const message = `${invalidArgumentMessage} ${err2.message}`; this.error(message, { exitCode: err2.exitCode, code: err2.code }); } throw err2; } } /** * Check for option flag conflicts. * Register option if no conflicts found, or throw on conflict. * * @param {Option} option * @private */ _registerOption(option) { const matchingOption = option.short && this._findOption(option.short) || option.long && this._findOption(option.long); if (matchingOption) { const matchingFlag = option.long && this._findOption(option.long) ? option.long : option.short; throw new Error(`Cannot add option '${option.flags}'${this._name && ` to command '${this._name}'`} due to conflicting flag '${matchingFlag}' - already used by option '${matchingOption.flags}'`); } this._initOptionGroup(option); this.options.push(option); } /** * Check for command name and alias conflicts with existing commands. * Register command if no conflicts found, or throw on conflict. * * @param {Command} command * @private */ _registerCommand(command) { const knownBy = (cmd) => { return [cmd.name()].concat(cmd.aliases()); }; const alreadyUsed = knownBy(command).find( (name2) => this._findCommand(name2) ); if (alreadyUsed) { const existingCmd = knownBy(this._findCommand(alreadyUsed)).join("|"); const newCmd = knownBy(command).join("|"); throw new Error( `cannot add command '${newCmd}' as already have command '${existingCmd}'` ); } this._initCommandGroup(command); this.commands.push(command); } /** * Add an option. * * @param {Option} option * @return {Command} `this` command for chaining */ addOption(option) { this._registerOption(option); const oname = option.name(); const name2 = option.attributeName(); if (option.negate) { const positiveLongFlag = option.long.replace(/^--no-/, "--"); if (!this._findOption(positiveLongFlag)) { this.setOptionValueWithSource( name2, option.defaultValue === void 0 ? true : option.defaultValue, "default" ); } } else if (option.defaultValue !== void 0) { this.setOptionValueWithSource(name2, option.defaultValue, "default"); } const handleOptionValue = (val, invalidValueMessage, valueSource) => { if (val == null && option.presetArg !== void 0) { val = option.presetArg; } const oldValue = this.getOptionValue(name2); if (val !== null && option.parseArg) { val = this._callParseArg(option, val, oldValue, invalidValueMessage); } else if (val !== null && option.variadic) { val = option._concatValue(val, oldValue); } if (val == null) { if (option.negate) { val = false; } else if (option.isBoolean() || option.optional) { val = true; } else { val = ""; } } this.setOptionValueWithSource(name2, val, valueSource); }; this.on("option:" + oname, (val) => { const invalidValueMessage = `error: option '${option.flags}' argument '${val}' is invalid.`; handleOptionValue(val, invalidValueMessage, "cli"); }); if (option.envVar) { this.on("optionEnv:" + oname, (val) => { const invalidValueMessage = `error: option '${option.flags}' value '${val}' from env '${option.envVar}' is invalid.`; handleOptionValue(val, invalidValueMessage, "env"); }); } return this; } /** * Internal implementation shared by .option() and .requiredOption() * * @return {Command} `this` command for chaining * @private */ _optionEx(config, flags2, description, fn, defaultValue) { if (typeof flags2 === "object" && flags2 instanceof Option) { throw new Error( "To add an Option object use addOption() instead of option() or requiredOption()" ); } const option = this.createOption(flags2, description); option.makeOptionMandatory(!!config.mandatory); if (typeof fn === "function") { option.default(defaultValue).argParser(fn); } else if (fn instanceof RegExp) { const regex = fn; fn = (val, def) => { const m = regex.exec(val); return m ? m[0] : def; }; option.default(defaultValue).argParser(fn); } else { option.default(fn); } return this.addOption(option); } /** * Define option with `flags`, `description`, and optional argument parsing function or `defaultValue` or both. * * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. A required * option-argument is indicated by `<>` and an optional option-argument by `[]`. * * See the README for more details, and see also addOption() and requiredOption(). * * @example * program * .option('-p, --pepper', 'add pepper') * .option('--pt, --pizza-type ', 'type of pizza') // required option-argument * .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default * .option('-t, --tip ', 'add tip to purchase cost', parseFloat) // custom parse function * * @param {string} flags * @param {string} [description] * @param {(Function|*)} [parseArg] - custom option processing function or default value * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ option(flags2, description, parseArg, defaultValue) { return this._optionEx({}, flags2, description, parseArg, defaultValue); } /** * Add a required option which must have a value after parsing. This usually means * the option must be specified on the command line. (Otherwise the same as .option().) * * The `flags` string contains the short and/or long flags, separated by comma, a pipe or space. * * @param {string} flags * @param {string} [description] * @param {(Function|*)} [parseArg] - custom option processing function or default value * @param {*} [defaultValue] * @return {Command} `this` command for chaining */ requiredOption(flags2, description, parseArg, defaultValue) { return this._optionEx( { mandatory: true }, flags2, description, parseArg, defaultValue ); } /** * Alter parsing of short flags with optional values. * * @example * // for `.option('-f,--flag [value]'): * program.combineFlagAndOptionalValue(true); // `-f80` is treated like `--flag=80`, this is the default behaviour * program.combineFlagAndOptionalValue(false) // `-fb` is treated like `-f -b` * * @param {boolean} [combine] - if `true` or omitted, an optional value can be specified directly after the flag. * @return {Command} `this` command for chaining */ combineFlagAndOptionalValue(combine = true) { this._combineFlagAndOptionalValue = !!combine; return this; } /** * Allow unknown options on the command line. * * @param {boolean} [allowUnknown] - if `true` or omitted, no error will be thrown for unknown options. * @return {Command} `this` command for chaining */ allowUnknownOption(allowUnknown = true) { this._allowUnknownOption = !!allowUnknown; return this; } /** * Allow excess command-arguments on the command line. Pass false to make excess arguments an error. * * @param {boolean} [allowExcess] - if `true` or omitted, no error will be thrown for excess arguments. * @return {Command} `this` command for chaining */ allowExcessArguments(allowExcess = true) { this._allowExcessArguments = !!allowExcess; return this; } /** * Enable positional options. Positional means global options are specified before subcommands which lets * subcommands reuse the same option names, and also enables subcommands to turn on passThroughOptions. * The default behaviour is non-positional and global options may appear anywhere on the command line. * * @param {boolean} [positional] * @return {Command} `this` command for chaining */ enablePositionalOptions(positional = true) { this._enablePositionalOptions = !!positional; return this; } /** * Pass through options that come after command-arguments rather than treat them as command-options, * so actual command-options come before command-arguments. Turning this on for a subcommand requires * positional options to have been enabled on the program (parent commands). * The default behaviour is non-positional and options may appear before or after command-arguments. * * @param {boolean} [passThrough] for unknown options. * @return {Command} `this` command for chaining */ passThroughOptions(passThrough = true) { this._passThroughOptions = !!passThrough; this._checkForBrokenPassThrough(); return this; } /** * @private */ _checkForBrokenPassThrough() { if (this.parent && this._passThroughOptions && !this.parent._enablePositionalOptions) { throw new Error( `passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)` ); } } /** * Whether to store option values as properties on command object, * or store separately (specify false). In both cases the option values can be accessed using .opts(). * * @param {boolean} [storeAsProperties=true] * @return {Command} `this` command for chaining */ storeOptionsAsProperties(storeAsProperties = true) { if (this.options.length) { throw new Error("call .storeOptionsAsProperties() before adding options"); } if (Object.keys(this._optionValues).length) { throw new Error( "call .storeOptionsAsProperties() before setting option values" ); } this._storeOptionsAsProperties = !!storeAsProperties; return this; } /** * Retrieve option value. * * @param {string} key * @return {object} value */ getOptionValue(key) { if (this._storeOptionsAsProperties) { return this[key]; } return this._optionValues[key]; } /** * Store option value. * * @param {string} key * @param {object} value * @return {Command} `this` command for chaining */ setOptionValue(key, value) { return this.setOptionValueWithSource(key, value, void 0); } /** * Store option value and where the value came from. * * @param {string} key * @param {object} value * @param {string} source - expected values are default/config/env/cli/implied * @return {Command} `this` command for chaining */ setOptionValueWithSource(key, value, source) { if (this._storeOptionsAsProperties) { this[key] = value; } else { this._optionValues[key] = value; } this._optionValueSources[key] = source; return this; } /** * Get source of option value. * Expected values are default | config | env | cli | implied * * @param {string} key * @return {string} */ getOptionValueSource(key) { return this._optionValueSources[key]; } /** * Get source of option value. See also .optsWithGlobals(). * Expected values are default | config | env | cli | implied * * @param {string} key * @return {string} */ getOptionValueSourceWithGlobals(key) { let source; this._getCommandAndAncestors().forEach((cmd) => { if (cmd.getOptionValueSource(key) !== void 0) { source = cmd.getOptionValueSource(key); } }); return source; } /** * Get user arguments from implied or explicit arguments. * Side-effects: set _scriptPath if args included script. Used for default program name, and subcommand searches. * * @private */ _prepareUserArgs(argv, parseOptions) { if (argv !== void 0 && !Array.isArray(argv)) { throw new Error("first parameter to parse must be array or undefined"); } parseOptions = parseOptions || {}; if (argv === void 0 && parseOptions.from === void 0) { if (process2.versions?.electron) { parseOptions.from = "electron"; } const execArgv = process2.execArgv ?? []; if (execArgv.includes("-e") || execArgv.includes("--eval") || execArgv.includes("-p") || execArgv.includes("--print")) { parseOptions.from = "eval"; } } if (argv === void 0) { argv = process2.argv; } this.rawArgs = argv.slice(); let userArgs; switch (parseOptions.from) { case void 0: case "node": this._scriptPath = argv[1]; userArgs = argv.slice(2); break; case "electron": if (process2.defaultApp) { this._scriptPath = argv[1]; userArgs = argv.slice(2); } else { userArgs = argv.slice(1); } break; case "user": userArgs = argv.slice(0); break; case "eval": userArgs = argv.slice(1); break; default: throw new Error( `unexpected parse option { from: '${parseOptions.from}' }` ); } if (!this._name && this._scriptPath) this.nameFromFilename(this._scriptPath); this._name = this._name || "program"; return userArgs; } /** * Parse `argv`, setting options and invoking commands when defined. * * Use parseAsync instead of parse if any of your action handlers are async. * * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode! * * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`: * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged * - `'user'`: just user arguments * * @example * program.parse(); // parse process.argv and auto-detect electron and special node flags * program.parse(process.argv); // assume argv[0] is app and argv[1] is script * program.parse(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] * * @param {string[]} [argv] - optional, defaults to process.argv * @param {object} [parseOptions] - optionally specify style of options with from: node/user/electron * @param {string} [parseOptions.from] - where the args are from: 'node', 'user', 'electron' * @return {Command} `this` command for chaining */ parse(argv, parseOptions) { this._prepareForParse(); const userArgs = this._prepareUserArgs(argv, parseOptions); this._parseCommand([], userArgs); return this; } /** * Parse `argv`, setting options and invoking commands when defined. * * Call with no parameters to parse `process.argv`. Detects Electron and special node options like `node --eval`. Easy mode! * * Or call with an array of strings to parse, and optionally where the user arguments start by specifying where the arguments are `from`: * - `'node'`: default, `argv[0]` is the application and `argv[1]` is the script being run, with user arguments after that * - `'electron'`: `argv[0]` is the application and `argv[1]` varies depending on whether the electron application is packaged * - `'user'`: just user arguments * * @example * await program.parseAsync(); // parse process.argv and auto-detect electron and special node flags * await program.parseAsync(process.argv); // assume argv[0] is app and argv[1] is script * await program.parseAsync(my-args, { from: 'user' }); // just user supplied arguments, nothing special about argv[0] * * @param {string[]} [argv] * @param {object} [parseOptions] * @param {string} parseOptions.from - where the args are from: 'node', 'user', 'electron' * @return {Promise} */ async parseAsync(argv, parseOptions) { this._prepareForParse(); const userArgs = this._prepareUserArgs(argv, parseOptions); await this._parseCommand([], userArgs); return this; } _prepareForParse() { if (this._savedState === null) { this.saveStateBeforeParse(); } else { this.restoreStateBeforeParse(); } } /** * Called the first time parse is called to save state and allow a restore before subsequent calls to parse. * Not usually called directly, but available for subclasses to save their custom state. * * This is called in a lazy way. Only commands used in parsing chain will have state saved. */ saveStateBeforeParse() { this._savedState = { // name is stable if supplied by author, but may be unspecified for root command and deduced during parsing _name: this._name, // option values before parse have default values (including false for negated options) // shallow clones _optionValues: { ...this._optionValues }, _optionValueSources: { ...this._optionValueSources } }; } /** * Restore state before parse for calls after the first. * Not usually called directly, but available for subclasses to save their custom state. * * This is called in a lazy way. Only commands used in parsing chain will have state restored. */ restoreStateBeforeParse() { if (this._storeOptionsAsProperties) throw new Error(`Can not call parse again when storeOptionsAsProperties is true. - either make a new Command for each call to parse, or stop storing options as properties`); this._name = this._savedState._name; this._scriptPath = null; this.rawArgs = []; this._optionValues = { ...this._savedState._optionValues }; this._optionValueSources = { ...this._savedState._optionValueSources }; this.args = []; this.processedArgs = []; } /** * Throw if expected executable is missing. Add lots of help for author. * * @param {string} executableFile * @param {string} executableDir * @param {string} subcommandName */ _checkForMissingExecutable(executableFile, executableDir, subcommandName) { if (fs3.existsSync(executableFile)) return; const executableDirMessage = executableDir ? `searched for local subcommand relative to directory '${executableDir}'` : "no directory for search for local subcommand, use .executableDir() to supply a custom directory"; const executableMissing = `'${executableFile}' does not exist - if '${subcommandName}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead - if the default executable name is not suitable, use the executableFile option to supply a custom name or path - ${executableDirMessage}`; throw new Error(executableMissing); } /** * Execute a sub-command executable. * * @private */ _executeSubCommand(subcommand, args2) { args2 = args2.slice(); let launchWithNode = false; const sourceExt = [".js", ".ts", ".tsx", ".mjs", ".cjs"]; function findFile(baseDir, baseName) { const localBin = path5.resolve(baseDir, baseName); if (fs3.existsSync(localBin)) return localBin; if (sourceExt.includes(path5.extname(baseName))) return void 0; const foundExt = sourceExt.find( (ext) => fs3.existsSync(`${localBin}${ext}`) ); if (foundExt) return `${localBin}${foundExt}`; return void 0; } this._checkForMissingMandatoryOptions(); this._checkForConflictingOptions(); let executableFile = subcommand._executableFile || `${this._name}-${subcommand._name}`; let executableDir = this._executableDir || ""; if (this._scriptPath) { let resolvedScriptPath; try { resolvedScriptPath = fs3.realpathSync(this._scriptPath); } catch { resolvedScriptPath = this._scriptPath; } executableDir = path5.resolve( path5.dirname(resolvedScriptPath), executableDir ); } if (executableDir) { let localFile = findFile(executableDir, executableFile); if (!localFile && !subcommand._executableFile && this._scriptPath) { const legacyName = path5.basename( this._scriptPath, path5.extname(this._scriptPath) ); if (legacyName !== this._name) { localFile = findFile( executableDir, `${legacyName}-${subcommand._name}` ); } } executableFile = localFile || executableFile; } launchWithNode = sourceExt.includes(path5.extname(executableFile)); let proc; if (process2.platform !== "win32") { if (launchWithNode) { args2.unshift(executableFile); args2 = incrementNodeInspectorPort(process2.execArgv).concat(args2); proc = childProcess.spawn(process2.argv[0], args2, { stdio: "inherit" }); } else { proc = childProcess.spawn(executableFile, args2, { stdio: "inherit" }); } } else { this._checkForMissingExecutable( executableFile, executableDir, subcommand._name ); args2.unshift(executableFile); args2 = incrementNodeInspectorPort(process2.execArgv).concat(args2); proc = childProcess.spawn(process2.execPath, args2, { stdio: "inherit" }); } if (!proc.killed) { const signals = ["SIGUSR1", "SIGUSR2", "SIGTERM", "SIGINT", "SIGHUP"]; signals.forEach((signal) => { process2.on(signal, () => { if (proc.killed === false && proc.exitCode === null) { proc.kill(signal); } }); }); } const exitCallback = this._exitCallback; proc.on("close", (code) => { code = code ?? 1; if (!exitCallback) { process2.exit(code); } else { exitCallback( new CommanderError( code, "commander.executeSubCommandAsync", "(close)" ) ); } }); proc.on("error", (err2) => { if (err2.code === "ENOENT") { this._checkForMissingExecutable( executableFile, executableDir, subcommand._name ); } else if (err2.code === "EACCES") { throw new Error(`'${executableFile}' not executable`); } if (!exitCallback) { process2.exit(1); } else { const wrappedError = new CommanderError( 1, "commander.executeSubCommandAsync", "(error)" ); wrappedError.nestedError = err2; exitCallback(wrappedError); } }); this.runningCommand = proc; } /** * @private */ _dispatchSubcommand(commandName, operands, unknown) { const subCommand = this._findCommand(commandName); if (!subCommand) this.help({ error: true }); subCommand._prepareForParse(); let promiseChain; promiseChain = this._chainOrCallSubCommandHook( promiseChain, subCommand, "preSubcommand" ); promiseChain = this._chainOrCall(promiseChain, () => { if (subCommand._executableHandler) { this._executeSubCommand(subCommand, operands.concat(unknown)); } else { return subCommand._parseCommand(operands, unknown); } }); return promiseChain; } /** * Invoke help directly if possible, or dispatch if necessary. * e.g. help foo * * @private */ _dispatchHelpCommand(subcommandName) { if (!subcommandName) { this.help(); } const subCommand = this._findCommand(subcommandName); if (subCommand && !subCommand._executableHandler) { subCommand.help(); } return this._dispatchSubcommand( subcommandName, [], [this._getHelpOption()?.long ?? this._getHelpOption()?.short ?? "--help"] ); } /** * Check this.args against expected this.registeredArguments. * * @private */ _checkNumberOfArguments() { this.registeredArguments.forEach((arg, i2) => { if (arg.required && this.args[i2] == null) { this.missingArgument(arg.name()); } }); if (this.registeredArguments.length > 0 && this.registeredArguments[this.registeredArguments.length - 1].variadic) { return; } if (this.args.length > this.registeredArguments.length) { this._excessArguments(this.args); } } /** * Process this.args using this.registeredArguments and save as this.processedArgs! * * @private */ _processArguments() { const myParseArg = (argument, value, previous) => { let parsedValue = value; if (value !== null && argument.parseArg) { const invalidValueMessage = `error: command-argument value '${value}' is invalid for argument '${argument.name()}'.`; parsedValue = this._callParseArg( argument, value, previous, invalidValueMessage ); } return parsedValue; }; this._checkNumberOfArguments(); const processedArgs = []; this.registeredArguments.forEach((declaredArg, index2) => { let value = declaredArg.defaultValue; if (declaredArg.variadic) { if (index2 < this.args.length) { value = this.args.slice(index2); if (declaredArg.parseArg) { value = value.reduce((processed, v) => { return myParseArg(declaredArg, v, processed); }, declaredArg.defaultValue); } } else if (value === void 0) { value = []; } } else if (index2 < this.args.length) { value = this.args[index2]; if (declaredArg.parseArg) { value = myParseArg(declaredArg, value, declaredArg.defaultValue); } } processedArgs[index2] = value; }); this.processedArgs = processedArgs; } /** * Once we have a promise we chain, but call synchronously until then. * * @param {(Promise|undefined)} promise * @param {Function} fn * @return {(Promise|undefined)} * @private */ _chainOrCall(promise, fn) { if (promise && promise.then && typeof promise.then === "function") { return promise.then(() => fn()); } return fn(); } /** * * @param {(Promise|undefined)} promise * @param {string} event * @return {(Promise|undefined)} * @private */ _chainOrCallHooks(promise, event) { let result = promise; const hooks = []; this._getCommandAndAncestors().reverse().filter((cmd) => cmd._lifeCycleHooks[event] !== void 0).forEach((hookedCommand) => { hookedCommand._lifeCycleHooks[event].forEach((callback) => { hooks.push({ hookedCommand, callback }); }); }); if (event === "postAction") { hooks.reverse(); } hooks.forEach((hookDetail) => { result = this._chainOrCall(result, () => { return hookDetail.callback(hookDetail.hookedCommand, this); }); }); return result; } /** * * @param {(Promise|undefined)} promise * @param {Command} subCommand * @param {string} event * @return {(Promise|undefined)} * @private */ _chainOrCallSubCommandHook(promise, subCommand, event) { let result = promise; if (this._lifeCycleHooks[event] !== void 0) { this._lifeCycleHooks[event].forEach((hook) => { result = this._chainOrCall(result, () => { return hook(this, subCommand); }); }); } return result; } /** * Process arguments in context of this command. * Returns action result, in case it is a promise. * * @private */ _parseCommand(operands, unknown) { const parsed = this.parseOptions(unknown); this._parseOptionsEnv(); this._parseOptionsImplied(); operands = operands.concat(parsed.operands); unknown = parsed.unknown; this.args = operands.concat(unknown); if (operands && this._findCommand(operands[0])) { return this._dispatchSubcommand(operands[0], operands.slice(1), unknown); } if (this._getHelpCommand() && operands[0] === this._getHelpCommand().name()) { return this._dispatchHelpCommand(operands[1]); } if (this._defaultCommandName) { this._outputHelpIfRequested(unknown); return this._dispatchSubcommand( this._defaultCommandName, operands, unknown ); } if (this.commands.length && this.args.length === 0 && !this._actionHandler && !this._defaultCommandName) { this.help({ error: true }); } this._outputHelpIfRequested(parsed.unknown); this._checkForMissingMandatoryOptions(); this._checkForConflictingOptions(); const checkForUnknownOptions = () => { if (parsed.unknown.length > 0) { this.unknownOption(parsed.unknown[0]); } }; const commandEvent = `command:${this.name()}`; if (this._actionHandler) { checkForUnknownOptions(); this._processArguments(); let promiseChain; promiseChain = this._chainOrCallHooks(promiseChain, "preAction"); promiseChain = this._chainOrCall( promiseChain, () => this._actionHandler(this.processedArgs) ); if (this.parent) { promiseChain = this._chainOrCall(promiseChain, () => { this.parent.emit(commandEvent, operands, unknown); }); } promiseChain = this._chainOrCallHooks(promiseChain, "postAction"); return promiseChain; } if (this.parent && this.parent.listenerCount(commandEvent)) { checkForUnknownOptions(); this._processArguments(); this.parent.emit(commandEvent, operands, unknown); } else if (operands.length) { if (this._findCommand("*")) { return this._dispatchSubcommand("*", operands, unknown); } if (this.listenerCount("command:*")) { this.emit("command:*", operands, unknown); } else if (this.commands.length) { this.unknownCommand(); } else { checkForUnknownOptions(); this._processArguments(); } } else if (this.commands.length) { checkForUnknownOptions(); this.help({ error: true }); } else { checkForUnknownOptions(); this._processArguments(); } } /** * Find matching command. * * @private * @return {Command | undefined} */ _findCommand(name2) { if (!name2) return void 0; return this.commands.find( (cmd) => cmd._name === name2 || cmd._aliases.includes(name2) ); } /** * Return an option matching `arg` if any. * * @param {string} arg * @return {Option} * @package */ _findOption(arg) { return this.options.find((option) => option.is(arg)); } /** * Display an error message if a mandatory option does not have a value. * Called after checking for help flags in leaf subcommand. * * @private */ _checkForMissingMandatoryOptions() { this._getCommandAndAncestors().forEach((cmd) => { cmd.options.forEach((anOption) => { if (anOption.mandatory && cmd.getOptionValue(anOption.attributeName()) === void 0) { cmd.missingMandatoryOptionValue(anOption); } }); }); } /** * Display an error message if conflicting options are used together in this. * * @private */ _checkForConflictingLocalOptions() { const definedNonDefaultOptions = this.options.filter((option) => { const optionKey = option.attributeName(); if (this.getOptionValue(optionKey) === void 0) { return false; } return this.getOptionValueSource(optionKey) !== "default"; }); const optionsWithConflicting = definedNonDefaultOptions.filter( (option) => option.conflictsWith.length > 0 ); optionsWithConflicting.forEach((option) => { const conflictingAndDefined = definedNonDefaultOptions.find( (defined) => option.conflictsWith.includes(defined.attributeName()) ); if (conflictingAndDefined) { this._conflictingOption(option, conflictingAndDefined); } }); } /** * Display an error message if conflicting options are used together. * Called after checking for help flags in leaf subcommand. * * @private */ _checkForConflictingOptions() { this._getCommandAndAncestors().forEach((cmd) => { cmd._checkForConflictingLocalOptions(); }); } /** * Parse options from `argv` removing known options, * and return argv split into operands and unknown arguments. * * Side effects: modifies command by storing options. Does not reset state if called again. * * Examples: * * argv => operands, unknown * --known kkk op => [op], [] * op --known kkk => [op], [] * sub --unknown uuu op => [sub], [--unknown uuu op] * sub -- --unknown uuu op => [sub --unknown uuu op], [] * * @param {string[]} argv * @return {{operands: string[], unknown: string[]}} */ parseOptions(argv) { const operands = []; const unknown = []; let dest = operands; const args2 = argv.slice(); function maybeOption(arg) { return arg.length > 1 && arg[0] === "-"; } const negativeNumberArg = (arg) => { if (!/^-\d*\.?\d+(e[+-]?\d+)?$/.test(arg)) return false; return !this._getCommandAndAncestors().some( (cmd) => cmd.options.map((opt) => opt.short).some((short) => /^-\d$/.test(short)) ); }; let activeVariadicOption = null; while (args2.length) { const arg = args2.shift(); if (arg === "--") { if (dest === unknown) dest.push(arg); dest.push(...args2); break; } if (activeVariadicOption && (!maybeOption(arg) || negativeNumberArg(arg))) { this.emit(`option:${activeVariadicOption.name()}`, arg); continue; } activeVariadicOption = null; if (maybeOption(arg)) { const option = this._findOption(arg); if (option) { if (option.required) { const value = args2.shift(); if (value === void 0) this.optionMissingArgument(option); this.emit(`option:${option.name()}`, value); } else if (option.optional) { let value = null; if (args2.length > 0 && (!maybeOption(args2[0]) || negativeNumberArg(args2[0]))) { value = args2.shift(); } this.emit(`option:${option.name()}`, value); } else { this.emit(`option:${option.name()}`); } activeVariadicOption = option.variadic ? option : null; continue; } } if (arg.length > 2 && arg[0] === "-" && arg[1] !== "-") { const option = this._findOption(`-${arg[1]}`); if (option) { if (option.required || option.optional && this._combineFlagAndOptionalValue) { this.emit(`option:${option.name()}`, arg.slice(2)); } else { this.emit(`option:${option.name()}`); args2.unshift(`-${arg.slice(2)}`); } continue; } } if (/^--[^=]+=/.test(arg)) { const index2 = arg.indexOf("="); const option = this._findOption(arg.slice(0, index2)); if (option && (option.required || option.optional)) { this.emit(`option:${option.name()}`, arg.slice(index2 + 1)); continue; } } if (dest === operands && maybeOption(arg) && !(this.commands.length === 0 && negativeNumberArg(arg))) { dest = unknown; } if ((this._enablePositionalOptions || this._passThroughOptions) && operands.length === 0 && unknown.length === 0) { if (this._findCommand(arg)) { operands.push(arg); if (args2.length > 0) unknown.push(...args2); break; } else if (this._getHelpCommand() && arg === this._getHelpCommand().name()) { operands.push(arg); if (args2.length > 0) operands.push(...args2); break; } else if (this._defaultCommandName) { unknown.push(arg); if (args2.length > 0) unknown.push(...args2); break; } } if (this._passThroughOptions) { dest.push(arg); if (args2.length > 0) dest.push(...args2); break; } dest.push(arg); } return { operands, unknown }; } /** * Return an object containing local option values as key-value pairs. * * @return {object} */ opts() { if (this._storeOptionsAsProperties) { const result = {}; const len = this.options.length; for (let i2 = 0; i2 < len; i2++) { const key = this.options[i2].attributeName(); result[key] = key === this._versionOptionName ? this._version : this[key]; } return result; } return this._optionValues; } /** * Return an object containing merged local and global option values as key-value pairs. * * @return {object} */ optsWithGlobals() { return this._getCommandAndAncestors().reduce( (combinedOptions, cmd) => Object.assign(combinedOptions, cmd.opts()), {} ); } /** * Display error message and exit (or call exitOverride). * * @param {string} message * @param {object} [errorOptions] * @param {string} [errorOptions.code] - an id string representing the error * @param {number} [errorOptions.exitCode] - used with process.exit */ error(message, errorOptions) { this._outputConfiguration.outputError( `${message} `, this._outputConfiguration.writeErr ); if (typeof this._showHelpAfterError === "string") { this._outputConfiguration.writeErr(`${this._showHelpAfterError} `); } else if (this._showHelpAfterError) { this._outputConfiguration.writeErr("\n"); this.outputHelp({ error: true }); } const config = errorOptions || {}; const exitCode = config.exitCode || 1; const code = config.code || "commander.error"; this._exit(exitCode, code, message); } /** * Apply any option related environment variables, if option does * not have a value from cli or client code. * * @private */ _parseOptionsEnv() { this.options.forEach((option) => { if (option.envVar && option.envVar in process2.env) { const optionKey = option.attributeName(); if (this.getOptionValue(optionKey) === void 0 || ["default", "config", "env"].includes( this.getOptionValueSource(optionKey) )) { if (option.required || option.optional) { this.emit(`optionEnv:${option.name()}`, process2.env[option.envVar]); } else { this.emit(`optionEnv:${option.name()}`); } } } }); } /** * Apply any implied option values, if option is undefined or default value. * * @private */ _parseOptionsImplied() { const dualHelper = new DualOptions(this.options); const hasCustomOptionValue = (optionKey) => { return this.getOptionValue(optionKey) !== void 0 && !["default", "implied"].includes(this.getOptionValueSource(optionKey)); }; this.options.filter( (option) => option.implied !== void 0 && hasCustomOptionValue(option.attributeName()) && dualHelper.valueFromOption( this.getOptionValue(option.attributeName()), option ) ).forEach((option) => { Object.keys(option.implied).filter((impliedKey) => !hasCustomOptionValue(impliedKey)).forEach((impliedKey) => { this.setOptionValueWithSource( impliedKey, option.implied[impliedKey], "implied" ); }); }); } /** * Argument `name` is missing. * * @param {string} name * @private */ missingArgument(name2) { const message = `error: missing required argument '${name2}'`; this.error(message, { code: "commander.missingArgument" }); } /** * `Option` is missing an argument. * * @param {Option} option * @private */ optionMissingArgument(option) { const message = `error: option '${option.flags}' argument missing`; this.error(message, { code: "commander.optionMissingArgument" }); } /** * `Option` does not have a value, and is a mandatory option. * * @param {Option} option * @private */ missingMandatoryOptionValue(option) { const message = `error: required option '${option.flags}' not specified`; this.error(message, { code: "commander.missingMandatoryOptionValue" }); } /** * `Option` conflicts with another option. * * @param {Option} option * @param {Option} conflictingOption * @private */ _conflictingOption(option, conflictingOption) { const findBestOptionFromValue = (option2) => { const optionKey = option2.attributeName(); const optionValue = this.getOptionValue(optionKey); const negativeOption = this.options.find( (target) => target.negate && optionKey === target.attributeName() ); const positiveOption = this.options.find( (target) => !target.negate && optionKey === target.attributeName() ); if (negativeOption && (negativeOption.presetArg === void 0 && optionValue === false || negativeOption.presetArg !== void 0 && optionValue === negativeOption.presetArg)) { return negativeOption; } return positiveOption || option2; }; const getErrorMessage = (option2) => { const bestOption = findBestOptionFromValue(option2); const optionKey = bestOption.attributeName(); const source = this.getOptionValueSource(optionKey); if (source === "env") { return `environment variable '${bestOption.envVar}'`; } return `option '${bestOption.flags}'`; }; const message = `error: ${getErrorMessage(option)} cannot be used with ${getErrorMessage(conflictingOption)}`; this.error(message, { code: "commander.conflictingOption" }); } /** * Unknown option `flag`. * * @param {string} flag * @private */ unknownOption(flag) { if (this._allowUnknownOption) return; let suggestion = ""; if (flag.startsWith("--") && this._showSuggestionAfterError) { let candidateFlags = []; let command = this; do { const moreFlags = command.createHelp().visibleOptions(command).filter((option) => option.long).map((option) => option.long); candidateFlags = candidateFlags.concat(moreFlags); command = command.parent; } while (command && !command._enablePositionalOptions); suggestion = suggestSimilar(flag, candidateFlags); } const message = `error: unknown option '${flag}'${suggestion}`; this.error(message, { code: "commander.unknownOption" }); } /** * Excess arguments, more than expected. * * @param {string[]} receivedArgs * @private */ _excessArguments(receivedArgs) { if (this._allowExcessArguments) return; const expected = this.registeredArguments.length; const s = expected === 1 ? "" : "s"; const forSubcommand = this.parent ? ` for '${this.name()}'` : ""; const message = `error: too many arguments${forSubcommand}. Expected ${expected} argument${s} but got ${receivedArgs.length}.`; this.error(message, { code: "commander.excessArguments" }); } /** * Unknown command. * * @private */ unknownCommand() { const unknownName = this.args[0]; let suggestion = ""; if (this._showSuggestionAfterError) { const candidateNames = []; this.createHelp().visibleCommands(this).forEach((command) => { candidateNames.push(command.name()); if (command.alias()) candidateNames.push(command.alias()); }); suggestion = suggestSimilar(unknownName, candidateNames); } const message = `error: unknown command '${unknownName}'${suggestion}`; this.error(message, { code: "commander.unknownCommand" }); } /** * Get or set the program version. * * This method auto-registers the "-V, --version" option which will print the version number. * * You can optionally supply the flags and description to override the defaults. * * @param {string} [str] * @param {string} [flags] * @param {string} [description] * @return {(this | string | undefined)} `this` command for chaining, or version string if no arguments */ version(str, flags2, description) { if (str === void 0) return this._version; this._version = str; flags2 = flags2 || "-V, --version"; description = description || "output the version number"; const versionOption = this.createOption(flags2, description); this._versionOptionName = versionOption.attributeName(); this._registerOption(versionOption); this.on("option:" + versionOption.name(), () => { this._outputConfiguration.writeOut(`${str} `); this._exit(0, "commander.version", str); }); return this; } /** * Set the description. * * @param {string} [str] * @param {object} [argsDescription] * @return {(string|Command)} */ description(str, argsDescription) { if (str === void 0 && argsDescription === void 0) return this._description; this._description = str; if (argsDescription) { this._argsDescription = argsDescription; } return this; } /** * Set the summary. Used when listed as subcommand of parent. * * @param {string} [str] * @return {(string|Command)} */ summary(str) { if (str === void 0) return this._summary; this._summary = str; return this; } /** * Set an alias for the command. * * You may call more than once to add multiple aliases. Only the first alias is shown in the auto-generated help. * * @param {string} [alias] * @return {(string|Command)} */ alias(alias) { if (alias === void 0) return this._aliases[0]; let command = this; if (this.commands.length !== 0 && this.commands[this.commands.length - 1]._executableHandler) { command = this.commands[this.commands.length - 1]; } if (alias === command._name) throw new Error("Command alias can't be the same as its name"); const matchingCommand = this.parent?._findCommand(alias); if (matchingCommand) { const existingCmd = [matchingCommand.name()].concat(matchingCommand.aliases()).join("|"); throw new Error( `cannot add alias '${alias}' to command '${this.name()}' as already have command '${existingCmd}'` ); } command._aliases.push(alias); return this; } /** * Set aliases for the command. * * Only the first alias is shown in the auto-generated help. * * @param {string[]} [aliases] * @return {(string[]|Command)} */ aliases(aliases) { if (aliases === void 0) return this._aliases; aliases.forEach((alias) => this.alias(alias)); return this; } /** * Set / get the command usage `str`. * * @param {string} [str] * @return {(string|Command)} */ usage(str) { if (str === void 0) { if (this._usage) return this._usage; const args2 = this.registeredArguments.map((arg) => { return humanReadableArgName(arg); }); return [].concat( this.options.length || this._helpOption !== null ? "[options]" : [], this.commands.length ? "[command]" : [], this.registeredArguments.length ? args2 : [] ).join(" "); } this._usage = str; return this; } /** * Get or set the name of the command. * * @param {string} [str] * @return {(string|Command)} */ name(str) { if (str === void 0) return this._name; this._name = str; return this; } /** * Set/get the help group heading for this subcommand in parent command's help. * * @param {string} [heading] * @return {Command | string} */ helpGroup(heading) { if (heading === void 0) return this._helpGroupHeading ?? ""; this._helpGroupHeading = heading; return this; } /** * Set/get the default help group heading for subcommands added to this command. * (This does not override a group set directly on the subcommand using .helpGroup().) * * @example * program.commandsGroup('Development Commands:); * program.command('watch')... * program.command('lint')... * ... * * @param {string} [heading] * @returns {Command | string} */ commandsGroup(heading) { if (heading === void 0) return this._defaultCommandGroup ?? ""; this._defaultCommandGroup = heading; return this; } /** * Set/get the default help group heading for options added to this command. * (This does not override a group set directly on the option using .helpGroup().) * * @example * program * .optionsGroup('Development Options:') * .option('-d, --debug', 'output extra debugging') * .option('-p, --profile', 'output profiling information') * * @param {string} [heading] * @returns {Command | string} */ optionsGroup(heading) { if (heading === void 0) return this._defaultOptionGroup ?? ""; this._defaultOptionGroup = heading; return this; } /** * @param {Option} option * @private */ _initOptionGroup(option) { if (this._defaultOptionGroup && !option.helpGroupHeading) option.helpGroup(this._defaultOptionGroup); } /** * @param {Command} cmd * @private */ _initCommandGroup(cmd) { if (this._defaultCommandGroup && !cmd.helpGroup()) cmd.helpGroup(this._defaultCommandGroup); } /** * Set the name of the command from script filename, such as process.argv[1], * or require.main.filename, or __filename. * * (Used internally and public although not documented in README.) * * @example * program.nameFromFilename(require.main.filename); * * @param {string} filename * @return {Command} */ nameFromFilename(filename) { this._name = path5.basename(filename, path5.extname(filename)); return this; } /** * Get or set the directory for searching for executable subcommands of this command. * * @example * program.executableDir(__dirname); * // or * program.executableDir('subcommands'); * * @param {string} [path] * @return {(string|null|Command)} */ executableDir(path6) { if (path6 === void 0) return this._executableDir; this._executableDir = path6; return this; } /** * Return program help documentation. * * @param {{ error: boolean }} [contextOptions] - pass {error:true} to wrap for stderr instead of stdout * @return {string} */ helpInformation(contextOptions) { const helper = this.createHelp(); const context = this._getOutputContext(contextOptions); helper.prepareContext({ error: context.error, helpWidth: context.helpWidth, outputHasColors: context.hasColors }); const text = helper.formatHelp(this, helper); if (context.hasColors) return text; return this._outputConfiguration.stripColor(text); } /** * @typedef HelpContext * @type {object} * @property {boolean} error * @property {number} helpWidth * @property {boolean} hasColors * @property {function} write - includes stripColor if needed * * @returns {HelpContext} * @private */ _getOutputContext(contextOptions) { contextOptions = contextOptions || {}; const error = !!contextOptions.error; let baseWrite; let hasColors; let helpWidth; if (error) { baseWrite = (str) => this._outputConfiguration.writeErr(str); hasColors = this._outputConfiguration.getErrHasColors(); helpWidth = this._outputConfiguration.getErrHelpWidth(); } else { baseWrite = (str) => this._outputConfiguration.writeOut(str); hasColors = this._outputConfiguration.getOutHasColors(); helpWidth = this._outputConfiguration.getOutHelpWidth(); } const write = (str) => { if (!hasColors) str = this._outputConfiguration.stripColor(str); return baseWrite(str); }; return { error, write, hasColors, helpWidth }; } /** * Output help information for this command. * * Outputs built-in help, and custom text added using `.addHelpText()`. * * @param {{ error: boolean } | Function} [contextOptions] - pass {error:true} to write to stderr instead of stdout */ outputHelp(contextOptions) { let deprecatedCallback; if (typeof contextOptions === "function") { deprecatedCallback = contextOptions; contextOptions = void 0; } const outputContext = this._getOutputContext(contextOptions); const eventContext = { error: outputContext.error, write: outputContext.write, command: this }; this._getCommandAndAncestors().reverse().forEach((command) => command.emit("beforeAllHelp", eventContext)); this.emit("beforeHelp", eventContext); let helpInformation = this.helpInformation({ error: outputContext.error }); if (deprecatedCallback) { helpInformation = deprecatedCallback(helpInformation); if (typeof helpInformation !== "string" && !Buffer.isBuffer(helpInformation)) { throw new Error("outputHelp callback must return a string or a Buffer"); } } outputContext.write(helpInformation); if (this._getHelpOption()?.long) { this.emit(this._getHelpOption().long); } this.emit("afterHelp", eventContext); this._getCommandAndAncestors().forEach( (command) => command.emit("afterAllHelp", eventContext) ); } /** * You can pass in flags and a description to customise the built-in help option. * Pass in false to disable the built-in help option. * * @example * program.helpOption('-?, --help' 'show help'); // customise * program.helpOption(false); // disable * * @param {(string | boolean)} flags * @param {string} [description] * @return {Command} `this` command for chaining */ helpOption(flags2, description) { if (typeof flags2 === "boolean") { if (flags2) { if (this._helpOption === null) this._helpOption = void 0; if (this._defaultOptionGroup) { this._initOptionGroup(this._getHelpOption()); } } else { this._helpOption = null; } return this; } this._helpOption = this.createOption( flags2 ?? "-h, --help", description ?? "display help for command" ); if (flags2 || description) this._initOptionGroup(this._helpOption); return this; } /** * Lazy create help option. * Returns null if has been disabled with .helpOption(false). * * @returns {(Option | null)} the help option * @package */ _getHelpOption() { if (this._helpOption === void 0) { this.helpOption(void 0, void 0); } return this._helpOption; } /** * Supply your own option to use for the built-in help option. * This is an alternative to using helpOption() to customise the flags and description etc. * * @param {Option} option * @return {Command} `this` command for chaining */ addHelpOption(option) { this._helpOption = option; this._initOptionGroup(option); return this; } /** * Output help information and exit. * * Outputs built-in help, and custom text added using `.addHelpText()`. * * @param {{ error: boolean }} [contextOptions] - pass {error:true} to write to stderr instead of stdout */ help(contextOptions) { this.outputHelp(contextOptions); let exitCode = Number(process2.exitCode ?? 0); if (exitCode === 0 && contextOptions && typeof contextOptions !== "function" && contextOptions.error) { exitCode = 1; } this._exit(exitCode, "commander.help", "(outputHelp)"); } /** * // Do a little typing to coordinate emit and listener for the help text events. * @typedef HelpTextEventContext * @type {object} * @property {boolean} error * @property {Command} command * @property {function} write */ /** * Add additional text to be displayed with the built-in help. * * Position is 'before' or 'after' to affect just this command, * and 'beforeAll' or 'afterAll' to affect this command and all its subcommands. * * @param {string} position - before or after built-in help * @param {(string | Function)} text - string to add, or a function returning a string * @return {Command} `this` command for chaining */ addHelpText(position, text) { const allowedValues = ["beforeAll", "before", "after", "afterAll"]; if (!allowedValues.includes(position)) { throw new Error(`Unexpected value for position to addHelpText. Expecting one of '${allowedValues.join("', '")}'`); } const helpEvent = `${position}Help`; this.on(helpEvent, (context) => { let helpStr; if (typeof text === "function") { helpStr = text({ error: context.error, command: context.command }); } else { helpStr = text; } if (helpStr) { context.write(`${helpStr} `); } }); return this; } /** * Output help information if help flags specified * * @param {Array} args - array of options to search for help flags * @private */ _outputHelpIfRequested(args2) { const helpOption = this._getHelpOption(); const helpRequested = helpOption && args2.find((arg) => helpOption.is(arg)); if (helpRequested) { this.outputHelp(); this._exit(0, "commander.helpDisplayed", "(outputHelp)"); } } }; function incrementNodeInspectorPort(args2) { return args2.map((arg) => { if (!arg.startsWith("--inspect")) { return arg; } let debugOption; let debugHost = "127.0.0.1"; let debugPort = "9229"; let match; if ((match = arg.match(/^(--inspect(-brk)?)$/)) !== null) { debugOption = match[1]; } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+)$/)) !== null) { debugOption = match[1]; if (/^\d+$/.test(match[3])) { debugPort = match[3]; } else { debugHost = match[3]; } } else if ((match = arg.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/)) !== null) { debugOption = match[1]; debugHost = match[3]; debugPort = match[4]; } if (debugOption && debugPort !== "0") { return `${debugOption}=${debugHost}:${parseInt(debugPort) + 1}`; } return arg; }); } function useColor() { if (process2.env.NO_COLOR || process2.env.FORCE_COLOR === "0" || process2.env.FORCE_COLOR === "false") return false; if (process2.env.FORCE_COLOR || process2.env.CLICOLOR_FORCE !== void 0) return true; return void 0; } exports2.Command = Command; exports2.useColor = useColor; } }); // node_modules/commander/index.js var require_commander = __commonJS({ "node_modules/commander/index.js"(exports2) { var { Argument } = require_argument(); var { Command } = require_command(); var { CommanderError, InvalidArgumentError } = require_error(); var { Help } = require_help(); var { Option } = require_option(); exports2.program = new Command(); exports2.createCommand = (name2) => new Command(name2); exports2.createOption = (flags2, description) => new Option(flags2, description); exports2.createArgument = (name2, description) => new Argument(name2, description); exports2.Command = Command; exports2.Option = Option; exports2.Argument = Argument; exports2.Help = Help; exports2.CommanderError = CommanderError; exports2.InvalidArgumentError = InvalidArgumentError; exports2.InvalidOptionArgumentError = InvalidArgumentError; } }); // ../autocompletion/v2/CodeSnippets.ts var CodeSnippets = class _CodeSnippets { _nextId = 0; _idMap = /* @__PURE__ */ new Map(); _byName = /* @__PURE__ */ new Map(); _fileIndex = /* @__PURE__ */ new Map(); // 基于结构化信息的索引 _byDefinitionType = /* @__PURE__ */ new Map(); // 按定义类型索引 _bySignature = /* @__PURE__ */ new Map(); // 按签名索引 snippets = []; filesHash = /* @__PURE__ */ new Map(); _addToIndices(id, snippet) { if (!this._byName.has(snippet.name)) this._byName.set(snippet.name, /* @__PURE__ */ new Set()); this._byName.get(snippet.name).add(id); if (!this._fileIndex.has(snippet.filePath)) { this._fileIndex.set(snippet.filePath, { allIds: /* @__PURE__ */ new Set(), byName: /* @__PURE__ */ new Map() }); } const bucket = this._fileIndex.get(snippet.filePath); bucket.allIds.add(id); if (!bucket.byName.has(snippet.name)) bucket.byName.set(snippet.name, /* @__PURE__ */ new Set()); bucket.byName.get(snippet.name).add(id); this._addToStructuredIndices(id, snippet); } _removeFromIndices(id, snippet) { const nameSet = this._byName.get(snippet.name); if (nameSet) { nameSet.delete(id); if (nameSet.size === 0) this._byName.delete(snippet.name); } const bucket = this._fileIndex.get(snippet.filePath); if (bucket) { bucket.allIds.delete(id); const nameSetInFile = bucket.byName.get(snippet.name); if (nameSetInFile) { nameSetInFile.delete(id); if (nameSetInFile.size === 0) bucket.byName.delete(snippet.name); } if (bucket.allIds.size === 0) this._fileIndex.delete(snippet.filePath); } this._removeFromStructuredIndices(id, snippet); } /** * 添加结构化信息索引 */ _addToStructuredIndices(id, snippet) { if (snippet.definition?.type) { if (!this._byDefinitionType.has(snippet.definition.type)) { this._byDefinitionType.set(snippet.definition.type, /* @__PURE__ */ new Set()); } this._byDefinitionType.get(snippet.definition.type).add(id); } if (snippet.signature) { if (!this._bySignature.has(snippet.signature)) { this._bySignature.set(snippet.signature, /* @__PURE__ */ new Set()); } this._bySignature.get(snippet.signature).add(id); } } /** * 移除结构化信息索引 */ _removeFromStructuredIndices(id, snippet) { if (snippet.definition?.type) { const typeSet = this._byDefinitionType.get(snippet.definition.type); if (typeSet) { typeSet.delete(id); if (typeSet.size === 0) this._byDefinitionType.delete(snippet.definition.type); } } if (snippet.signature) { const signatureSet = this._bySignature.get(snippet.signature); if (signatureSet) { signatureSet.delete(id); if (signatureSet.size === 0) this._bySignature.delete(snippet.signature); } } } /** * 按名称查找单个片段 */ async findByName(name2) { const results = await this.find({ name: name2 }); return results.length > 0 ? results[0] : void 0; } /** * 按文件查找片段 */ async findByFile(filePath) { return await this.find({ filePath }); } /** * 按定义类型查找片段 */ async findByDefinitionType(definitionType) { const ids = this._byDefinitionType.get(definitionType) ?? /* @__PURE__ */ new Set(); return Array.from(ids).map((id) => this._idMap.get(id)); } /** * 按签名查找片段 */ async findBySignature(signature) { const ids = this._bySignature.get(signature) ?? /* @__PURE__ */ new Set(); return Array.from(ids).map((id) => this._idMap.get(id)); } /** * 查找具有特定参数类型的函数 */ async findFunctionsWithParameterTypes(paramTypes) { const results = []; for (const snippet of this.snippets) { if (snippet.parameters && snippet.parameters.length >= paramTypes.length) { let match = true; for (let i2 = 0; i2 < paramTypes.length; i2++) { if (snippet.parameters[i2]?.type !== paramTypes[i2]) { match = false; break; } } if (match) { results.push(snippet); } } } return results; } async merge(codeSnippets) { if (codeSnippets && codeSnippets.snippets) { await this.insert(codeSnippets.snippets); } } /** * 获取统计信息 */ getStats() { const typeDistribution = {}; const definitionTypeDistribution = {}; let totalLines = 0; for (const snippet of this.snippets) { typeDistribution[snippet.type] = (typeDistribution[snippet.type] || 0) + 1; if (snippet.definition?.type) { definitionTypeDistribution[snippet.definition.type] = (definitionTypeDistribution[snippet.definition.type] || 0) + 1; } totalLines += snippet.endLine - snippet.startLine + 1; } const files = new Set(this.snippets.map((s) => s.filePath)); return { totalSnippets: this.snippets.length, fileCount: files.size, typeDistribution, definitionTypeDistribution, avgLinesPerSnippet: this.snippets.length > 0 ? totalLines / this.snippets.length : 0 }; } /** * Find snippets by partial information */ async find(query) { if (query.filePath && query.name) { const bucket = this._fileIndex.get(query.filePath); const ids = bucket?.byName.get(query.name) ?? /* @__PURE__ */ new Set(); let res = Array.from(ids).map((id) => this._idMap.get(id)); if (query.type) res = res.filter((s) => s.type === query.type); if (query.field) { res = res.filter((s) => s.field === query.field); } else { res = res.filter((s) => s.field === void 0 || s.field === null || s.field === ""); } return res; } if (query.name) { const ids = this._byName.get(query.name) ?? /* @__PURE__ */ new Set(); return Array.from(ids).map((id) => this._idMap.get(id)); } if (query.filePath) { const bucket = this._fileIndex.get(query.filePath); const ids = bucket?.allIds ?? /* @__PURE__ */ new Set(); return Array.from(ids).map((id) => this._idMap.get(id)); } return Array.from(this._idMap.values()); } /** * Delete all snippets from a specific file */ async deleteByFile(filePath) { const bucket = this._fileIndex.get(filePath); if (!bucket) return []; const deleted = []; for (const id of Array.from(bucket.allIds)) { const snippet = this._idMap.get(id); this._removeFromIndices(id, snippet); this._idMap.delete(id); deleted.push(snippet); } if (deleted.length) { this.snippets = this.snippets.filter((s) => s.filePath !== filePath); } return deleted; } /** * Insert snippets in batch */ async insert(snippets) { for (const snippet of snippets) { const id = ++this._nextId; this._idMap.set(id, snippet); this._addToIndices(id, snippet); this.snippets.push(snippet); if (snippet.fileHash && snippet.filePath) { this.filesHash.set(snippet.filePath, snippet.fileHash); } } return snippets.length; } /** * Update a single snippet */ async update(snippet) { if (snippet.filePath && snippet.name && snippet.type) { const bucket = this._fileIndex.get(snippet.filePath); if (!bucket) return false; const candidateIds = bucket.byName.get(snippet.name) ?? /* @__PURE__ */ new Set(); for (const id of candidateIds) { const old = this._idMap.get(id); if (old.type === snippet.type) { this._removeFromIndices(id, old); this._idMap.set(id, snippet); this._addToIndices(id, snippet); const idx = this.snippets.indexOf(old); if (idx > -1) this.snippets[idx] = snippet; return true; } } } if (snippet.filePath && snippet.name) { const bucket = this._fileIndex.get(snippet.filePath); if (!bucket) return false; const candidateIds = bucket.byName.get(snippet.name) ?? /* @__PURE__ */ new Set(); if (candidateIds.size > 0) { const id = Array.from(candidateIds)[0]; const old = this._idMap.get(id); this._removeFromIndices(id, old); this._idMap.set(id, snippet); this._addToIndices(id, snippet); const idx = this.snippets.indexOf(old); if (idx > -1) this.snippets[idx] = snippet; return true; } } return false; } async updateByFile(file, snippets) { await this.deleteByFile(file.filePath); await this.merge(snippets); const fileHash = file.fileHash || file.hash; if (fileHash) { this.filesHash.set(file.filePath, fileHash); } return true; } /** * Clear all snippets */ clear() { this._nextId = 0; this._idMap.clear(); this._byName.clear(); this._fileIndex.clear(); this._byDefinitionType.clear(); this._bySignature.clear(); this.snippets = []; } /** * Filter snippets by condition */ async filter(predicate) { const result = new _CodeSnippets(); for (const snippet of this._idMap.values()) { if (predicate(snippet)) await result.insert([snippet]); } return result; } /** * Check if a code file's index is up to date * @param file The file to check * @returns true if the file needs to be updated (index is NOT latest), false if index is current */ isCodeFileLatestIndex(file) { const storedHash = this.filesHash.get(file.filePath); if (!storedHash) { return true; } const currentHash = file.fileHash || file.hash; return currentHash !== storedHash; } getSnippets() { return this.snippets; } }; // ../autocompletion/v2/types.ts var CodeLanguageType = /* @__PURE__ */ ((CodeLanguageType3) => { CodeLanguageType3["Python"] = "python"; CodeLanguageType3["Java"] = "java"; CodeLanguageType3["JavaScript"] = "javascript"; CodeLanguageType3["TypeScript"] = "typescript"; CodeLanguageType3["JSX"] = "jsx"; CodeLanguageType3["TSX"] = "tsx"; CodeLanguageType3["Go"] = "go"; CodeLanguageType3["Swift"] = "swift"; CodeLanguageType3["CSS"] = "css"; CodeLanguageType3["HTML"] = "html"; CodeLanguageType3["Kotlin"] = "kotlin"; CodeLanguageType3["PHP"] = "php"; CodeLanguageType3["Rust"] = "rust"; CodeLanguageType3["C"] = "c"; CodeLanguageType3["CPP"] = "cpp"; CodeLanguageType3["Unknown"] = "unknown"; return CodeLanguageType3; })(CodeLanguageType || {}); var CodeLanguageTypeSupport = [ "python" /* Python */, "java" /* Java */, "javascript" /* JavaScript */, "typescript" /* TypeScript */, "jsx" /* JSX */, "tsx" /* TSX */, "go" /* Go */, "swift" /* Swift */, "css" /* CSS */, "html" /* HTML */, "kotlin" /* Kotlin */, "php" /* PHP */, "rust" /* Rust */, "c" /* C */, "cpp" /* CPP */ ]; var FileExtensionLanguageMap = { ".py": "python" /* Python */, ".java": "java" /* Java */, ".js": "javascript" /* JavaScript */, ".mjs": "javascript" /* JavaScript */, ".ts": "typescript" /* TypeScript */, ".tsx": "tsx" /* TSX */, ".jsx": "jsx" /* JSX */, ".go": "go" /* Go */, ".swift": "swift" /* Swift */, ".css": "css" /* CSS */, ".html": "html" /* HTML */, ".kt": "kotlin" /* Kotlin */, ".kts": "kotlin" /* Kotlin */, ".php": "php" /* PHP */, ".rs": "rust" /* Rust */, ".c": "c" /* C */, ".h": "c" /* C */, ".cpp": "cpp" /* CPP */, ".cxx": "cpp" /* CPP */, ".cc": "cpp" /* CPP */, ".hpp": "cpp" /* CPP */, ".hxx": "cpp" /* CPP */ }; var LanguageFileExtensionMap = Object.entries(FileExtensionLanguageMap).reduce( (acc, [extension, language]) => { if (!acc[language]) acc[language] = []; acc[language].push(extension); return acc; }, {} ); // ../autocompletion/v2/CodeContext.ts var path4 = __toESM(require("path")); var crypto3 = __toESM(require("crypto")); // ../../../src/services/CT-tree-sitter/languageParser.ts var path = __toESM(require("path")); var import_web_tree_sitter = __toESM(require_tree_sitter()); // ../../../src/services/CT-tree-sitter/queries/solidity.ts var solidityQuery = ` ; Contract declarations (contract_declaration name: (identifier) @name.definition.contract) @definition.contract (interface_declaration name: (identifier) @name.definition.interface) @definition.interface (library_declaration name: (identifier) @name.definition.library) @definition.library ; Function declarations (function_definition name: (identifier) @name.definition.function) @definition.function (modifier_definition name: (identifier) @name.definition.modifier) @definition.modifier (constructor_definition) @definition.constructor (fallback_receive_definition (visibility) (state_mutability)) @definition.fallback ; Type declarations (struct_declaration name: (identifier) @name.definition.struct) @definition.struct (enum_declaration name: (identifier) @name.definition.enum) @definition.enum (event_definition name: (identifier) @name.definition.event) @definition.event (error_declaration name: (identifier) @name.definition.error) @definition.error ; Variable declarations (state_variable_declaration name: (identifier) @name.definition.variable) @definition.variable ; Using directives (using_directive (type_alias) @name.definition.using) @definition.using`; // ../../../src/services/CT-tree-sitter/queries/php.ts var php_default = ` ;-------------------------- ; 1. CLASS DEFINITIONS ;-------------------------- ; Regular classes (class_declaration name: (name) @name.definition.class) @definition.class ; Abstract classes (class_declaration (abstract_modifier) name: (name) @name.definition.abstract_class) @definition.abstract_class ; Final classes (class_declaration (final_modifier) name: (name) @name.definition.final_class) @definition.final_class ; Readonly classes (PHP 8.2+) (class_declaration (readonly_modifier) name: (name) @name.definition.readonly_class) @definition.readonly_class ;-------------------------- ; 2. INTERFACE & TRAIT DEFINITIONS ;-------------------------- ; Interfaces (interface_declaration name: (name) @name.definition.interface) @definition.interface ; Traits (trait_declaration name: (name) @name.definition.trait) @definition.trait ; Enums (PHP 8.1+) (enum_declaration name: (name) @name.definition.enum) @definition.enum ;-------------------------- ; 3. FUNCTION & METHOD DEFINITIONS ;-------------------------- ; Global functions (function_definition name: (name) @name.definition.function parameters: (formal_parameters) @parameters.definition.function body: (compound_statement) @body.definition.function) @definition.function ; Regular methods (method_declaration name: (name) @name.definition.method parameters: (formal_parameters) @parameters.definition.method) @definition.method ; Static methods (method_declaration (static_modifier) name: (name) @name.definition.static_method parameters: (formal_parameters) @parameters.definition.static_method) @definition.static_method ; Abstract methods (method_declaration (abstract_modifier) name: (name) @name.definition.abstract_method parameters: (formal_parameters) @parameters.definition.abstract_method) @definition.abstract_method ; Final methods (method_declaration (final_modifier) name: (name) @name.definition.final_method parameters: (formal_parameters) @parameters.definition.final_method) @definition.final_method ; Arrow functions (PHP 7.4+) (arrow_function) @definition.arrow_function ;-------------------------- ; 4. PROPERTY DEFINITIONS ;-------------------------- ; Regular properties (property_declaration (property_element (variable_name (name) @name.definition.property))) @definition.property ; Static properties (property_declaration (static_modifier) (property_element (variable_name (name) @name.definition.static_property))) @definition.static_property ; Readonly properties (PHP 8.1+) (property_declaration (readonly_modifier) (property_element (variable_name (name) @name.definition.readonly_property))) @definition.readonly_property ; Constructor property promotion (PHP 8.0+) (property_promotion_parameter name: (variable_name (name) @name.definition.promoted_property)) @definition.promoted_property ;-------------------------- ; 5. OTHER LANGUAGE CONSTRUCTS ;-------------------------- ; Constants (const_declaration (const_element (name) @name.definition.constant)) @definition.constant ; Namespaces (namespace_definition name: (namespace_name) @name.definition.namespace) @definition.namespace ; Use statements (imports) (namespace_use_declaration (namespace_use_clause (qualified_name) @name.definition.use)) @definition.use ; Anonymous classes (object_creation_expression (declaration_list)) @definition.anonymous_class ; Attributes (PHP 8.0+) (attribute_group (attribute (name) @name.definition.attribute)) @definition.attribute ; Match expressions (PHP 8.0+) (match_expression) @definition.match_expression ; Heredoc syntax (heredoc) @definition.heredoc ; Nowdoc syntax (nowdoc) @definition.nowdoc `; // ../../../src/services/CT-tree-sitter/queries/vue.ts var vueQuery = ` ; Top-level structure (component) @component.definition ; Template section (template_element) @template.definition (template_element (element (start_tag (tag_name) @element.name.definition)) (element (start_tag (attribute (attribute_name) @attribute.name.definition))) (element (start_tag (directive_attribute (directive_name) @directive.name.definition)))) ; Script section (script_element) @script.definition (script_element (raw_text) @script.content.definition) ; Style section (style_element) @style.definition (style_element (raw_text) @style.content.definition) `; // ../../../src/services/CT-tree-sitter/queries/typescript.ts var typescript_default = ` ; === Import Declarations === (import_statement (import_clause (named_imports (import_specifier name: (identifier) @name.import)))) @definition.import ; === Default Imports === (import_statement (import_clause (identifier) @name.import)) @definition.import ; === Class Declarations === (class_declaration name: (type_identifier) @name.class) @definition.class ; === Abstract Class Declarations === (abstract_class_declaration name: (type_identifier) @name.class) @definition.class ; === Interface Declarations === (interface_declaration name: (type_identifier) @name.interface) @definition.interface ; === Type Alias Declarations === (type_alias_declaration name: (type_identifier) @name.type_alias) @definition.type_alias ; === Enum Declarations === (enum_declaration name: (identifier) @name.enum) @definition.enum ; === Function Declarations === (function_declaration name: (identifier) @name.function parameters: (formal_parameters) @parameters.function body: (statement_block) @body.function) @definition.function ; === Generator Function Declarations === (generator_function_declaration name: (identifier) @name.function parameters: (formal_parameters) @parameters.function body: (statement_block) @body.function) @definition.function ; === Method Definitions in Classes === (method_definition name: (property_identifier) @name.method parameters: (formal_parameters) @parameters.method body: (statement_block) @body.method) @definition.method ; === Variable Declarations === (variable_declaration (variable_declarator name: (identifier) @name.variable)) @definition.variable ; === Lexical Declarations (const, let) === (lexical_declaration (variable_declarator name: (identifier) @name.variable)) @definition.variable ; === Property Signatures in Interfaces === (property_signature name: (property_identifier) @name.property) @definition.property ; === Method Signatures in Interfaces === (method_signature name: (property_identifier) @name.method parameters: (formal_parameters) @parameters.method) @definition.method ; === Arrow Functions assigned to variables === (lexical_declaration (variable_declarator name: (identifier) @name.function value: (arrow_function parameters: (formal_parameters) @parameters.function))) @definition.function (variable_declaration (variable_declarator name: (identifier) @name.function value: (arrow_function parameters: (formal_parameters) @parameters.function))) @definition.function ; === Function Expressions assigned to variables === (lexical_declaration (variable_declarator name: (identifier) @name.function value: (function_expression parameters: (formal_parameters) @parameters.function))) @definition.function (variable_declaration (variable_declarator name: (identifier) @name.function value: (function_expression parameters: (formal_parameters) @parameters.function))) @definition.function `; // ../../../src/services/CT-tree-sitter/queries/tsx.ts var tsx_default = `${typescript_default} ; Function Components - Both function declarations and arrow functions (function_declaration name: (identifier) @name) @definition.component ; Arrow Function Components (variable_declaration (variable_declarator name: (identifier) @name value: (arrow_function))) @definition.component ; Export Statement Components (export_statement (variable_declaration (variable_declarator name: (identifier) @name value: (arrow_function)))) @definition.component ; Class Components (class_declaration name: (type_identifier) @name) @definition.class_component ; Interface Declarations (interface_declaration name: (type_identifier) @name) @definition.interface ; Type Alias Declarations (type_alias_declaration name: (type_identifier) @name) @definition.type ; HOC Components (variable_declaration (variable_declarator name: (identifier) @name value: (call_expression function: (identifier)))) @definition.component ; JSX Component Usage - Capture all components in JSX (jsx_element open_tag: (jsx_opening_element name: [(identifier) @component (member_expression) @component])) @definition.jsx_element ; Self-closing JSX elements (jsx_self_closing_element name: [(identifier) @component (member_expression) @component]) @definition.jsx_self_closing_element ; Capture all identifiers in JSX expressions that start with capital letters (jsx_expression (identifier) @jsx_component) @definition.jsx_component ; Capture all member expressions in JSX (member_expression object: (identifier) @object property: (property_identifier) @property) @definition.member_component ; Capture components in conditional expressions (ternary_expression consequence: (parenthesized_expression (jsx_element open_tag: (jsx_opening_element name: (identifier) @component)))) @definition.conditional_component (ternary_expression alternative: (jsx_self_closing_element name: (identifier) @component)) @definition.conditional_component ; Generic Components (function_declaration name: (identifier) @name type_parameters: (type_parameters)) @definition.generic_component `; // ../../../src/services/CT-tree-sitter/queries/python.ts var python_default = ` ; Class definitions (including decorated) (class_definition name: (identifier) @name.definition.class) @definition.class (decorated_definition definition: (class_definition name: (identifier) @name.definition.class)) @definition.class ; Function definitions with parameters and body (including async and decorated) (function_definition name: (identifier) @name.definition.function parameters: (parameters) @parameters.definition.function body: (block) @body.definition.function) @definition.function (decorated_definition definition: (function_definition name: (identifier) @name.definition.function parameters: (parameters) @parameters.definition.function)) @definition.function ; Assignment statements for variables (assignment left: (identifier) @name.definition.variable) @definition.variable ; Multiple assignment (tuple unpacking) - capture each identifier separately (assignment left: (pattern_list (identifier) @name.definition.variable)) @definition.variable ; Augmented assignment (+=, -=, etc.) (augmented_assignment left: (identifier) @name.definition.variable) @definition.variable ; Annotated assignment (with type hints) (expression_statement (assignment left: (identifier) @name.definition.variable type: (type))) @definition.variable ; Attribute assignments (self.attribute = value) - capture the attribute name (assignment left: (attribute object: (identifier) attribute: (identifier) @name.definition.member_variable)) @definition.variable ; Lambda expressions (expression_statement (assignment left: (identifier) @name.definition.lambda right: (parenthesized_expression (lambda)))) @definition.lambda ; Generator functions (functions containing yield) (function_definition name: (identifier) @name.definition.generator body: (block (expression_statement (yield)))) @definition.generator ; Comprehensions (expression_statement (assignment left: (identifier) @name.definition.comprehension right: [ (list_comprehension) (dictionary_comprehension) (set_comprehension) ])) @definition.comprehension ; With statements (with_statement) @definition.with_statement ; Try statements (try_statement) @definition.try_statement ; Import statements (import_statement name: (dotted_name) @name.definition.import) @definition.import (import_from_statement module_name: (dotted_name) @name.definition.import) @definition.import (import_from_statement name: (dotted_name) @name.definition.import) @definition.import ; Global/Nonlocal statements (function_definition body: (block [(global_statement) (nonlocal_statement)])) @definition.scope ; Match case statements (function_definition body: (block (match_statement))) @definition.match_case ; Type annotations (typed_parameter type: (type)) @definition.type_annotation (expression_statement (assignment left: (identifier) @name.definition.type type: (type))) @definition.type_annotation `; // ../../../src/services/CT-tree-sitter/queries/javascript.ts var javascript_default = ` ( (comment)* @doc . (method_definition name: (property_identifier) @name parameters: (formal_parameters) @parameters.definition.method) @definition.method (#not-eq? @name "constructor") (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.method) ) ( (comment)* @doc . [ (class name: (_) @name.definition.class) (class_declaration name: (_) @name.definition.class) ] @definition.class (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.class) ) ( (comment)* @doc . [ (function_declaration name: (identifier) @name.definition.function parameters: (formal_parameters) @parameters.definition.function body: (statement_block) @body.definition.function) @definition.function (generator_function_declaration name: (identifier) @name.definition.function parameters: (formal_parameters) @parameters.definition.function) @definition.function ] (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.function) ) ( (comment)* @doc . (lexical_declaration (variable_declarator name: (identifier) @name value: [ (arrow_function parameters: (formal_parameters) @parameters.definition.function) (function_expression parameters: (formal_parameters) @parameters.definition.function) ]) @definition.function) (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.function) ) ( (comment)* @doc . (variable_declaration (variable_declarator name: (identifier) @name value: [ (arrow_function parameters: (formal_parameters) @parameters.definition.function) (function_expression parameters: (formal_parameters) @parameters.definition.function) ]) @definition.function) (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.function) ) ; Variable declarations (let, const, var) - capture each declarator separately (variable_declarator name: (identifier) @name.definition.variable) @definition.variable ; Also capture from parent declarations for context (variable_declaration (variable_declarator name: (identifier) @name.definition.variable)) @definition.variable (lexical_declaration (variable_declarator name: (identifier) @name.definition.variable)) @definition.variable ; Destructuring assignments - capture all identifiers in destructuring patterns (shorthand_property_identifier_pattern) @name.definition.variable @definition.variable ; Array destructuring - capture the whole pattern for manual processing (lexical_declaration (variable_declarator name: (array_pattern) @array_pattern)) @definition.variable (variable_declaration (variable_declarator name: (array_pattern) @array_pattern)) @definition.variable ; Class field declarations (field_definition property: (property_identifier) @name.definition.member_variable) @definition.variable ; Assignment expressions for member variables (this.property = value) (assignment_expression left: (member_expression object: (this) property: (property_identifier) @name.definition.member_variable)) @definition.variable ; Object property assignments (assignment_expression left: (member_expression property: (property_identifier) @name.definition.member_variable)) @definition.variable ; JSON object definitions (object) @object.definition ; JSON object key-value pairs (pair key: (string) @property.name.definition value: [ (object) @object.value (array) @array.value (string) @string.value (number) @number.value (true) @boolean.value (false) @boolean.value (null) @null.value ] ) @property.definition ; JSON array definitions (array) @array.definition ; Decorated method definitions ( [ (method_definition decorator: (decorator) name: (property_identifier) @name parameters: (formal_parameters) @parameters.definition.method) @definition.method (method_definition decorator: (decorator (call_expression function: (identifier) @decorator_name)) name: (property_identifier) @name parameters: (formal_parameters) @parameters.definition.method) @definition.method ] (#not-eq? @name "constructor") ) ; Decorated class definitions ( [ (class decorator: (decorator) name: (_) @name.definition.class) @definition.class (class_declaration decorator: (decorator) name: (_) @name.definition.class) @definition.class ] ) ; Capture method names in decorated classes ( (class_declaration decorator: (decorator) body: (class_body (method_definition name: (property_identifier) @name parameters: (formal_parameters) @parameters.definition.method) @definition.method)) (#not-eq? @name "constructor") ) `; // ../../../src/services/CT-tree-sitter/queries/jsx.ts var jsx_default = `${javascript_default} ; === React Function Components (override JavaScript base patterns) === ( (comment)* @doc . (function_declaration name: (identifier) @name.definition.function parameters: (formal_parameters) @parameters.definition.function body: (statement_block) @body.definition.function) @definition.function (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.function) ) ( (comment)* @doc . (lexical_declaration (variable_declarator name: (identifier) @name.definition.function value: (arrow_function parameters: (formal_parameters) @parameters.definition.function ) ) ) @definition.function (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.function) ) ( (comment)* @doc . (variable_declaration (variable_declarator name: (identifier) @name.definition.function value: (arrow_function parameters: (formal_parameters) @parameters.definition.function ) ) ) @definition.function (#strip! @doc "^[\\s\\*/]+|^[\\s\\*/]$") (#select-adjacent! @doc @definition.function) ) ; === JSX Elements === (jsx_element open_tag: (jsx_opening_element name: (identifier) @name.jsx_element)) @definition.jsx_element (jsx_self_closing_element name: (identifier) @name.jsx_element) @definition.jsx_element ; === Array pattern destructuring (for useState hooks) === (lexical_declaration (variable_declarator name: (array_pattern) @array_pattern)) @definition.variable (variable_declaration (variable_declarator name: (array_pattern) @array_pattern)) @definition.variable ; === Function calls (for hooks like useEffect) === (call_expression function: (identifier) @name.definition.function) @definition.function_call `; // ../../../src/services/CT-tree-sitter/queries/java.ts var java_default = ` ; Import declarations (import_declaration (scoped_identifier) @name.definition.import) @definition.import ; Package declarations (package_declaration (scoped_identifier) @name.definition.package) @definition.package ; Class declarations (class_declaration name: (identifier) @name.definition.class) @definition.class ; Interface declarations (interface_declaration name: (identifier) @name.definition.interface) @definition.interface ; Enum declarations (enum_declaration name: (identifier) @name.definition.enum) @definition.enum ; Record declarations (record_declaration name: (identifier) @name.definition.record) @definition.record ; Annotation type declarations (annotation_type_declaration name: (identifier) @name.definition.annotation) @definition.annotation ; Annotation type element declarations (annotation methods) (annotation_type_element_declaration name: (identifier) @name.definition.method) @definition.method ; Method declarations with parameters and body (method_declaration name: (identifier) @name.definition.method parameters: (formal_parameters) @parameters.definition.method body: (block) @body.definition.method) @definition.method ; Abstract method declarations (interface methods without body) (method_declaration name: (identifier) @name.definition.method parameters: (formal_parameters) @parameters.definition.method) @definition.method ; Constructor declarations (constructor_declaration name: (identifier) @name.definition.constructor parameters: (formal_parameters) @parameters.definition.constructor body: (constructor_body) @body.definition.constructor) @definition.constructor ; Field declarations - handle multiple declarators (field_declaration declarator: (variable_declarator name: (identifier) @name.definition.field)) @definition.field ; Enum constant declarations (enum_declaration body: (enum_body (enum_constant name: (identifier) @name.definition.enum_constant))) @definition.enum_constant ; Static initializers (static_initializer) @definition.static_initializer ; Instance initializers (block) @definition.instance_initializer `; // ../../../src/services/CT-tree-sitter/queries/rust.ts var rust_default = ` ; Function definitions (function_item name: (identifier) @name.definition.function parameters: (parameters) @parameters.definition.function body: (block) @body.definition.function) @definition.function ; Struct definitions and their fields (struct_item name: (type_identifier) @name.definition.struct body: (field_declaration_list (field_declaration name: (field_identifier) @name.definition.struct_field)*)) @definition.struct ; Tuple struct definitions (struct_item name: (type_identifier) @name.definition.struct body: (ordered_field_declaration_list)*) @definition.struct ; Unit struct definitions (struct_item name: (type_identifier) @name.definition.struct) @definition.struct ; Enum definitions with variants (enum_item name: (type_identifier) @name.definition.enum body: (enum_variant_list (enum_variant name: (identifier) @name.definition.enum_variant)*)) @definition.enum ; Trait definitions and their methods (trait_item name: (type_identifier) @name.definition.trait body: (declaration_list (function_signature_item name: (identifier) @name.definition.trait_method)*)) @definition.trait ; Impl blocks (inherent implementation) and their methods (impl_item type: (type_identifier) @name.definition.impl body: (declaration_list (function_item name: (identifier) @name.definition.method parameters: (parameters) @parameters.definition.method body: (block) @body.definition.method)*)) @definition.impl ; Trait implementations and their methods (impl_item trait: (type_identifier) @name.definition.impl_trait type: (type_identifier) @name.definition.impl_for body: (declaration_list (function_item name: (identifier) @name.definition.method parameters: (parameters) @parameters.definition.method body: (block) @body.definition.method)*)) @definition.impl_trait ; Module definitions (mod_item name: (identifier) @name.definition.module) @definition.module ; Macro definitions (macro_rules!) (macro_definition name: (identifier) @name.definition.macro) @definition.macro ; Type aliases (type_item name: (type_identifier) @name.definition.type_alias) @definition.type_alias ; Constants (const_item name: (identifier) @name.definition.constant) @definition.constant ; Static items (static_item name: (identifier) @name.definition.static) @definition.static ; Use declarations (imports) (use_declaration) @definition.use_declaration ; Let bindings (local variables) (let_declaration pattern: (identifier) @name.definition.variable) @definition.variable ; Associated functions and methods in impl blocks (impl_item body: (declaration_list)*) @definition.method_container ; Function parameters capture (function_item parameters: (parameters (parameter pattern: (identifier) @name.definition.parameter)*)) ; Associated types in traits (trait_item body: (declaration_list (associated_type name: (type_identifier) @name.definition.associated_type)*)) ; Associated constants in traits and impls (trait_item body: (declaration_list (const_item name: (identifier) @name.definition.trait_constant)*)) (impl_item body: (declaration_list (const_item name: (identifier) @name.definition.impl_constant)*)) `; // ../../../src/services/CT-tree-sitter/queries/ruby.ts var ruby_default = ` ; Method definitions (method name: (identifier) @name.definition.method) @definition.method ; Singleton methods (singleton_method object: (_) name: (identifier) @name.definition.method) @definition.method ; Method aliases (alias name: (_) @name.definition.method) @definition.method ; Class definitions (class name: [ (constant) @name.definition.class (scope_resolution name: (_) @name.definition.class) ]) @definition.class ; Singleton classes (singleton_class value: [ (constant) @name.definition.class (scope_resolution name: (_) @name.definition.class) ]) @definition.class ; Module definitions (module name: [ (constant) @name.definition.module (scope_resolution name: (_) @name.definition.module) ]) @definition.module ; Constants (assignment left: (constant) @name.definition.constant) @definition.constant ; Global variables (global_variable) @definition.global_variable ; Instance variables (instance_variable) @definition.instance_variable ; Class variables (class_variable) @definition.class_variable ; Symbols (simple_symbol) @definition.symbol (hash_key_symbol) @definition.symbol ; Blocks (block) @definition.block (do_block) @definition.block ; Basic mixin statements - capture all include/extend/prepend calls (call method: (identifier) @_mixin_method arguments: (argument_list (constant) @name.definition.mixin) (#match? @_mixin_method "^(include|extend|prepend)$")) @definition.mixin ; Mixin module definition (module name: (constant) @name.definition.mixin_module (#match? @name.definition.mixin_module ".*Module$")) @definition.mixin_module ; Mixin-related methods (method name: (identifier) @name.definition.mixin_method (#match? @name.definition.mixin_method "(included|extended|prepended)_method")) @definition.mixin_method ; Singleton class blocks (singleton_class) @definition.singleton_class ; Class methods in singleton context (singleton_method object: (self) name: (identifier) @name.definition.singleton_method) @definition.singleton_method ; Attribute accessors (call method: (identifier) @_attr_accessor arguments: (argument_list (_) @name.definition.attr_accessor) (#eq? @_attr_accessor "attr_accessor")) @definition.attr_accessor (call method: (identifier) @_attr_reader arguments: (argument_list (_) @name.definition.attr_reader) (#eq? @_attr_reader "attr_reader")) @definition.attr_reader (call method: (identifier) @_attr_writer arguments: (argument_list (_) @name.definition.attr_writer) (#eq? @_attr_writer "attr_writer")) @definition.attr_writer ; Class macros (Rails-like) (call method: (identifier) @_macro_name arguments: (argument_list (_) @name.definition.class_macro) (#match? @_macro_name "^(has_many|belongs_to|has_one|validates|scope|before_action|after_action)$")) @definition.class_macro ; Exception handling (begin) @definition.begin (rescue) @definition.rescue (ensure) @definition.ensure ; Keyword arguments (keyword_parameter name: (identifier) @name.definition.keyword_parameter) @definition.keyword_parameter ; Splat operators (splat_parameter) @definition.splat_parameter (splat_argument) @definition.splat_argument ; Hash syntax variants (pair key: (_) @name.definition.hash_key) @definition.hash_pair ; String interpolation - capture the string with interpolation and surrounding context (assignment left: (identifier) @name.definition.string_var right: (string (interpolation))) @definition.string_interpolation ; Regular expressions - capture the regex pattern and assignment (assignment left: (identifier) @name.definition.regex_var right: (regex)) @definition.regex_assignment ; Pattern matching - capture the entire case_match structure (case_match) @definition.case_match ; Pattern matching - capture in_clause with hash pattern (in_clause pattern: (hash_pattern)) @definition.hash_pattern_clause ; Endless methods - capture the method definition with name and surrounding context (comment) @_endless_method_comment (#match? @_endless_method_comment "Ruby 3.0\\+ endless method") (method name: (identifier) @name.definition.endless_method body: (binary operator: "=")) @definition.endless_method ; Pin operator - capture the entire in_clause with variable_reference_pattern (in_clause pattern: (variable_reference_pattern)) @definition.pin_pattern_clause ; Shorthand hash syntax - capture the method containing shorthand hash (comment) @_shorthand_hash_comment (#match? @_shorthand_hash_comment "Ruby 3.1\\+ shorthand hash syntax") (method name: (identifier) @name.definition.shorthand_method) @definition.shorthand_method ; Shorthand hash syntax - capture the hash with shorthand syntax (hash (pair (hash_key_symbol) ":")) @definition.shorthand_hash ; Capture larger contexts for features that need at least 4 lines ; Capture the entire program to include all comments and code (program) @definition.program ; Capture all comments (comment) @definition.comment ; Capture all method definitions (method) @definition.method_all `; // ../../../src/services/CT-tree-sitter/queries/cpp.ts var cpp_default = ` ; Include directives (preproc_include path: (_) @name.definition.include) @definition.include ; Function definitions (function_definition declarator: (function_declarator declarator: (identifier) @name.definition.function parameters: (parameter_list) @parameters.definition.function) body: (compound_statement) @body.definition.function) @definition.function ; Function declarations (prototypes) (declaration declarator: (function_declarator declarator: (identifier) @name.definition.function parameters: (parameter_list) @parameters.definition.function)) @definition.function ; Struct definitions with fields (struct_specifier name: (type_identifier) @name.definition.struct body: (field_declaration_list) @body.definition.struct) @definition.struct ; Union definitions with fields (union_specifier name: (type_identifier) @name.definition.union body: (field_declaration_list) @body.definition.union) @definition.union ; Enum definitions with values (enum_specifier name: (type_identifier) @name.definition.enum body: (enumerator_list) @body.definition.enum) @definition.enum ; Typedef declarations (type_definition declarator: (type_identifier) @name.definition.type) @definition.type ; Global variables (declaration declarator: (identifier) @name.definition.variable) @definition.variable (declaration declarator: (init_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration declarator: (init_declarator declarator: (array_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (pointer_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration declarator: (pointer_declarator declarator: (pointer_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (init_declarator declarator: (pointer_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (function_declarator declarator: (parenthesized_declarator (pointer_declarator declarator: (identifier) @name.definition.variable)))) @definition.variable (declaration declarator: (array_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration declarator: (array_declarator declarator: (array_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (array_declarator declarator: (array_declarator declarator: (array_declarator declarator: (identifier) @name.definition.variable)))) @definition.variable ; Static variables (declaration (storage_class_specifier) @storage declarator: (identifier) @name.definition.variable) @definition.variable (declaration (storage_class_specifier) @storage declarator: (init_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration (storage_class_specifier) @storage declarator: (array_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration (storage_class_specifier) @storage declarator: (pointer_declarator declarator: (identifier) @name.definition.variable)) @definition.variable ; Object-like macros (preproc_def name: (identifier) @name.definition.macro) @definition.macro ; Function-like macros (preproc_function_def name: (identifier) @name.definition.macro parameters: (preproc_params) @parameters.definition.macro) @definition.macro ; Field declarations (members) (field_declaration declarator: (field_identifier) @name.definition.field) @definition.field ; Enum values/enumerators (enumerator name: (identifier) @name.definition.enumerator) @definition.enumerator ; Parameter declarations (parameter_declaration declarator: (identifier) @name.definition.parameter) @definition.parameter ; C++ specific constructs ; Destructor definitions (function_definition declarator: (function_declarator declarator: (destructor_name) @name.definition.destructor parameters: (parameter_list) @parameters.definition.destructor) body: (compound_statement) @body.definition.destructor) @definition.destructor ; Operator overloading (function_definition declarator: (function_declarator declarator: (operator_name) @name.definition.operator parameters: (parameter_list) @parameters.definition.operator) body: (compound_statement) @body.definition.operator) @definition.operator ; Method definitions (class/struct members) (function_definition declarator: (function_declarator declarator: (field_identifier) @name.definition.method parameters: (parameter_list) @parameters.definition.method) body: (compound_statement) @body.definition.method) @definition.method ; Class definitions (class_specifier name: (type_identifier) @name.definition.class body: (field_declaration_list) @body.definition.class) @definition.class ; Namespace definitions (namespace_definition name: (namespace_identifier) @name.definition.namespace body: (declaration_list) @body.definition.namespace) @definition.namespace ; Template declarations (template_declaration parameters: (template_parameter_list) @parameters.definition.template (class_specifier name: (type_identifier) @name.definition.template.class)) @definition.template ; Template function declarations (template_declaration parameters: (template_parameter_list) @parameters.definition.template (function_definition declarator: (function_declarator declarator: (identifier) @name.definition.template.function))) @definition.template ; Typedef declarations (type_definition declarator: (type_identifier) @name.definition.typedef) @definition.typedef ; Using declarations (using_declaration) @definition.using ; More variable patterns for pointers and references (declaration declarator: (init_declarator declarator: (identifier) @name.definition.variable value: (_))) @definition.variable ; Additional pointer declarator patterns (declaration type: (_) declarator: (pointer_declarator declarator: (identifier) @name.definition.variable)) @definition.variable ; Reference variables (using & in type) (declaration type: (_) declarator: (identifier) @name.definition.variable) @definition.variable `; // ../../../src/services/CT-tree-sitter/queries/c.ts var c_default = ` ; Include directives (preproc_include path: (_) @name.definition.include) @definition.include ; Function definitions (function_definition declarator: (function_declarator declarator: (identifier) @name.definition.function parameters: (parameter_list) @parameters.definition.function) body: (compound_statement) @body.definition.function) @definition.function ; Function declarations (prototypes) (declaration declarator: (function_declarator declarator: (identifier) @name.definition.function parameters: (parameter_list) @parameters.definition.function)) @definition.function ; Struct definitions with fields (struct_specifier name: (type_identifier) @name.definition.struct body: (field_declaration_list) @body.definition.struct) @definition.struct ; Union definitions with fields (union_specifier name: (type_identifier) @name.definition.union body: (field_declaration_list) @body.definition.union) @definition.union ; Enum definitions with values (enum_specifier name: (type_identifier) @name.definition.enum body: (enumerator_list) @body.definition.enum) @definition.enum ; Typedef declarations (type_definition declarator: (type_identifier) @name.definition.type) @definition.type ; Global variables (declaration declarator: (identifier) @name.definition.variable) @definition.variable (declaration declarator: (init_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration declarator: (init_declarator declarator: (array_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (pointer_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration declarator: (pointer_declarator declarator: (pointer_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (init_declarator declarator: (pointer_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (function_declarator declarator: (parenthesized_declarator (pointer_declarator declarator: (identifier) @name.definition.variable)))) @definition.variable (declaration declarator: (array_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration declarator: (array_declarator declarator: (array_declarator declarator: (identifier) @name.definition.variable))) @definition.variable (declaration declarator: (array_declarator declarator: (array_declarator declarator: (array_declarator declarator: (identifier) @name.definition.variable)))) @definition.variable ; Static variables (declaration (storage_class_specifier) @storage declarator: (identifier) @name.definition.variable) @definition.variable (declaration (storage_class_specifier) @storage declarator: (init_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration (storage_class_specifier) @storage declarator: (array_declarator declarator: (identifier) @name.definition.variable)) @definition.variable (declaration (storage_class_specifier) @storage declarator: (pointer_declarator declarator: (identifier) @name.definition.variable)) @definition.variable ; Object-like macros (preproc_def name: (identifier) @name.definition.macro) @definition.macro ; Function-like macros (preproc_function_def name: (identifier) @name.definition.macro parameters: (preproc_params) @parameters.definition.macro) @definition.macro ; Field declarations (members) (field_declaration declarator: (field_identifier) @name.definition.field) @definition.field ; Enum values/enumerators (enumerator name: (identifier) @name.definition.enumerator) @definition.enumerator ; Parameter declarations (parameter_declaration declarator: (identifier) @name.definition.parameter) @definition.parameter `; // ../../../src/services/CT-tree-sitter/queries/c-sharp.ts var c_sharp_default = ` ; Using directives (using_directive) @name.definition.using ; Namespace declarations (including file-scoped) (namespace_declaration name: (identifier) @name.definition.namespace) (file_scoped_namespace_declaration name: (identifier) @name.definition.namespace) ; Class declarations (including generic, static, abstract, partial, nested) (class_declaration name: (identifier) @name.definition.class) ; Interface declarations (interface_declaration name: (identifier) @name.definition.interface) ; Struct declarations (struct_declaration name: (identifier) @name.definition.struct) ; Enum declarations (enum_declaration name: (identifier) @name.definition.enum) ; Record declarations (record_declaration name: (identifier) @name.definition.record) ; Method declarations (including async, static, generic) (method_declaration name: (identifier) @name.definition.method parameter_list: (parameter_list) @parameters.definition.method body: (block) @body.definition.method) @definition.method ; Property declarations (property_declaration name: (identifier) @name.definition.property) ; Event declarations (event_declaration name: (identifier) @name.definition.event) ; Delegate declarations (delegate_declaration name: (identifier) @name.definition.delegate) ; Attribute declarations (class_declaration (attribute_list (attribute name: (identifier) @name.definition.attribute))) ; Generic type parameters (type_parameter_list (type_parameter name: (identifier) @name.definition.type_parameter)) ; LINQ expressions (query_expression) @name.definition.linq_expression `; // ../../../src/services/CT-tree-sitter/queries/go.ts var go_default = ` ; Package declarations (package_clause (package_identifier) @name.definition.package) ; Import declarations (import_declaration (import_spec_list (import_spec path: (_) @name.definition.import))) ; Const declarations (const_declaration) @definition.const (const_declaration (const_spec name: (identifier) @name.definition.const)) ; Var declarations (var_declaration) @definition.var (var_declaration (var_spec name: (identifier) @name.definition.var)) ; Interface declarations (type_declaration) @definition.interface (type_declaration (type_spec name: (type_identifier) @name.definition.interface type: (interface_type))) ; Struct declarations (type_declaration) @definition.struct (type_declaration (type_spec name: (type_identifier) @name.definition.struct type: (struct_type))) ; Type declarations (type_declaration) @definition.type (type_declaration (type_spec name: (type_identifier) @name.definition.type)) ; Function declarations with result (parameter_list) (function_declaration name: (identifier) @name.definition.function parameters: (parameter_list) @parameters.definition.function result: (parameter_list) @result.definition.function body: (block) @body.definition.function) @definition.function ; Function declarations with result (type_identifier) (function_declaration name: (identifier) @name.definition.function parameters: (parameter_list) @parameters.definition.function result: (type_identifier) @result.definition.function body: (block) @body.definition.function) @definition.function ; Function declarations without result (function_declaration name: (identifier) @name.definition.function parameters: (parameter_list) @parameters.definition.function body: (block) @body.definition.function) @definition.function ; Method declarations with result (parameter_list) (method_declaration receiver: (parameter_list (parameter_declaration (pointer_type (type_identifier) @class.definition.method ) ) ) @self.definition.method name: (field_identifier) @name.definition.method parameters: (parameter_list) @parameters.definition.method result: (parameter_list) @result.definition.method body: (block) @body.definition.method) @definition.method ; Method declarations with result (type_identifier) (method_declaration receiver: (parameter_list (parameter_declaration (pointer_type (type_identifier) @class.definition.method ) ) ) @self.definition.method name: (field_identifier) @name.definition.method parameters: (parameter_list) @parameters.definition.method result: (type_identifier) @result.definition.method body: (block) @body.definition.method) @definition.method ; Method declarations without result (method_declaration receiver: (parameter_list (parameter_declaration (pointer_type (type_identifier) @class.definition.method ) ) ) @self.definition.method name: (field_identifier) @name.definition.method parameters: (parameter_list) @parameters.definition.method body: (block) @body.definition.method) @definition.method ; Channel operations (channel_type) @name.definition.channel ; Goroutine declarations (go_statement) @name.definition.goroutine ; Defer statements (defer_statement) @name.definition.defer ; Select statements (select_statement) @name.definition.select `; // ../../../src/services/CT-tree-sitter/queries/swift.ts var swift_default = ` ; Import declarations (import_declaration) @definition.import (import_declaration (identifier) @name.definition.import) ; Class declarations (includes class, struct, enum, extension) (class_declaration) @definition.class ; Class name capture (for class, struct, enum) (class_declaration (type_identifier) @name.definition.class) ; Extension name capture (extension extends user_type) (class_declaration "extension" (user_type (type_identifier) @name.definition.class)) ; Protocol declarations (protocol_declaration (type_identifier) @name.definition.protocol) @definition.protocol ; Function declarations (both methods and global functions) (function_declaration (simple_identifier) @name.definition.method) @definition.method ; Property declarations (all property declarations) (property_declaration (pattern (simple_identifier) @name.definition.property)) @definition.property ; Computed properties (property declarations with computed_property body) (property_declaration (pattern (simple_identifier) @name.definition.computed_property) (computed_property)) @definition.computed_property ; Global variables and constants (property_declaration at top level) (source_file (property_declaration (pattern (simple_identifier) @name.definition.global_var)) @definition.global_var) ; Initializers (init_declaration "init" @name.definition.initializer) @definition.initializer ; Deinitializers (deinit_declaration "deinit" @name.definition.deinitializer) @definition.deinitializer ; Type alias (typealias_declaration (type_identifier) @name.definition.type_alias) @definition.type_alias ; Protocol function declarations (protocol_function_declaration (simple_identifier) @name.definition.protocol_method) @definition.protocol_method `; // ../../../src/services/CT-tree-sitter/queries/kotlin.ts var kotlin_default = ` ; Based on actual tree-sitter-kotlin grammar ; Package declarations (package_header (identifier) @name.definition.package) @definition.package ; Import declarations - capture the full import path including wildcards (import_header) @definition.import (import_header (identifier) @name.definition.import) ; Class declarations (includes all types: class, interface, object, enum, etc.) (class_declaration (type_identifier) @name.definition.class) @definition.class ; Object declarations (try alternative naming) (object_declaration (type_identifier) @name.definition.object) @definition.object ; Function declarations (function_declaration (simple_identifier) @name.definition.function) @definition.function ; Property declarations (property_declaration (variable_declaration (simple_identifier) @name.definition.property) ) @definition.property ; Type alias declarations (type_alias (type_identifier) @name.definition.type_alias) @definition.type_alias `; // ../../../src/services/CT-tree-sitter/queries/css.ts var css_default = ` ; CSS\u89C4\u5219\u96C6\uFF08\u5305\u542B\u6240\u6709\u7C7B\u578B\u7684\u9009\u62E9\u5668\uFF09 (rule_set (selectors) @selectors.definition.rule (block) @body.definition.rule) @definition.rule ; CSS\u58F0\u660E\uFF08\u5C5E\u6027\uFF09- \u5904\u7406\u591A\u79CD\u503C\u7C7B\u578B (declaration (property_name) @property.definition.declaration (plain_value) @value.definition.declaration) @definition.declaration (declaration (property_name) @property.definition.declaration (color_value) @value.definition.declaration) @definition.declaration (declaration (property_name) @property.definition.declaration (integer_value) @value.definition.declaration) @definition.declaration ; @import\u8BED\u53E5 - \u5B57\u7B26\u4E32\u5F62\u5F0F (import_statement (string_value) @name.definition.import) @definition.import ; @import\u8BED\u53E5 - url()\u51FD\u6570\u5F62\u5F0F (import_statement (call_expression (function_name) @func.definition.import (arguments (string_value) @name.definition.import))) @definition.import ; CSS\u51FD\u6570\u8C03\u7528\uFF08\u5728\u58F0\u660E\u503C\u4E2D\uFF09 (declaration (property_name) @property.definition.function (call_expression (function_name) @name.definition.function (arguments) @args.definition.function)) @definition.function ; @keyframes\u52A8\u753B (keyframes_statement (keyframes_name) @name.definition.keyframes (keyframe_block_list) @body.definition.keyframes) @definition.keyframes ; @media\u67E5\u8BE2 - \u652F\u6301\u4E0D\u540C\u7C7B\u578B\u7684\u67E5\u8BE2 (media_statement (binary_query) @query.definition.media (block) @body.definition.media) @definition.media (media_statement (feature_query) @query.definition.media (block) @body.definition.media) @definition.media (media_statement (keyword_query) @query.definition.media (block) @body.definition.media) @definition.media `; // ../../../src/services/CT-tree-sitter/queries/elixir.ts var elixir_default = String.raw` ; Module, Protocol, and Implementation definitions (call target: (identifier) @function (arguments) @args (do_block)? (#match? @function "^(defmodule|defprotocol|defimpl)$")) @definition.module ; Function definitions (call target: (identifier) @function (arguments) @args (do_block)? (#eq? @function "def")) @definition.function ; Macro definitions (call target: (identifier) @function (arguments) @args (do_block)? (#eq? @function "defmacro")) @definition.macro ; Struct definitions (call target: (identifier) @function (arguments (list)) (#eq? @function "defstruct")) @definition.struct ; Guard definitions (call target: (identifier) @function (arguments) @args (#eq? @function "defguard")) @definition.guard ; Behaviour callback definitions (call target: (identifier) @function (arguments) @args (#eq? @function "@callback")) @definition.behaviour ; Sigils (sigil (sigil_name) (quoted_content)) @definition.sigil ; Module attributes (unary_operator operator: "@" operand: (call)) @definition.attribute ; Test definitions with string name and map args (call target: (identifier) @function (arguments (string) (map)) (#eq? @function "test")) @definition.test ; Pipeline operator usage (binary_operator operator: "|>" left: (_) @left right: (_) @right) @definition.pipeline ; For comprehensions with generator and filter clauses (call target: (identifier) @function (arguments) @args (do_block)? (#eq? @function "for")) @definition.for_comprehension`; // ../../../src/services/CT-tree-sitter/queries/html.ts var html_default = ` ; Document structure (document) @definition.document ; Void elements (self-closing) - using explicit element names for better readability ; Area element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "area")) (#not-has? end_tag)) @definition.void_element ; Base element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "base")) (#not-has? end_tag)) @definition.void_element ; Line break element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "br")) (#not-has? end_tag)) @definition.void_element ; Column element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "col")) (#not-has? end_tag)) @definition.void_element ; Embed element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "embed")) (#not-has? end_tag)) @definition.void_element ; Horizontal rule element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "hr")) (#not-has? end_tag)) @definition.void_element ; Image element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "img")) (#not-has? end_tag)) @definition.void_element ; Input element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "input")) (#not-has? end_tag)) @definition.void_element ; Link element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "link")) (#not-has? end_tag)) @definition.void_element ; Meta element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "meta")) (#not-has? end_tag)) @definition.void_element ; Parameter element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "param")) (#not-has? end_tag)) @definition.void_element ; Source element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "source")) (#not-has? end_tag)) @definition.void_element ; Track element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "track")) (#not-has? end_tag)) @definition.void_element ; Word break opportunity element (element (start_tag (tag_name) @name.definition.void (#eq? @name.definition.void "wbr")) (#not-has? end_tag)) @definition.void_element ; Elements with content (exclude script and style) (element (start_tag (tag_name) @name.definition) (#not-eq? @name.definition "script") (#not-eq? @name.definition "style")) @definition.element ; Script elements (script_element (start_tag (tag_name) @name.definition)) @definition.script ; Style elements (style_element (start_tag (tag_name) @name.definition)) @definition.style ; Attributes (attribute (attribute_name) @name.definition) @definition.attribute ; Comments (comment) @definition.comment ; Text content (text) @definition.text ; Raw text content (raw_text) @definition.raw_text ; Self-closing tags (self_closing_tag (tag_name) @name.definition) @definition.self_closing_tag ; Doctype declarations (doctype) @definition.doctype ; Multiple elements (parent with children) (element (element)+) @definition.nested_elements `; // ../../../src/services/CT-tree-sitter/queries/lua.ts var lua_default = String.raw` ; Function definitions (function_definition_statement name: (identifier) @name.definition.function parameters: (parameters) @parameters.definition.function body: (block) @body.definition.function) @definition.function (function_definition_statement name: (variable table: (identifier) field: (identifier) @name.definition.method)) @definition.method (local_function_definition_statement name: (identifier) @name.definition.function) @definition.function ; Table constructors (class-like structures) (local_variable_declaration (variable_list (variable name: (identifier) @name.definition.table)) (expression_list value: (table))) @definition.table ; Variable declarations (variable_assignment (variable_list (variable name: (identifier) @name.definition.variable))) @definition.variable ; Local variable declarations (local_variable_declaration (variable_list (variable name: (identifier) @name.definition.variable))) @definition.variable `; // ../../../src/services/CT-tree-sitter/queries/ocaml.ts var ocamlQuery = ` ; Captures module definitions (module_definition (module_binding name: (module_name) @name.definition)) @definition.module ; Captures type definitions (type_definition (type_binding name: (type_constructor) @name.definition)) @definition.type ; Captures function definitions (value_definition (let_binding pattern: (value_name) @name.definition (parameter))) @definition.function ; Captures class definitions (class_definition (class_binding name: (class_name) @name.definition)) @definition.class ; Captures method definitions (method_definition name: (method_name) @name.definition) @definition.method ; Captures value bindings (value_definition (let_binding pattern: (value_name) @name.definition)) @definition.value `; // ../../../src/services/CT-tree-sitter/queries/toml.ts var tomlQuery = ` ; Tables - capture the entire table node (table) @definition ; Array tables - capture the entire array table node (table_array_element) @definition ; Key-value pairs - capture the entire pair (pair) @definition ; Arrays and inline tables (array) @definition (inline_table) @definition ; Basic values (string) @definition (integer) @definition (float) @definition (boolean) @definition (offset_date_time) @definition (local_date) @definition (local_time) @definition `; // ../../../src/services/CT-tree-sitter/queries/systemrdl.ts var systemrdl_default = ` ; Component declarations (component_named_def type: (component_type) id: (id) @name.definition.component) @definition.component ; Field declarations (component_anon_def type: (component_type (component_primary_type)) body: (component_body (component_body_elem (property_assignment)))) @definition.field ; Property declarations (property_definition (id) @name.definition.property) @definition.property ; Parameter declarations (component_inst id: (id) @name.definition.parameter) @definition.parameter ; Enum declarations (enum_def (id) @name.definition.enum) @definition.enum `; // ../../../src/services/CT-tree-sitter/queries/tlaplus.ts var tlaplus_default = ` ; Module declarations (module name: (identifier) @name.definition.module) @definition.module ; Operator definitions with optional parameters (operator_definition name: (identifier) @name.definition.operator parameter: (identifier)?) @definition.operator ; Function definitions with bounds (function_definition name: (identifier) @name.definition.function (quantifier_bound)?) @definition.function ; Variable declarations (variable_declaration (identifier) @name.definition.variable) @definition.variable ; Constant declarations (constant_declaration (identifier) @name.definition.constant) @definition.constant `; // ../../../src/services/CT-tree-sitter/queries/zig.ts var zigQuery = ` ; Functions (function_declaration) @function.definition ; Structs and containers (variable_declaration (identifier) @name (struct_declaration) ) @container.definition ; Enums (variable_declaration (identifier) @name (enum_declaration) ) @container.definition ; Variables and constants (variable_declaration (identifier) @name ) @variable.definition `; // ../../../src/services/CT-tree-sitter/queries/embedded_template.ts var embedded_template_default = ` ; Code blocks - class, module, method definitions (directive (code) @name.definition.code) @definition.directive ; Output blocks - expressions (output_directive (code) @output.content) @output ; Comments - documentation and section markers (comment_directive (comment) @name.definition.comment) @definition.comment `; // ../../../src/services/CT-tree-sitter/queries/elisp.ts var elispQuery = ` ; Function definitions - capture only name and actual function node ((function_definition name: (symbol) @name.definition.function) @_func (#match? @name.definition.function "^[^;]")) ; Macro definitions - capture only name and actual macro node ((macro_definition name: (symbol) @name.definition.macro) @_macro (#match? @name.definition.macro "^[^;]")) ; Custom forms - match defcustom specifically and avoid comments ((list . (symbol) @_def . (symbol) @name.definition.custom) @_custom (#eq? @_def "defcustom") (#match? @name.definition.custom "^[^;]")) ; Face definitions - match defface specifically and avoid comments ((list . (symbol) @_def . (symbol) @name.definition.face) @_face (#eq? @_def "defface") (#match? @name.definition.face "^[^;]")) ; Group definitions - match defgroup specifically and avoid comments ((list . (symbol) @_def . (symbol) @name.definition.group) @_group (#eq? @_def "defgroup") (#match? @name.definition.group "^[^;]")) ; Advice definitions - match defadvice specifically and avoid comments ((list . (symbol) @_def . (symbol) @name.definition.advice) @_advice (#eq? @_def "defadvice") (#match? @name.definition.advice "^[^;]")) `; // ../../../src/services/CT-tree-sitter/languageParser.ts async function loadLanguage(langName) { return await import_web_tree_sitter.default.Language.load(path.join(__dirname, `tree-sitter-${langName}.wasm`)); } var isParserInitialized = false; async function initializeParser() { if (!isParserInitialized) { await import_web_tree_sitter.default.init(); isParserInitialized = true; } } async function loadRequiredLanguageParsers(filesToParse) { await initializeParser(); const extensionsToLoad = new Set(filesToParse.map((file) => path.extname(file).toLowerCase().slice(1))); const parsers = {}; for (const ext of extensionsToLoad) { let language; let query; let parserKey = ext; switch (ext) { case "js": case "json": language = await loadLanguage("javascript"); query = language.query(javascript_default); break; case "jsx": language = await loadLanguage("javascript"); query = language.query(jsx_default); break; case "ts": language = await loadLanguage("typescript"); query = language.query(typescript_default); break; case "tsx": language = await loadLanguage("tsx"); query = language.query(tsx_default); break; case "py": language = await loadLanguage("python"); query = language.query(python_default); break; case "rs": language = await loadLanguage("rust"); query = language.query(rust_default); break; case "go": language = await loadLanguage("go"); query = language.query(go_default); break; case "cpp": case "hpp": language = await loadLanguage("cpp"); query = language.query(cpp_default); break; case "c": case "h": language = await loadLanguage("c"); query = language.query(c_default); break; case "cs": language = await loadLanguage("c_sharp"); query = language.query(c_sharp_default); break; case "rb": language = await loadLanguage("ruby"); query = language.query(ruby_default); break; case "java": language = await loadLanguage("java"); query = language.query(java_default); break; case "php": language = await loadLanguage("php"); query = language.query(php_default); break; case "swift": language = await loadLanguage("swift"); query = language.query(swift_default); break; case "kt": case "kts": language = await loadLanguage("kotlin"); query = language.query(kotlin_default); break; case "css": language = await loadLanguage("css"); query = language.query(css_default); break; case "html": language = await loadLanguage("html"); query = language.query(html_default); break; case "ml": case "mli": language = await loadLanguage("ocaml"); query = language.query(ocamlQuery); break; case "scala": language = await loadLanguage("scala"); query = language.query(lua_default); break; case "sol": language = await loadLanguage("solidity"); query = language.query(solidityQuery); break; case "toml": language = await loadLanguage("toml"); query = language.query(tomlQuery); break; case "vue": language = await loadLanguage("vue"); query = language.query(vueQuery); break; case "lua": language = await loadLanguage("lua"); query = language.query(lua_default); break; case "rdl": language = await loadLanguage("systemrdl"); query = language.query(systemrdl_default); break; case "tla": language = await loadLanguage("tlaplus"); query = language.query(tlaplus_default); break; case "zig": language = await loadLanguage("zig"); query = language.query(zigQuery); break; case "ejs": case "erb": language = await loadLanguage("embedded_template"); parserKey = "embedded_template"; query = language.query(embedded_template_default); break; case "el": language = await loadLanguage("elisp"); query = language.query(elispQuery); break; case "ex": case "exs": language = await loadLanguage("elixir"); query = language.query(elixir_default); break; default: throw new Error(`Unsupported language: ${ext}`); } const parser = new import_web_tree_sitter.default(); parser.setLanguage(language); parsers[parserKey] = { parser, query }; } return parsers; } // ../autocompletion/v2/utils/processUtils.ts var symbolPairs = { "(": ")", "[": "]", "{": "}", // '<': '>', "'": "'", '"': '"', "`": "`" }; var openSymbols = new Set(Object.keys(symbolPairs)); var closeSymbols = new Set(Object.values(symbolPairs)); function findFirstMatchingCloseSymbol(fullStr, splitStr) { const splitIndex = fullStr.indexOf(splitStr); if (splitIndex === -1) { return { closeSymbol: "", suffixPrefix: "" }; } const partA = fullStr.substring(0, splitIndex); const partB = fullStr.substring(splitIndex + splitStr.length); const stackA = []; for (let i2 = 0; i2 < partA.length; i2++) { const char = partA[i2]; if (char === "\\") { i2++; continue; } if (openSymbols.has(char)) { if ((char === "'" || char === '"' || char === "`") && stackA.length > 0 && stackA[stackA.length - 1] === char) { stackA.pop(); } else { stackA.push(char); } } else if (closeSymbols.has(char)) { if (stackA.length === 0) continue; const lastOpen = stackA[stackA.length - 1]; if (symbolPairs[lastOpen] === char) { stackA.pop(); } } } if (stackA.length === 0) { return { closeSymbol: "", suffixPrefix: "" }; } const lastOpenSymbol = stackA[stackA.length - 1]; const expectedCloseSymbol = symbolPairs[lastOpenSymbol]; const stackB = []; for (let i2 = 0; i2 < partB.length; i2++) { const char = partB[i2]; if (char === "\\") { i2++; continue; } if (stackB.length === 0 && char === expectedCloseSymbol) { return { closeSymbol: char, suffixPrefix: partB.slice(0, i2) }; } if (openSymbols.has(char)) { if ((char === "'" || char === '"' || char === "`") && stackB.length > 0 && stackB[stackB.length - 1] === char) { stackB.pop(); } else { stackB.push(char); } } else if (closeSymbols.has(char)) { if (stackB.length === 0) continue; const lastOpen = stackB[stackB.length - 1]; if (symbolPairs[lastOpen] === char) { stackB.pop(); } } } return { closeSymbol: "", suffixPrefix: "" }; } function findMaxOverlap(str1, str2) { if (str1 === "" || str2 === "") return ""; let maxOverlap = ""; for (let len = Math.min(str1.length, str2.length); len > 0; len--) { const suffix = str1.substring(str1.length - len); const prefix = str2.substring(0, len); if (suffix === prefix) { maxOverlap = suffix; break; } } if (maxOverlap === "") { const str2Trimmed = str2.trimStart(); for (let len = Math.min(str1.length, str2Trimmed.length); len > 0; len--) { const suffix = str1.substring(str1.length - len); const prefix = str2Trimmed.substring(0, len); if (suffix === prefix) { maxOverlap = suffix; break; } } } return maxOverlap; } function getStringBeforeCloseSymbol(str, closeSymbol) { if (!closeSymbols.has(closeSymbol)) { return ""; } const stack = []; let result = ""; for (let i2 = 0; i2 < str.length; i2++) { const char = str[i2]; if (char === "\\") { result += char; if (i2 + 1 < str.length) { result += str[++i2]; } continue; } if (stack.length === 0 && char === closeSymbol) { return result; } if (openSymbols.has(char)) { if ((char === "'" || char === '"' || char === "`") && stack.length > 0 && stack[stack.length - 1] === char) { stack.pop(); } else { stack.push(char); } } else if (closeSymbols.has(char)) { if (stack.length > 0) { const lastOpen = stack[stack.length - 1]; if (symbolPairs[lastOpen] === char) { stack.pop(); } } } result += char; } return result; } function postProcessCompletionSynthesis(completion, prefix, suffix, closeSymbolChar, suffixPrefixString) { if (closeSymbolChar && closeSymbolChar.length > 0) { let cutCompletion = getStringBeforeCloseSymbol(completion, closeSymbolChar); let commonSubstring = findMaxOverlap(cutCompletion, suffixPrefixString); completion = cutCompletion.slice(0, cutCompletion.length - commonSubstring.length); } else { let commonSubstring = findMaxOverlap(completion, suffix); if (commonSubstring.length >= 10) { completion = completion.slice(0, completion.length - commonSubstring.length); } } return completion; } function isInsideWord(prefix, suffix, logCallback) { const charBefore = prefix.length > 0 ? prefix[prefix.length - 1] : ""; const charAfter = suffix.length > 0 ? suffix[0] : ""; const isLetter = (char) => { if (char.length !== 1) return false; const code = char.charCodeAt(0); return code >= 65 && code <= 90 || // A-Z code >= 97 && code <= 122; }; const hasLetterBefore = isLetter(charBefore); const hasLetterAfter = isLetter(charAfter); if (hasLetterBefore && hasLetterAfter) { if (logCallback) { logCallback(`Skipping completion: cursor inside word (${charBefore}|${charAfter})`); } return true; } return false; } // ../autocompletion/v2/capturesProcess/general.ts var import_path = __toESM(require("path")); var import_crypto = __toESM(require("crypto")); // ../autocompletion/v2/Logger.ts var logLevelPriorityMap = { ["DEBUG" /* Debug */]: 0, ["INFO" /* Info */]: 1, ["WARN" /* Warn */]: 2, ["ERROR" /* Error */]: 3 }; var Logger = class _Logger { static _instance = null; prefix = ""; level = "WARN" /* Warn */; constructor(prefix, level) { if (prefix) { this.prefix = prefix; } if (level) { this.level = level; } } static getDefaultLogger() { if (!_Logger._instance) { _Logger._instance = new _Logger(); } return _Logger._instance; } static setDefaultLogger(logger) { _Logger._instance = logger; } debug(message, ...optionalParams) { if (logLevelPriorityMap[this.level] <= logLevelPriorityMap["DEBUG" /* Debug */]) { console.debug(`${this.prefix}${message} ${optionalParams.join(" ")}`); } } info(message, ...optionalParams) { if (logLevelPriorityMap[this.level] <= logLevelPriorityMap["INFO" /* Info */]) { console.log(`${this.prefix}${message} ${optionalParams.join(" ")}`); } } warn(message, ...optionalParams) { if (logLevelPriorityMap[this.level] <= logLevelPriorityMap["WARN" /* Warn */]) { console.warn(`${this.prefix}${message} ${optionalParams.join(" ")}`); } } error(message, ...optionalParams) { if (logLevelPriorityMap[this.level] <= logLevelPriorityMap["ERROR" /* Error */]) { console.error(`${this.prefix}${message} ${optionalParams.join(" ")}`); } } with(prefix) { return new _Logger(this.prefix + prefix + " "); } }; // ../autocompletion/v2/capturesProcess/general.ts function isFunctionNode(node) { const functionTypes = [ "function_declaration", "function_definition", // Go "method_declaration", // Go methods "method_definition", // Class methods "arrow_function", "function_expression" ]; return functionTypes.includes(node.type); } function isClassNode(node) { const classTypes = [ "class_declaration", "class_definition", "interface_declaration", "struct_specifier" // C++ structs ]; return classTypes.includes(node.type); } function findIdentifierInNode(node) { const identifierTypes = /* @__PURE__ */ new Set([ "identifier", "name", "property_identifier", "field_identifier", "method_name", "function_name", "class_name", "type_identifier" ]); for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && identifierTypes.has(child.type)) { return child; } } for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child) { const found = findIdentifierInNode(child); if (found) return found; } } return null; } function isScopeNode(node) { const scopeTypes = /* @__PURE__ */ new Set([ "function_declaration", "method_definition", "arrow_function", "function_expression", "class_declaration", "interface_declaration", "namespace_declaration", "module_declaration", "function_definition", "class_definition" ]); return scopeTypes.has(node.type); } function extractScopeName(node) { const identifierNode = findIdentifierInNode(node); if (identifierNode) { return node.text.substring( identifierNode.startIndex - node.startIndex, identifierNode.endIndex - node.startIndex ); } return node.type; } function generateSnippetHash(filePath, startLine, endLine, rangeText) { const content = `${filePath}:${startLine}-${endLine}:${rangeText.substring(0, 100)}`; return import_crypto.default.createHash("sha256").update(content).digest("hex").substring(0, 16); } function extractSymbolName(node, sourceCode) { const identifierNode = findIdentifierInNode(node); if (identifierNode) { return sourceCode.substring(identifierNode.startIndex, identifierNode.endIndex); } return `${node.type}_${node.startPosition.row + 1}`; } function buildScopeChain(node) { const scope = []; let current = node.parent; while (current) { if (isScopeNode(current)) { const scopeName = extractScopeName(current); if (scopeName) { scope.unshift(scopeName); } } current = current.parent; } return scope; } function determineSnippetTypeFromCapture(capture, allowedTypes) { const captureTypeMap = { import: "import_or_include" /* ImportOrInclude */, "import.statement": "import_or_include" /* ImportOrInclude */, "function.definition": "function_or_method" /* FunctionOrMethod */, "class.definition": "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, "method.definition": "function_or_method" /* FunctionOrMethod */, "variable.definition": "variable_or_constant" /* VariableOrConstant */ }; const mappedType = captureTypeMap[capture.name]; if (mappedType && allowedTypes.includes(mappedType)) { return mappedType; } if (capture.node.type.includes("import") && allowedTypes.includes("import_or_include" /* ImportOrInclude */)) { return "import_or_include" /* ImportOrInclude */; } if (isFunctionNode(capture.node) && allowedTypes.includes("function_or_method" /* FunctionOrMethod */)) { return "function_or_method" /* FunctionOrMethod */; } if (isClassNode(capture.node) && allowedTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { return "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */; } return allowedTypes[0]; } function createSnippetFromQueryCapture(capture, allCaptures, sourceCode, lines, filePath, fileHash, snippetTypes, options, seenHashes) { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const startColumn = node.startPosition.column; const endColumn = node.endPosition.column; const lineCount = endLine - startLine + 1; if (lineCount < Math.max(1, options.minSnippetLines - 2) || lineCount > options.maxSnippetLines * 2) { return null; } const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) { return null; } seenHashes.add(snippetHash); const name2 = extractSymbolName(node, sourceCode); const scope = buildScopeChain(node); const snippetType = determineSnippetTypeFromCapture(capture, snippetTypes); return { name: name2, type: snippetType, filePath, startLine, endLine, startColumn, endColumn, rangeText, scope, fileHash }; } async function extractSnippetsFromCapturesForGeneral(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForGeneral]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); const lines = sourceCode.split("\n"); try { logger.info(`[CodeContext] Starting query execution for: ${import_path.default.basename(filePath)}`); logger.info(`[CodeContext] Query found ${captures.length} captures`); const capturesByType = /* @__PURE__ */ new Map(); captures.forEach((capture) => { const captureType = capture.name; if (!capturesByType.has(captureType)) { capturesByType.set(captureType, []); } capturesByType.get(captureType).push(capture); }); logger.info(`[CodeContext] Capture types found:`, Array.from(capturesByType.keys())); for (const [captureType, captureList] of capturesByType) { logger.info(`[CodeContext] Processing ${captureList.length} ${captureType} captures`); for (const capture of captureList) { const snippet = createSnippetFromQueryCapture( capture, captures, sourceCode, lines, filePath, fileHash, snippetTypes, options, seenHashes ); if (snippet) { snippets.push(snippet); logger.info( `"[CodeContext] Created snippet: ${snippet.name} (${snippet.startLine}-${snippet.endLine}) from ${captureType}` ); } } } logger.info(`[CodeContext] Total snippets extracted: ${snippets.length}`); } catch (error) { logger.error(`[CodeContext] Error executing query:`, error); } return snippets; } // ../autocompletion/v2/capturesProcess/go.ts async function extractSnippetsFromCapturesForGo(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForGo]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } const functionCaptureNames = /* @__PURE__ */ new Set([ "name.definition.function", "name.definition.method", "parameters.definition.function", "body.definition.function", "definition.function" ]); const functionNodeMap = /* @__PURE__ */ new Map(); captures.forEach((capture) => { if (functionCaptureNames.has(capture.name)) { const node = capture.node; const key = `${node.startIndex}:${node.endIndex}`; if (!functionNodeMap.has(key)) { functionNodeMap.set(key, capture); } } }); captures.forEach((capture) => { if (capture.name === "name.definition.import") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) return; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash }); } }); for (const capture of captures) { if (capture.name !== "definition.function" && capture.name !== "definition.method") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const isMethod = capture.name === "definition.method"; const nameCap = captures.find( (c) => c.name === (isMethod ? "name.definition.method" : "name.definition.function") && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const paramCaps = captures.filter( (c) => c.name === (isMethod ? "parameters.definition.method" : "parameters.definition.function") && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = paramCaps.map((paramCap) => ({ name: sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex) })); const bodyCap = captures.find( (c) => c.name === (isMethod ? "body.definition.method" : "body.definition.function") && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let rangeText; let implementText = void 0; if (bodyCap) { rangeText = sourceCode.substring(node.startIndex, bodyCap.node.startIndex).trimEnd(); implementText = sourceCode.substring(node.startIndex, node.endIndex); } else { rangeText = sourceCode.substring(node.startIndex, node.endIndex); } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const resultCap = captures.find( (c) => c.name === (isMethod ? "result.definition.method" : "result.definition.function") && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let returnType = ""; if (resultCap) { returnType = sourceCode.substring(resultCap.node.startIndex, resultCap.node.endIndex).trim(); } const paramStr = parameters.map((p) => p.name).join(", "); const signature = `${name2}(${paramStr})`; const scope = buildScopeChain(node); let field = void 0; if (isMethod) { const selfCap = captures.find( (c) => c.name === "self.definition.method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (selfCap) { const classCap = captures.find( (c) => c.name === "class.definition.method" && c.node.startIndex >= selfCap.node.startIndex && c.node.endIndex <= selfCap.node.endIndex ); if (classCap) { field = sourceCode.substring(classCap.node.startIndex, classCap.node.endIndex); } } } snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, definition: { name: name2, type: node.type, parameters, returnType }, parameters, signature, language: "go" /* Go */, ...implementText ? { implementText } : {} }); } const typeDefs = [ { capture: "name.definition.struct", outlineType: "struct" }, { capture: "name.definition.interface", outlineType: "interface" }, { capture: "name.definition.type", outlineType: "type" } ]; for (const { capture, outlineType } of typeDefs) { const defCaptureName = `definition.${outlineType}`; for (const cap of captures.filter((c) => c.name === capture)) { const node = cap.node; const isInFunc = captures.some( (fc) => (fc.name === "definition.function" || fc.name === "definition.method") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (isInFunc) continue; const defCap = captures.find( (c) => c.name === defCaptureName && c.node.startIndex <= node.startIndex && node.endIndex <= c.node.endIndex ); const rangeText = defCap ? sourceCode.substring(defCap.node.startIndex, defCap.node.endIndex) : sourceCode.substring(node.startIndex, node.endIndex); const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope: [], fileHash, field: "", definition: { name: name2, type: outlineType }, language: "go" /* Go */ }); } } const varDefs = [ { capture: "name.definition.const", outlineType: "const" }, { capture: "name.definition.var", outlineType: "var" } ]; for (const { capture, outlineType } of varDefs) { const defCaptureName = `definition.${outlineType}`; for (const cap of captures.filter((c) => c.name === capture)) { const node = cap.node; const isInFunc = captures.some( (fc) => (fc.name === "definition.function" || fc.name === "definition.method") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (isInFunc) continue; const defCap = captures.find( (c) => c.name === defCaptureName && c.node.startIndex <= node.startIndex && node.endIndex <= c.node.endIndex ); const rangeText = defCap ? sourceCode.substring(defCap.node.startIndex, defCap.node.endIndex) : sourceCode.substring(node.startIndex, node.endIndex); const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope: [], fileHash, field: "", definition: { name: name2, type: outlineType }, language: "go" /* Go */ }); } } return snippets.filter((snippet) => snippetTypes.includes(snippet.type)).sort((a, b) => a.startLine - b.startLine); } function buildSummaryFromSnippets(snippets) { const outline = []; const isGlobal = (s) => !s.scope || s.scope.length === 0 || s.scope.every((x) => !x); for (const s of snippets) { if (!isGlobal(s)) continue; if (s.type === "import_or_include" /* ImportOrInclude */) { outline.push({ type: "import", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } else if (s.type === "function_or_method" /* FunctionOrMethod */) { if (s.field) { outline.push({ type: "method", name: s.name, file: s.filePath, field: s.field, description: s.definitionText }); } else { outline.push({ type: "function", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } } else if (s.type === "variable_or_constant" /* VariableOrConstant */) { const t = s.definition?.type === "const" ? "const" : "var"; outline.push({ type: t, name: s.name, file: s.filePath, field: "", description: s.definitionText }); } else if (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */) { const t = s.definition?.type || "type"; outline.push({ type: t, name: s.name, file: s.filePath, field: "", description: s.definitionText }); } } return outline; } function formatOutlineText(outline) { const groups = {}; for (const entry of outline) { const key = entry.field ?? ""; if (!groups[key]) groups[key] = []; groups[key].push(entry); } let result = ""; for (const field of Object.keys(groups).sort()) { const group = groups[field]; const title = field === "" ? "[global]" : `[${field}]`; result += title + "\n"; for (const entry of group) { let line = ` ${entry.type}`; if (entry.description) line += `: ${entry.description.replace(/\n/g, " ")}`; result += line + "\n"; } result += "\n"; } return result.trimEnd(); } // ../autocompletion/v2/capturesProcess/python.ts async function extractSnippetsFromCapturesForPython(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); const classCaptures = captures.filter((c) => c.name === "definition.class").map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, nameCap: captures.find( (nc) => nc.name === "name.definition.class" && nc.node.startIndex >= c.node.startIndex && nc.node.endIndex <= c.node.endIndex ) })); for (const capture of captures) { if (capture.name !== "definition.function") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const paramCap = captures.find( (c) => c.name === "parameters.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (paramCap) { const paramText = sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex); const cleanParams = paramText.replace(/^\(|\)$/g, "").trim(); if (cleanParams) { const paramList = splitPythonParameters(cleanParams); parameters.push(...paramList.map((param) => ({ name: param }))); } } const bodyCap = captures.find( (c) => c.name === "body.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let definitionText; let implementText = void 0; if (bodyCap) { const functionHeader = sourceCode.substring(node.startIndex, bodyCap.node.startIndex).trimEnd(); definitionText = functionHeader.endsWith(":") ? functionHeader : functionHeader + ":"; implementText = sourceCode.substring(node.startIndex, node.endIndex); } else { definitionText = sourceCode.substring(node.startIndex, node.endIndex); } const rangeText = sourceCode.substring(node.startIndex, node.endIndex); let field = void 0; for (const cls of classCaptures) { if (node.startIndex > cls.start && node.endIndex <= cls.end && cls.nameCap) { field = sourceCode.substring(cls.nameCap.node.startIndex, cls.nameCap.node.endIndex); break; } } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const paramStr = parameters.map((p) => p.name).join(", "); const signature = `${name2}(${paramStr})`; const scope = buildScopeChain(node); let functionType = "function"; const nodeText = sourceCode.substring(node.startIndex, Math.min(node.startIndex + 100, node.endIndex)); if (nodeText.includes("async def")) functionType = "async function"; if (field) functionType = "method"; snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText, scope, fileHash, field, definition: { name: name2, type: functionType, parameters, returnType: "" // Python没有显式返回类型(除非有类型注解) }, parameters, signature, language: "python" /* Python */, ...implementText ? { implementText } : {} }); } for (const capture of captures) { if (capture.name !== "definition.class") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name.definition.class" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, definition: { name: name2, type: "class" }, language: "python" /* Python */ }); } for (const capture of captures) { if (capture.name !== "definition.variable") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const memberVarCaps = captures.filter( (c) => c.name === "name.definition.member_variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const regularVarCaps = captures.filter( (c) => c.name === "name.definition.variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const allVarCaps = [...memberVarCaps, ...regularVarCaps]; if (allVarCaps.length === 0) continue; for (const nameCap of allVarCaps) { const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const isMemberVar = nameCap.name === "name.definition.member_variable"; if (!isMemberVar) { const isInFunction = captures.some( (fc) => fc.name === "definition.function" && fc.node.startIndex < nameCap.node.startIndex && nameCap.node.endIndex < fc.node.endIndex ); if (isInFunction) continue; } const rangeText = sourceCode.substring(node.startIndex, node.endIndex); let field = void 0; for (const cls of classCaptures) { if (nameCap.node.startIndex > cls.start && nameCap.node.endIndex <= cls.end && cls.nameCap) { field = sourceCode.substring(cls.nameCap.node.startIndex, cls.nameCap.node.endIndex); break; } } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText + name2); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(nameCap.node); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, definition: { name: name2, type: field ? "member_variable" : "global_variable" }, language: "python" /* Python */ }); } } const importDefs = captures.filter((c) => c.name === "definition.import"); for (const nameCap of captures.filter((c) => c.name === "name.definition.import")) { const defCap = importDefs.find( (def) => nameCap.node.startIndex >= def.node.startIndex && nameCap.node.endIndex <= def.node.endIndex ); if (!defCap) continue; const node = defCap.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, name2); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, language: "python" /* Python */ }); } return snippets.filter((snippet) => snippetTypes.includes(snippet.type)).sort((a, b) => a.startLine - b.startLine); } function splitPythonParameters(params) { const result = []; let current = ""; let parenDepth = 0; let bracketDepth = 0; let braceDepth = 0; let inString = false; let stringChar = ""; for (let i2 = 0; i2 < params.length; i2++) { const char = params[i2]; const prevChar = i2 > 0 ? params[i2 - 1] : ""; if (!inString && (char === '"' || char === "'" || char === "`")) { inString = true; stringChar = char; } else if (inString && char === stringChar && prevChar !== "\\") { inString = false; stringChar = ""; } if (!inString) { if (char === "(") parenDepth++; else if (char === ")") parenDepth--; else if (char === "[") bracketDepth++; else if (char === "]") bracketDepth--; else if (char === "{") braceDepth++; else if (char === "}") braceDepth--; else if (char === "," && parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) { if (current.trim()) { result.push(current.trim()); } current = ""; continue; } } current += char; } if (current.trim()) { result.push(current.trim()); } return result; } function buildSummaryFromSnippets2(snippets) { const outline = []; for (const s of snippets) { const isTopLevelFunction = s.type === "function_or_method" /* FunctionOrMethod */ && !s.field && (!s.scope || s.scope.length === 0); const isClassOrGlobalVar = (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */ || s.type === "variable_or_constant" /* VariableOrConstant */) && !s.scope?.some((scopeItem) => scopeItem.startsWith("function")); const isMethodOrMemberVar = !!s.field; const isImport = s.type === "import_or_include" /* ImportOrInclude */; if (!(isTopLevelFunction || isClassOrGlobalVar || isMethodOrMemberVar || isImport)) { continue; } if (s.type === "import_or_include" /* ImportOrInclude */) { outline.push({ type: "import", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } else if (s.type === "function_or_method" /* FunctionOrMethod */) { if (s.field) { outline.push({ type: "method", name: s.name, file: s.filePath, field: s.field, description: s.definitionText }); } else { outline.push({ type: "function", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } } else if (s.type === "variable_or_constant" /* VariableOrConstant */) { const t = s.definition?.type === "global_variable" ? "variable" : "member_variable"; const displayName = s.name.startsWith("self.") ? s.name.substring(5) : s.name; outline.push({ type: t, name: displayName, file: s.filePath, field: s.field || "", description: s.definitionText }); } else if (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */) { outline.push({ type: "class", name: s.name, file: s.filePath, field: "", description: s.name }); } } return outline; } function formatOutlineText2(outline) { const groups = {}; for (const entry of outline) { const key = entry.field ?? ""; if (!groups[key]) groups[key] = []; groups[key].push(entry); } let result = ""; for (const field of Object.keys(groups).sort()) { if (groups[field].length === 0) continue; const group = groups[field]; const title = field === "" ? "[global]" : `[${field}]`; result += title + "\n"; for (const entry of group) { let line = ` ${entry.type}`; if (entry.type === "variable" || entry.type === "member_variable") { line += `: ${entry.name}`; } else if (entry.description) { line += `: ${entry.description.replace(/\n/g, " ")}`; } result += line + "\n"; } result += "\n"; } return result.trimEnd(); } // ../autocompletion/v2/capturesProcess/java.ts async function extractSnippetsFromCapturesForJava(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForJava]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } captures.forEach((capture) => { if (capture.name === "name.definition.import") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) return; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash }); } }); for (const capture of captures) { if (capture.name !== "definition.method" && capture.name !== "definition.constructor") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const isConstructor = capture.name === "definition.constructor"; const nameCapName = isConstructor ? "name.definition.constructor" : "name.definition.method"; const paramCapName = isConstructor ? "parameters.definition.constructor" : "parameters.definition.method"; const bodyCapName = isConstructor ? "body.definition.constructor" : "body.definition.method"; const nameCap = captures.find( (c) => c.name === nameCapName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const paramCap = captures.find( (c) => c.name === paramCapName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (paramCap) { const paramText = sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex); const cleanText = paramText.replace(/^\(|\)$/g, "").trim(); if (cleanText) { const paramList = parseJavaParameters(cleanText); parameters.push(...paramList.map((param) => ({ name: param }))); } } const bodyCap = captures.find( (c) => c.name === bodyCapName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let rangeText; let implementText = void 0; if (bodyCap) { rangeText = sourceCode.substring(node.startIndex, bodyCap.node.startIndex).trimEnd(); implementText = sourceCode.substring(node.startIndex, node.endIndex); } else { rangeText = sourceCode.substring(node.startIndex, node.endIndex); } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const paramStr = parameters.map((p) => p.name).join(", "); const signature = `${name2}(${paramStr})`; const scope = buildScopeChain(node); let field = void 0; const parentTypes = ["class", "interface", "enum", "record", "annotation"]; for (const parentType of parentTypes) { const parentCap = captures.find( (c) => c.name === `definition.${parentType}` && c.node.startIndex < node.startIndex && node.endIndex < c.node.endIndex ); if (parentCap) { const parentNameCap = captures.find( (c) => c.name === `name.definition.${parentType}` && c.node.startIndex >= parentCap.node.startIndex && c.node.endIndex <= parentCap.node.endIndex ); if (parentNameCap) { field = sourceCode.substring(parentNameCap.node.startIndex, parentNameCap.node.endIndex); break; } } } snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, definition: { name: name2, type: isConstructor ? "constructor" : "method", parameters, returnType: isConstructor ? "" : "void" // Java 方法默认返回类型 }, parameters, signature, language: "java" /* Java */, ...implementText ? { implementText } : {} }); } const typeDefs = [ { capture: "name.definition.class", outlineType: "class" }, { capture: "name.definition.interface", outlineType: "interface" }, { capture: "name.definition.enum", outlineType: "enum" }, { capture: "name.definition.record", outlineType: "record" }, { capture: "name.definition.annotation", outlineType: "annotation" } ]; for (const { capture, outlineType } of typeDefs) { const defCaptureName = `definition.${outlineType}`; for (const cap of captures.filter((c) => c.name === capture)) { const node = cap.node; const isInMethod = captures.some( (fc) => (fc.name === "definition.method" || fc.name === "definition.constructor") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (isInMethod) continue; const defCap = captures.find( (c) => c.name === defCaptureName && c.node.startIndex <= node.startIndex && node.endIndex <= c.node.endIndex ); const rangeText = defCap ? sourceCode.substring(defCap.node.startIndex, defCap.node.endIndex) : sourceCode.substring(node.startIndex, node.endIndex); const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope: [], fileHash, field: "", definition: { name: name2, type: outlineType }, language: "java" /* Java */ }); } } const fieldNameCaptures = captures.filter((c) => c.name === "name.definition.field"); for (const nameCap of fieldNameCaptures) { const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const fieldCap = captures.find( (c) => c.name === "definition.field" && c.node.startIndex <= nameCap.node.startIndex && nameCap.node.endIndex <= c.node.endIndex ); if (!fieldCap) continue; const node = fieldCap.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const isInMethod = captures.some( (fc) => (fc.name === "definition.method" || fc.name === "definition.constructor") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (isInMethod) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const nameStartLine = nameCap.node.startPosition.row + 1; const nameEndLine = nameCap.node.endPosition.row + 1; const nameRangeText = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const snippetHash = generateSnippetHash(filePath, nameStartLine, nameEndLine, nameRangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); let field = void 0; const parentTypes = ["class", "interface", "enum", "record", "annotation"]; for (const parentType of parentTypes) { const parentCap = captures.find( (c) => c.name === `definition.${parentType}` && c.node.startIndex < node.startIndex && node.endIndex < c.node.endIndex ); if (parentCap) { const parentNameCap = captures.find( (c) => c.name === `name.definition.${parentType}` && c.node.startIndex >= parentCap.node.startIndex && c.node.endIndex <= parentCap.node.endIndex ); if (parentNameCap) { field = sourceCode.substring(parentNameCap.node.startIndex, parentNameCap.node.endIndex); break; } } } const scope = buildScopeChain(node); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope, fileHash, field: field || "", definition: { name: name2, type: "field" }, language: "java" /* Java */ }); } return snippets.filter((snippet) => snippetTypes.includes(snippet.type)).sort((a, b) => a.startLine - b.startLine); } function buildSummaryFromSnippets3(snippets) { const outline = []; const isTopLevel = (s) => { return !s.scope || s.scope.length <= 1; }; for (const s of snippets) { if (!isTopLevel(s)) continue; if (s.type === "import_or_include" /* ImportOrInclude */) { outline.push({ type: "import", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } else if (s.type === "function_or_method" /* FunctionOrMethod */) { if (s.field) { const methodType = s.definition?.type === "constructor" ? "constructor" : "method"; outline.push({ type: methodType, name: s.name, file: s.filePath, field: s.field, description: s.definitionText }); } else { outline.push({ type: "method", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } } else if (s.type === "variable_or_constant" /* VariableOrConstant */) { const fieldType = s.definition?.type === "field" ? "field" : "variable"; const simpleDescription = s.name; outline.push({ type: fieldType, name: s.name, file: s.filePath, field: s.field || "", description: simpleDescription }); } else if (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */) { const t = s.definition?.type || "class"; outline.push({ type: t, name: s.name, file: s.filePath, field: "", description: s.name }); } } return outline; } function formatOutlineText3(outline) { const groups = {}; for (const entry of outline) { const key = entry.field ?? ""; if (!groups[key]) groups[key] = []; groups[key].push(entry); } let result = ""; for (const field of Object.keys(groups).sort()) { const group = groups[field]; const title = field === "" ? "[global]" : `[${field}]`; result += title + "\n"; for (const entry of group) { let line = ` ${entry.type}`; if (entry.description) line += `: ${entry.description.replace(/\n/g, " ")}`; result += line + "\n"; } result += "\n"; } return result.trimEnd(); } function parseJavaParameters(paramText) { if (!paramText.trim()) return []; const params = []; let current = ""; let bracketDepth = 0; let i2 = 0; while (i2 < paramText.length) { const char = paramText[i2]; if (char === "<") { bracketDepth++; current += char; } else if (char === ">") { bracketDepth--; current += char; } else if (char === "," && bracketDepth === 0) { if (current.trim()) { params.push(current.trim()); } current = ""; } else { current += char; } i2++; } if (current.trim()) { params.push(current.trim()); } return params; } // ../autocompletion/v2/capturesProcess/javascript.ts function removeParentheses(text) { let result = text.trim(); if (result.startsWith("(") && result.endsWith(")")) { result = result.slice(1, -1).trim(); } return result; } function removeBrackets(text) { let result = text.trim(); if (result.startsWith("[") && result.endsWith("]")) { result = result.slice(1, -1).trim(); } return result; } function isValidJavaScriptIdentifier(name2) { if (!name2) return false; const firstChar = name2[0]; if (!(firstChar >= "a" && firstChar <= "z") && !(firstChar >= "A" && firstChar <= "Z") && firstChar !== "_" && firstChar !== "$") { return false; } for (let i2 = 1; i2 < name2.length; i2++) { const char = name2[i2]; if (!(char >= "a" && char <= "z") && !(char >= "A" && char <= "Z") && !(char >= "0" && char <= "9") && char !== "_" && char !== "$") { return false; } } return true; } function replaceNewlinesWithSpaces(text) { return text.split("\n").join(" "); } function extractParametersFromMethodText(methodText) { const openParen = methodText.indexOf("("); const closeParen = methodText.lastIndexOf(")"); if (openParen !== -1 && closeParen !== -1 && closeParen > openParen) { return methodText.substring(openParen + 1, closeParen).trim(); } return null; } async function extractSnippetsFromCapturesForJavaScript(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); const classCaptures = captures.filter((c) => c.name === "definition.class").map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, nameCap: captures.find( (nc) => nc.name === "name" && nc.node.startIndex >= c.node.startIndex && nc.node.endIndex <= c.node.endIndex ) })); for (const capture of captures) { if (capture.name !== "definition.function") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => (c.name === "name.definition.function" || c.name === "name") && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const paramCap = captures.find( (c) => c.name === "parameters.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (paramCap) { const paramText = sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex); const cleanParams = removeParentheses(paramText); if (cleanParams) { const paramList = splitJavaScriptParameters(cleanParams); parameters.push(...paramList.map((param) => ({ name: param }))); } } const bodyCap = captures.find( (c) => c.name === "body.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let rangeText; let implementText = void 0; if (bodyCap) { rangeText = sourceCode.substring(node.startIndex, bodyCap.node.startIndex).trimEnd(); implementText = sourceCode.substring(node.startIndex, node.endIndex); } else { rangeText = sourceCode.substring(node.startIndex, node.endIndex); } let field = void 0; for (const cls of classCaptures) { if (node.startIndex > cls.start && node.endIndex < cls.end && cls.nameCap) { field = sourceCode.substring(cls.nameCap.node.startIndex, cls.nameCap.node.endIndex); break; } } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const paramStr = parameters.map((p) => p.name).join(", "); const signature = `${name2}(${paramStr})`; const scope = buildScopeChain(node); let functionType = "function"; const nodeText = sourceCode.substring(node.startIndex, Math.min(node.startIndex + 100, node.endIndex)); if (nodeText.includes("async")) functionType = "async function"; if (nodeText.includes("function*")) functionType = "generator function"; if (nodeText.includes("=>")) functionType = "arrow function"; snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, definition: { name: name2, type: functionType, parameters, returnType: "" // JavaScript doesn't have explicit return types }, parameters, signature, language: "javascript" /* JavaScript */, ...implementText ? { implementText } : {} }); } for (const capture of captures) { if (capture.name !== "definition.method") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const paramCap = captures.find( (c) => c.name === "parameters.definition.method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (paramCap) { const paramText = sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex); const cleanParams = removeParentheses(paramText); if (cleanParams) { const paramList = splitJavaScriptParameters(cleanParams); parameters.push(...paramList.map((param) => ({ name: param }))); } } else { const methodText2 = sourceCode.substring(node.startIndex, node.endIndex); const paramString = extractParametersFromMethodText(methodText2); if (paramString) { const paramList = splitJavaScriptParameters(paramString); parameters.push(...paramList.map((param) => ({ name: param }))); } } let field = void 0; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const paramStr = parameters.map((p) => p.name).join(", "); const signature = `${name2}(${paramStr})`; const scope = buildScopeChain(node); let methodType = "method"; const methodText = sourceCode.substring(node.startIndex, node.endIndex); if (methodText.includes("async")) methodType = "async method"; if (methodText.includes("static")) methodType = "static method"; if (methodText.includes("get ")) methodType = "getter"; if (methodText.includes("set ")) methodType = "setter"; snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, definition: { name: name2, type: methodType, parameters, returnType: "" }, parameters, signature, language: "javascript" /* JavaScript */, implementText: rangeText }); } for (const capture of captures) { if (capture.name !== "definition.class") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name.definition.class" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, definition: { name: name2, type: "class" }, language: "javascript" /* JavaScript */ }); } const allClasses = snippets.filter((s) => s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */); for (const method of snippets) { if (method.type === "function_or_method" /* FunctionOrMethod */ && !method.field) { for (const cls of allClasses) { if (method.startLine >= cls.startLine && method.endLine <= cls.endLine) { method.field = cls.name; break; } } } } for (const capture of captures) { if (capture.name !== "definition.variable") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const arrayPatternCap = captures.find( (c) => c.name === "array_pattern" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (arrayPatternCap) { const arrayPatternText = sourceCode.substring( arrayPatternCap.node.startIndex, arrayPatternCap.node.endIndex ); const variableNames = removeBrackets(arrayPatternText).split(",").map((name3) => name3.trim()).filter((name3) => name3 && isValidJavaScriptIdentifier(name3)); for (const varName of variableNames) { const scope2 = buildScopeChain(node); const isInsideFunction2 = scope2.length > 0 && scope2.some((scopeItem) => { return !allClasses.some((cls) => cls.name === scopeItem); }); if (isInsideFunction2) continue; const rangeText2 = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash2 = generateSnippetHash(filePath, startLine, endLine, `${rangeText2}_${varName}`); if (seenHashes.has(snippetHash2)) continue; seenHashes.add(snippetHash2); let field2 = void 0; let variableType2 = "global_variable"; for (const cls of allClasses) { if (startLine >= cls.startLine && endLine <= cls.endLine) { field2 = cls.name; variableType2 = "member_variable"; break; } } let definitionText2 = varName; if (variableType2 === "global_variable") { definitionText2 = replaceNewlinesWithSpaces(rangeText2).trim(); } snippets.push({ name: varName, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText: rangeText2, definitionText: definitionText2, scope: scope2, fileHash, field: field2, definition: { name: varName, type: variableType2 }, language: "javascript" /* JavaScript */ }); } continue; } const nameCap = captures.find( (c) => c.name === "name.definition.variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ) || captures.find( (c) => c.name === "name.definition.member_variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const scope = buildScopeChain(node); const isMemberVariable = captures.some( (c) => c.name === "name.definition.member_variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex && sourceCode.substring(c.node.startIndex, c.node.endIndex) === name2 ); const isInsideFunction = scope.length > 0 && scope.some((scopeItem) => { return !allClasses.some((cls) => cls.name === scopeItem); }); if (isInsideFunction && !isMemberVariable) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); let field = void 0; let variableType = "global_variable"; for (const cls of allClasses) { if (startLine >= cls.startLine && endLine <= cls.endLine) { field = cls.name; variableType = "member_variable"; break; } } let definitionText = name2; if (variableType === "global_variable") { definitionText = replaceNewlinesWithSpaces(rangeText).trim(); } snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText, scope, fileHash, field, definition: { name: name2, type: variableType }, language: "javascript" /* JavaScript */ }); } return snippets.filter((snippet) => snippetTypes.includes(snippet.type)).sort((a, b) => a.startLine - b.startLine); } function splitJavaScriptParameters(params) { const result = []; let current = ""; let braceDepth = 0; let bracketDepth = 0; let parenDepth = 0; let inString = false; let stringChar = ""; for (let i2 = 0; i2 < params.length; i2++) { const char = params[i2]; const prevChar = i2 > 0 ? params[i2 - 1] : ""; if (!inString && (char === '"' || char === "'" || char === "`")) { inString = true; stringChar = char; } else if (inString && char === stringChar && prevChar !== "\\") { inString = false; stringChar = ""; } if (!inString) { if (char === "{") braceDepth++; else if (char === "}") braceDepth--; else if (char === "[") bracketDepth++; else if (char === "]") bracketDepth--; else if (char === "(") parenDepth++; else if (char === ")") parenDepth--; else if (char === "," && braceDepth === 0 && bracketDepth === 0 && parenDepth === 0) { if (current.trim()) { result.push(current.trim()); } current = ""; continue; } } current += char; } if (current.trim()) { result.push(current.trim()); } return result; } // ../autocompletion/v2/capturesProcess/jsx.ts async function extractSnippetsFromCapturesForJSX(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const jsSnippets = await extractSnippetsFromCapturesForJavaScript( captures, sourceCode, filePath, fileHash, snippetTypes, options ); for (const snippet of jsSnippets) { snippet.language = "jsx" /* JSX */; if (snippet.type === "function_or_method" /* FunctionOrMethod */ && snippet.definition?.type === "function") { snippet.definition.type = "react_component"; if (snippet.parameters && snippet.parameters.length > 0) { const improvedParams = []; for (const param of snippet.parameters) { if (param.name.includes("{") && param.name.includes("}")) { const openBrace = param.name.indexOf("{"); const closeBrace = param.name.indexOf("}"); if (openBrace !== -1 && closeBrace !== -1 && closeBrace > openBrace) { const destructuredContent = param.name.substring(openBrace + 1, closeBrace); const destructuredParams = destructuredContent.split(",").map((p) => { const equalIndex = p.indexOf("="); const cleanParam = equalIndex !== -1 ? p.substring(0, equalIndex).trim() : p.trim(); return cleanParam; }); improvedParams.push(...destructuredParams.map((p) => ({ name: p }))); } } else { improvedParams.push(param); } } snippet.parameters = improvedParams; const paramStr = improvedParams.map((p) => p.name).join(", "); snippet.signature = `${snippet.name}(${paramStr})`; } } else if (snippet.type === "function_or_method" /* FunctionOrMethod */ && snippet.definition?.type === "arrow function") { snippet.definition.type = "react_component"; if (snippet.parameters && snippet.parameters.length > 0) { const improvedParams = []; for (const param of snippet.parameters) { if (param.name.includes("{") && param.name.includes("}")) { const openBrace = param.name.indexOf("{"); const closeBrace = param.name.indexOf("}"); if (openBrace !== -1 && closeBrace !== -1 && closeBrace > openBrace) { const destructuredContent = param.name.substring(openBrace + 1, closeBrace); const destructuredParams = destructuredContent.split(",").map((p) => { const equalIndex = p.indexOf("="); const cleanParam = equalIndex !== -1 ? p.substring(0, equalIndex).trim() : p.trim(); return cleanParam; }); improvedParams.push(...destructuredParams.map((p) => ({ name: p }))); } } else { improvedParams.push(param); } } snippet.parameters = improvedParams; const paramStr = improvedParams.map((p) => p.name).join(", "); snippet.signature = `${snippet.name}(${paramStr})`; } } else if (snippet.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */ && snippet.definition?.type === "class") { snippet.definition.type = "react_class_component"; } else if (snippet.type === "import_or_include" /* ImportOrInclude */ && snippet.definition?.type === "import") { snippet.definition.type = "react_import"; } if (snippet.type === "function_or_method" /* FunctionOrMethod */ && snippet.name.startsWith("use") && snippet.definition?.type === "react_component") { snippet.definition.type = "react_custom_hook"; if (snippet.parameters && snippet.parameters.length > 0) { const improvedParams = []; for (const param of snippet.parameters) { const equalIndex = param.name.indexOf("="); const cleanName = equalIndex !== -1 ? param.name.substring(0, equalIndex).trim() : param.name; improvedParams.push({ name: cleanName }); } snippet.parameters = improvedParams; const paramStr = improvedParams.map((p) => p.name).join(", "); snippet.signature = `${snippet.name}(${paramStr})`; } } } const snippets = [...jsSnippets]; const seenHashes = /* @__PURE__ */ new Set(); for (const snippet of snippets) { const hash = generateSnippetHash(snippet.filePath, snippet.startLine, snippet.endLine, snippet.rangeText); seenHashes.add(hash); } for (const capture of captures) { if (capture.name !== "definition.jsx_element") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name.jsx_element" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const firstChar = name2.charAt(0); if (firstChar < "A" || firstChar > "Z") continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, signature: `<${name2}>`, parameters: [], type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, implementText: rangeText, scope, fileHash, language: "jsx" /* JSX */, definition: { name: name2, type: "jsx_element", parameters: [] } }); } for (const capture of captures) { if (capture.name !== "array_pattern") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const parentNode = node.parent; if (!parentNode || parentNode.type !== "variable_declarator") continue; const valueNode = parentNode.namedChild(1); if (!valueNode || valueNode.type !== "call_expression") continue; const functionNode = valueNode.namedChild(0); if (!functionNode || functionNode.type !== "identifier") continue; const functionName = sourceCode.substring(functionNode.startIndex, functionNode.endIndex); if (functionName !== "useState") continue; const firstIdentifier = node.namedChild(0); const secondIdentifier = node.namedChild(1); if (!firstIdentifier || !secondIdentifier || firstIdentifier.type !== "identifier" || secondIdentifier.type !== "identifier") { continue; } const stateName = sourceCode.substring(firstIdentifier.startIndex, firstIdentifier.endIndex); const setterName = sourceCode.substring(secondIdentifier.startIndex, secondIdentifier.endIndex); const rangeText = sourceCode.substring(parentNode.startIndex, parentNode.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: stateName, signature: `useState()`, parameters: [], type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, implementText: rangeText, scope, fileHash, language: "jsx" /* JSX */, definition: { name: stateName, type: "react_hook", parameters: [] } }); } for (const capture of captures) { if (capture.name !== "name.definition.function") continue; const node = capture.node; const functionName = sourceCode.substring(node.startIndex, node.endIndex); if (!functionName.startsWith("use")) continue; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; let callExpressionNode = node.parent; while (callExpressionNode && callExpressionNode.type !== "call_expression") { callExpressionNode = callExpressionNode.parent; } if (!callExpressionNode) continue; if (functionName === "useState") { let parentNode = callExpressionNode.parent; while (parentNode && parentNode.type !== "variable_declarator") { parentNode = parentNode.parent; } if (parentNode) { const nameNode = parentNode.namedChild(0); if (nameNode && nameNode.type === "array_pattern") { continue; } } } const rangeText = sourceCode.substring(callExpressionNode.startIndex, callExpressionNode.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: functionName, signature: `${functionName}()`, parameters: [], type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, implementText: rangeText, scope, fileHash, language: "jsx" /* JSX */, definition: { name: functionName, type: "react_hook", parameters: [] } }); } for (const capture of captures) { if (capture.name !== "name.definition.variable") continue; const node = capture.node; const variableName = sourceCode.substring(node.startIndex, node.endIndex); let declaratorNode = node.parent; while (declaratorNode && declaratorNode.type !== "variable_declarator") { declaratorNode = declaratorNode.parent; } if (!declaratorNode) continue; const valueNode = declaratorNode.namedChild(1); if (!valueNode || valueNode.type !== "call_expression") continue; const functionNode = valueNode.namedChild(0); if (!functionNode || functionNode.type !== "identifier") continue; const functionName = sourceCode.substring(functionNode.startIndex, functionNode.endIndex); const firstChar = functionName.charAt(0); const isUppercase = firstChar >= "A" && firstChar <= "Z"; const startsWithWith = functionName.startsWith("with"); if (!isUppercase && !startsWithWith) continue; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(declaratorNode.startIndex, declaratorNode.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: variableName, signature: `${functionName}(${variableName})`, parameters: [], type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, implementText: rangeText, scope, fileHash, language: "jsx" /* JSX */, definition: { name: variableName, type: "react_hoc", parameters: [] } }); } return snippets; } function buildSummaryFromSnippets4(snippets) { const outline = []; const isTopLevel = (s) => { return !s.scope || s.scope.length <= 1; }; for (const s of snippets) { if (!isTopLevel(s)) continue; if (s.type === "import_or_include" /* ImportOrInclude */) { continue; } else if (s.type === "function_or_method" /* FunctionOrMethod */) { const definitionType = s.definition?.type; if (definitionType === "react_component") { outline.push({ type: "component", name: s.name, file: s.filePath, field: "", description: s.signature }); } else if (definitionType === "react_custom_hook") { outline.push({ type: "custom_hook", name: s.name, file: s.filePath, field: "", description: s.signature }); } else { outline.push({ type: "function", name: s.name, file: s.filePath, field: s.field || "", description: s.signature }); } } else if (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */) { outline.push({ type: "class", name: s.name, file: s.filePath, field: "", description: s.signature || s.name }); } else if (s.type === "variable_or_constant" /* VariableOrConstant */) { const definitionType = s.definition?.type; if (definitionType === "react_hook") { outline.push({ type: "hook", name: s.name, file: s.filePath, field: "", description: s.signature }); } else if (definitionType === "jsx_element") { outline.push({ type: "jsx_element", name: s.name, file: s.filePath, field: "", description: s.signature }); } else { outline.push({ type: "variable", name: s.name, file: s.filePath, field: s.field || "", description: s.signature || s.name }); } } } return outline; } function formatOutlineText4(outline) { const groups = {}; for (const entry of outline) { const key = entry.type; if (!groups[key]) groups[key] = []; groups[key].push(entry); } let result = ""; const typeOrder = ["component", "class", "custom_hook", "hook", "jsx_element", "function", "variable"]; const typeLabels = { component: "## React Components", class: "## Classes", custom_hook: "## Custom Hooks", hook: "## React Hooks", jsx_element: "## JSX Elements", function: "## Functions", variable: "## Variables" }; for (const type of typeOrder) { const group = groups[type]; if (!group || group.length === 0) continue; result += typeLabels[type] + "\n"; for (const entry of group) { result += `- ${entry.description || entry.name} `; } result += "\n"; } return result; } // ../autocompletion/v2/capturesProcess/typescript.ts async function extractSnippetsFromCapturesForTypeScript(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[TS extract]"); const snippets = []; const seen = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) return snippets; for (const c of captures.filter((c2) => c2.name === "name.import")) { const node = c.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const text = sourceCode.slice(node.startIndex, node.endIndex); const hash = generateSnippetHash(filePath, startLine, endLine, text); if (seen.has(hash)) continue; seen.add(hash); snippets.push({ name: text, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText: text, definitionText: text, scope: buildScopeChain(node), fileHash }); } for (const def of captures.filter((c) => c.name === "definition.function" || c.name === "definition.method")) { const node = def.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === (def.name === "definition.method" ? "name.method" : "name.function") && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.slice(nameCap.node.startIndex, nameCap.node.endIndex); const paramsCap = captures.find( (c) => c.name === "parameters.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (paramsCap) { const raw = sourceCode.slice(paramsCap.node.startIndex, paramsCap.node.endIndex); raw.replace(/^\(|\)$/g, "").split(",").map((p) => p.trim()).filter((p) => p).forEach((p) => parameters.push({ name: p })); } const isMethod = def.name === "definition.method"; let field; if (isMethod) { const classDefCap = captures.find( (c) => c.name === "definition.class" && c.node.startIndex < node.startIndex && c.node.endIndex > node.endIndex ); if (classDefCap) { const classCap = captures.find( (c) => c.name === "name.class" && c.node.startIndex >= classDefCap.node.startIndex && c.node.endIndex <= classDefCap.node.endIndex ); if (classCap) { field = sourceCode.slice(classCap.node.startIndex, classCap.node.endIndex); } } } const sig = `${name2}(${parameters.map((p) => p.name).join(", ")})`; const hash = generateSnippetHash(filePath, startLine, endLine, sig); if (seen.has(hash)) continue; seen.add(hash); snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText: sourceCode.slice(node.startIndex, node.endIndex), definitionText: sig, scope: buildScopeChain(node), fileHash, field, parameters, signature: sig, definition: { name: name2, type: def.name === "definition.method" ? "method" : "function", parameters, returnType: "" }, language: "typescript" /* TypeScript */, implementText: sourceCode.slice(node.startIndex, node.endIndex) }); } const typeDefs = [ { name: "name.class", def: "definition.class", kind: "class", type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */ }, { name: "name.interface", def: "definition.interface", kind: "interface", type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */ }, { name: "name.enum", def: "definition.enum", kind: "enum", type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */ }, { name: "name.type_alias", def: "definition.type_alias", kind: "type", type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */ } ]; for (const { name: capName, def: defName, kind, type } of typeDefs) { for (const c of captures.filter((c2) => c2.name === capName)) { const node = c.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const text = sourceCode.slice(node.startIndex, node.endIndex); const inFunc = captures.some( (fc) => (fc.name === "definition.function" || fc.name === "definition.method") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (inFunc) continue; const defCap = captures.find( (dc) => dc.name === defName && dc.node.startIndex <= node.startIndex && node.endIndex <= dc.node.endIndex ); const defNode = defCap ? defCap.node : node.parent || node; const hash = generateSnippetHash(filePath, startLine, endLine, text); if (seen.has(hash)) continue; seen.add(hash); snippets.push({ name: text, type, filePath, startLine, endLine, rangeText: sourceCode.slice(defNode.startIndex, defNode.endIndex), definitionText: text, implementText: sourceCode.slice(defNode.startIndex, defNode.endIndex), scope: buildScopeChain(node), fileHash, definition: { name: text, type: kind }, language: "typescript" /* TypeScript */, field: "" }); } } for (const c of captures.filter((c2) => c2.name === "name.variable")) { const node = c.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const name2 = sourceCode.slice(node.startIndex, node.endIndex); const inFunc = captures.some( (fc) => (fc.name === "definition.function" || fc.name === "definition.method") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (inFunc) continue; const hash = generateSnippetHash(filePath, startLine, endLine, name2); if (seen.has(hash)) continue; seen.add(hash); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText: sourceCode.slice(node.startIndex, node.endIndex), definitionText: name2, implementText: name2, scope: buildScopeChain(node), fileHash, definition: { name: name2, type: "variable" }, language: "typescript" /* TypeScript */, field: "" }); } for (const c of captures.filter((c2) => c2.name === "name.property")) { const node = c.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const name2 = sourceCode.slice(node.startIndex, node.endIndex); let field; const parentInterface = captures.find( (ic) => ic.name === "definition.interface" && ic.node.startIndex < node.startIndex && ic.node.endIndex > node.endIndex ); const parentClass = captures.find( (cc) => cc.name === "definition.class" && cc.node.startIndex < node.startIndex && cc.node.endIndex > node.endIndex ); if (parentInterface) { const interfaceCap = captures.find( (ic) => ic.name === "name.interface" && ic.node.startIndex >= parentInterface.node.startIndex && ic.node.endIndex <= parentInterface.node.endIndex ); if (interfaceCap) { field = sourceCode.slice(interfaceCap.node.startIndex, interfaceCap.node.endIndex); } } else if (parentClass) { const classCap = captures.find( (cc) => cc.name === "name.class" && cc.node.startIndex >= parentClass.node.startIndex && cc.node.endIndex <= parentClass.node.endIndex ); if (classCap) { field = sourceCode.slice(classCap.node.startIndex, classCap.node.endIndex); } } const hash = generateSnippetHash(filePath, startLine, endLine, name2); if (seen.has(hash)) continue; seen.add(hash); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText: sourceCode.slice(node.startIndex, node.endIndex), definitionText: name2, implementText: name2, scope: buildScopeChain(node), fileHash, field, definition: { name: name2, type: "property" }, language: "typescript" /* TypeScript */ }); } return snippets; } function buildSummaryFromSnippets5(snips) { const outline = []; for (const s of snips) { if (s.type === "import_or_include" /* ImportOrInclude */) { outline.push({ type: "import", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } else if (s.type === "function_or_method" /* FunctionOrMethod */) { outline.push({ type: s.field ? "method" : "function", name: s.name, file: s.filePath, field: s.field || "", description: s.definitionText }); } else if (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */) { outline.push({ type: s.definition?.type || "type", name: s.name, file: s.filePath, field: "", description: s.name }); } else if (s.type === "variable_or_constant" /* VariableOrConstant */) { outline.push({ type: "variable", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } } return outline; } function formatOutlineText5(outline) { const groups = {}; for (const e of outline) { const key = e.field || ""; (groups[key] ||= []).push(e); } let out2 = ""; for (const field of Object.keys(groups).sort()) { out2 += (field ? `[${field}]` : "[global]") + "\n"; for (const e of groups[field]) { out2 += ` ${e.type}: ${e.description} `; } out2 += "\n"; } return out2.trimEnd(); } // ../autocompletion/v2/capturesProcess/tsx.ts function startsWithUppercase(name2) { return name2.length > 0 && name2[0] >= "A" && name2[0] <= "Z"; } function isGenericComponent(rangeText) { return rangeText.includes("function") && rangeText.includes("<") && rangeText.includes(">("); } function cleanParameterName(paramText) { let cleaned = paramText.trim(); const colonIndex = cleaned.indexOf(":"); if (colonIndex !== -1) { cleaned = cleaned.substring(0, colonIndex).trim(); } const equalsIndex = cleaned.indexOf("="); if (equalsIndex !== -1) { cleaned = cleaned.substring(0, equalsIndex).trim(); } if (cleaned.endsWith("?")) { cleaned = cleaned.slice(0, -1).trim(); } return cleaned; } function extractDestructuredParamsFromText(paramText) { const params = []; const openBrace = paramText.indexOf("{"); const closeBrace = paramText.lastIndexOf("}"); if (openBrace !== -1 && closeBrace !== -1 && closeBrace > openBrace) { const destructuredContent = paramText.substring(openBrace + 1, closeBrace); const paramNames = destructuredContent.split(","); for (const param of paramNames) { const cleanName = cleanParameterName(param); if (cleanName && cleanName !== "..." && !cleanName.includes("...")) { params.push(cleanName); } } } return params; } async function extractSnippetsFromCapturesForTSX(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[TSX extract]"); const tsSnippets = await extractSnippetsFromCapturesForTypeScript( captures, sourceCode, filePath, fileHash, snippetTypes, options ); for (const snippet of tsSnippets) { snippet.language = "tsx" /* TSX */; if (snippet.type === "function_or_method" /* FunctionOrMethod */ && snippet.definition?.type === "function") { if (snippet.name.startsWith("use")) { snippet.definition.type = "react_custom_hook"; } else { const isReactComponent = startsWithUppercase(snippet.name) || snippet.rangeText.includes("return") && snippet.rangeText.includes("<") && snippet.rangeText.includes(">"); if (isReactComponent) { if (snippet.rangeText.includes("<") && snippet.rangeText.includes(">(") && isGenericComponent(snippet.rangeText)) { snippet.definition.type = "react_generic_component"; } else { snippet.definition.type = "react_component"; } } } if (snippet.parameters && snippet.parameters.length > 0) { const paramTexts = snippet.parameters.map((p) => p.name.trim()); const fullParamText = paramTexts.join(", "); const improvedParams = []; if (fullParamText.includes("{") && fullParamText.includes("}")) { const destructuredParams = extractDestructuredParamsFromText(fullParamText); improvedParams.push(...destructuredParams.map((p) => ({ name: p }))); } else { for (const param of snippet.parameters) { const paramText = param.name.trim(); const cleanName = cleanParameterName(paramText); if (cleanName && !cleanName.includes("{") && !cleanName.includes("}")) { improvedParams.push({ name: cleanName }); } } } snippet.parameters = improvedParams; const paramStr = improvedParams.map((p) => p.name).join(", "); snippet.signature = `${snippet.name}(${paramStr})`; } else if (!snippet.parameters || snippet.parameters.length === 0) { if (snippet.definition?.parameters && snippet.definition.parameters.length > 0) { const paramTexts = snippet.definition.parameters.map((p) => p.name || ""); const fullParamText = paramTexts.join(", "); const improvedParams = []; if (fullParamText.includes("{") && fullParamText.includes("}")) { const destructuredParams = extractDestructuredParamsFromText(fullParamText); improvedParams.push(...destructuredParams.map((p) => ({ name: p }))); } else { for (const param of snippet.definition.parameters) { const paramText = param.name?.trim() || ""; const cleanName = cleanParameterName(paramText); if (cleanName && !cleanName.includes("{") && !cleanName.includes("}")) { improvedParams.push({ name: cleanName }); } } } snippet.parameters = improvedParams; const paramStr = improvedParams.map((p) => p.name).join(", "); snippet.signature = `${snippet.name}(${paramStr})`; } } } else if (snippet.type === "function_or_method" /* FunctionOrMethod */ && snippet.definition?.type === "method") { } else if (snippet.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */ && snippet.definition?.type === "class") { if (snippet.rangeText.includes("extends") && (snippet.rangeText.includes("Component") || snippet.rangeText.includes("PureComponent"))) { snippet.definition.type = "react_class_component"; } } else if (snippet.type === "import_or_include" /* ImportOrInclude */ && snippet.definition?.type === "import") { snippet.definition.type = "react_import"; } else if (snippet.type === "variable_or_constant" /* VariableOrConstant */ && snippet.definition?.type === "variable") { if (startsWithUppercase(snippet.name)) { const isLikelyComponent = tsSnippets.some( (s) => s.name === snippet.name && s.type === "function_or_method" /* FunctionOrMethod */ && s.definition?.type === "react_component" ) || // 或者检查常见的 React 组件模式 snippet.rangeText.includes("withError") || snippet.rangeText.includes("memo(") || snippet.rangeText.includes("forwardRef(") || snippet.rangeText.includes("lazy(") || snippet.rangeText.includes("React.") || snippet.rangeText.includes("FC") || snippet.rangeText.includes("FunctionComponent") || snippet.rangeText.includes("=>") && snippet.rangeText.includes("<") && snippet.rangeText.includes(">"); if (isLikelyComponent) { snippet.definition.type = "react_component"; snippet.type = "function_or_method" /* FunctionOrMethod */; } } } } const snippets = [...tsSnippets]; const seenHashes = /* @__PURE__ */ new Set(); for (const snippet of snippets) { const hash = generateSnippetHash(snippet.filePath, snippet.startLine, snippet.endLine, snippet.rangeText); seenHashes.add(hash); } for (const capture of captures) { if (capture.name !== "definition.component" && capture.name !== "definition.jsx_element" && capture.name !== "definition.jsx_self_closing_element") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; let nameCap; if (capture.name === "definition.component") { nameCap = captures.find( (c) => c.name === "name" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); } else { nameCap = captures.find( (c) => c.name === "component" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); } if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); if (!startsWithUppercase(name2) && !isKnownReactComponent(name2)) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, signature: `<${name2}>`, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: `<${name2}>`, implementText: rangeText, scope, fileHash, language: "tsx" /* TSX */, definition: { name: name2, type: "jsx_component", parameters: [], returnType: "JSX.Element" } }); } for (const capture of captures) { if (capture.name !== "definition.member_component") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const objectCap = captures.find( (c) => c.name === "object" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const propertyCap = captures.find( (c) => c.name === "property" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!objectCap || !propertyCap) continue; const objectName = sourceCode.substring(objectCap.node.startIndex, objectCap.node.endIndex); const propertyName = sourceCode.substring(propertyCap.node.startIndex, propertyCap.node.endIndex); const fullName = `${objectName}.${propertyName}`; if (!startsWithUppercase(objectName)) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: fullName, signature: `<${fullName}>`, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: `<${fullName}>`, implementText: rangeText, scope, fileHash, field: objectName, language: "tsx" /* TSX */, definition: { name: fullName, type: "jsx_member_component", parameters: [], returnType: "JSX.Element" } }); } for (const capture of captures) { if (capture.name !== "definition.conditional_component") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const componentCap = captures.find( (c) => c.name === "component" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!componentCap) continue; const name2 = sourceCode.substring(componentCap.node.startIndex, componentCap.node.endIndex); if (!startsWithUppercase(name2)) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, signature: `{condition ? <${name2}> : null}`, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: `{condition ? <${name2}> : null}`, implementText: rangeText, scope, fileHash, language: "tsx" /* TSX */, definition: { name: name2, type: "jsx_conditional_component", parameters: [], returnType: "JSX.Element | null" } }); } for (const capture of captures) { if (capture.name !== "definition.generic_component") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const isReactComponent = startsWithUppercase(name2) || sourceCode.substring(node.startIndex, node.endIndex).includes("JSX"); if (!isReactComponent) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, signature: `${name2}`, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: `${name2}`, implementText: rangeText, scope, fileHash, language: "tsx" /* TSX */, definition: { name: name2, type: "react_generic_component", parameters: [], returnType: "JSX.Element" } }); } return snippets; } function isKnownReactComponent(name2) { const knownComponents = [ "Fragment", "Suspense", "StrictMode", "Profiler", "ErrorBoundary", "Provider", "Consumer", "Portal" ]; return knownComponents.includes(name2); } function buildSummaryFromSnippets6(snips) { const outline = []; for (const s of snips) { if (s.type === "import_or_include" /* ImportOrInclude */) { outline.push({ type: "import", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } else if (s.type === "function_or_method" /* FunctionOrMethod */) { let type = "function"; if (s.definition?.type === "react_component") type = "component"; else if (s.definition?.type === "react_custom_hook") type = "hook"; else if (s.definition?.type === "jsx_component") type = "jsx"; else if (s.definition?.type === "jsx_member_component") type = "jsx.member"; else if (s.definition?.type === "jsx_conditional_component") type = "jsx.conditional"; else if (s.definition?.type === "react_generic_component") type = "component.generic"; else if (s.field) type = "method"; outline.push({ type, name: s.name, file: s.filePath, field: s.field || "", description: s.definitionText }); } else if (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */) { let type = s.definition?.type || "type"; if (s.definition?.type === "react_class_component") type = "class.component"; outline.push({ type, name: s.name, file: s.filePath, field: "", description: s.name }); } else if (s.type === "variable_or_constant" /* VariableOrConstant */) { outline.push({ type: "variable", name: s.name, file: s.filePath, field: s.field || "", description: s.definitionText }); } } return outline; } function formatOutlineText6(outline) { const groups = {}; for (const e of outline) { const key = e.field || ""; (groups[key] ||= []).push(e); } let out2 = ""; for (const field of Object.keys(groups).sort()) { out2 += (field ? `[${field}]` : "[global]") + "\n"; for (const e of groups[field]) { out2 += ` ${e.type}: ${e.description} `; } out2 += "\n"; } return out2.trimEnd(); } // ../autocompletion/v2/capturesProcess/swift.ts async function extractSnippetsFromCapturesForSwift(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForSwift]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } const containerCaptures = captures.filter( (c) => c.name === "definition.class" || c.name === "definition.struct" || c.name === "definition.protocol" || c.name === "definition.enum" ).map((c) => { const node = c.node; const type = c.name.split(".")[1]; let nameCap = captures.find( (nc) => nc.name === `name.${c.name}` && nc.node.startIndex >= node.startIndex && nc.node.endIndex <= node.endIndex ); let actualName = nameCap ? sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex) : ""; if (type === "class") { const actualType = determineClassDeclarationType(node, sourceCode); if (actualType === "extension") { if (node.childCount >= 2) { const userTypeNode = node.child(1); if (userTypeNode && userTypeNode.type === "user_type" && userTypeNode.childCount > 0) { const typeIdNode = userTypeNode.child(0); if (typeIdNode && typeIdNode.type === "type_identifier") { actualName = sourceCode.substring(typeIdNode.startIndex, typeIdNode.endIndex); } } } } } return { node, start: node.startIndex, end: node.endIndex, type, nameCap, actualName // 实际的类型名(对于extension是被扩展的类型) }; }); captures.forEach((capture) => { if (capture.name === "name.definition.import") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) return; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash }); } }); for (const capture of captures) { let findParameterNodes = function(node2) { if (node2.type === "parameter") { parameterNodes.push(node2); } for (let i2 = 0; i2 < node2.childCount; i2++) { const child = node2.child(i2); if (child) { findParameterNodes(child); } } }; if (capture.name !== "definition.method" && capture.name !== "definition.initializer" && capture.name !== "definition.deinitializer" && capture.name !== "definition.protocol_method") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; let nameCap; if (capture.name === "definition.method") { nameCap = captures.find( (c) => c.name === "name.definition.method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); } else if (capture.name === "definition.protocol_method") { nameCap = captures.find( (c) => c.name === "name.definition.protocol_method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); } else if (capture.name === "definition.initializer") { nameCap = captures.find( (c) => c.name === "name.definition.initializer" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); } else if (capture.name === "definition.deinitializer") { nameCap = captures.find( (c) => c.name === "name.definition.deinitializer" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); } if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const parameters = []; let parameterNodes = []; findParameterNodes(node); for (const paramNode of parameterNodes) { let paramName = ""; for (let i2 = 0; i2 < paramNode.childCount; i2++) { const child = paramNode.child(i2); if (child && child.type === "simple_identifier") { paramName = sourceCode.substring(child.startIndex, child.endIndex); break; } } if (paramName) { parameters.push({ name: paramName, type: "Any" // 暂时使用占位符类型 }); } } const bodyCap = captures.find( (c) => c.name === "body.definition.method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let rangeText; let implementText = void 0; if (bodyCap) { rangeText = sourceCode.substring(node.startIndex, bodyCap.node.startIndex).trimEnd(); implementText = sourceCode.substring(node.startIndex, node.endIndex); } else { rangeText = sourceCode.substring(node.startIndex, node.endIndex); } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); let returnType = ""; const paramStr = parameters.map((p) => p.name).join(", "); const signature = `${name2}(${paramStr})`; const scope = buildScopeChain(node); let field = void 0; let closestContainer = void 0; for (const container of containerCaptures) { if (node.startIndex > container.start && node.endIndex <= container.end) { if (!closestContainer || container.end - container.start < closestContainer.end - closestContainer.start) { closestContainer = container; } } } if (closestContainer) { field = closestContainer.actualName || (closestContainer.nameCap ? sourceCode.substring( closestContainer.nameCap.node.startIndex, closestContainer.nameCap.node.endIndex ) : void 0); } snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, definition: { name: name2, type: node.type, parameters, returnType }, parameters, signature, language: "swift" /* Swift */, ...implementText ? { implementText } : {} }); } for (const capture of captures) { if (capture.name !== "definition.property" && capture.name !== "definition.computed_property") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nodeHash = `${node.startIndex}-${node.endIndex}`; const isAlreadyProcessed = snippets.some( (s) => s.rangeText === sourceCode.substring(node.startIndex, node.endIndex) && s.startLine === startLine ); if (isAlreadyProcessed) continue; let nameCap; let isComputedProperty = false; nameCap = captures.find( (c) => c.name === "name.definition.computed_property" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (nameCap) { isComputedProperty = true; } else { nameCap = captures.find( (c) => c.name === "name.definition.property" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); } if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const isInContainer = containerCaptures.some( (container) => node.startIndex > container.start && node.endIndex <= container.end ); if (!isInContainer) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); let field = void 0; let closestContainer = void 0; for (const container of containerCaptures) { if (node.startIndex > container.start && node.endIndex <= container.end) { if (!closestContainer || container.end - container.start < closestContainer.end - closestContainer.start) { closestContainer = container; } } } if (closestContainer) { field = closestContainer.actualName || (closestContainer.nameCap ? sourceCode.substring( closestContainer.nameCap.node.startIndex, closestContainer.nameCap.node.endIndex ) : void 0); } snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope, fileHash, field, definition: { name: name2, type: isComputedProperty ? "computed_property" : "property" }, language: "swift" /* Swift */ }); } for (const capture of captures) { if (capture.name !== "definition.global_var") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name.definition.global_var" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); let varType = "var"; if (rangeText.trim().startsWith("let")) { varType = "let"; } snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope, fileHash, field: "", definition: { name: name2, type: varType }, language: "swift" /* Swift */ }); } const typeDefs = [ { capture: "name.definition.class", outlineType: "class" }, { capture: "name.definition.protocol", outlineType: "protocol" }, { capture: "name.definition.type_alias", outlineType: "typealias" } ]; for (const { capture, outlineType } of typeDefs) { const defCaptureName = `definition.${outlineType === "typealias" ? "type_alias" : outlineType}`; for (const cap of captures.filter((c) => c.name === capture)) { const node = cap.node; const isInFunc = captures.some( (fc) => (fc.name === "definition.method" || fc.name === "definition.initializer" || fc.name === "definition.deinitializer") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (isInFunc) continue; let defCap = captures.filter( (c) => c.name === defCaptureName && c.node.startIndex <= node.startIndex && node.endIndex <= c.node.endIndex ).sort((a, b) => a.node.endIndex - a.node.startIndex - (b.node.endIndex - b.node.startIndex))[0]; const rangeText = defCap ? sourceCode.substring(defCap.node.startIndex, defCap.node.endIndex) : sourceCode.substring(node.startIndex, node.endIndex); let actualType = outlineType; if (outlineType === "class" && defCap) { actualType = determineClassDeclarationType(defCap.node, sourceCode); } const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope: [], fileHash, field: "", definition: { name: name2, type: actualType }, language: "swift" /* Swift */ }); } } return snippets.filter((snippet) => snippetTypes.includes(snippet.type)).sort((a, b) => a.startLine - b.startLine); } function normalizeTextForSummary(text) { return text.split("\n").join(" "); } function determineClassDeclarationType(node, sourceCode) { if (node.childCount > 0) { const firstChild = node.child(0); if (firstChild) { const firstChildType = firstChild.type; if (firstChildType === "struct") return "struct"; if (firstChildType === "enum") return "enum"; if (firstChildType === "class") return "class"; if (firstChildType === "extension") return "extension"; } } return "class"; } function buildSummaryFromSnippets7(snippets) { const outline = []; const isGlobal = (s) => !s.scope || s.scope.length === 0 || s.scope.every((x) => !x); for (const s of snippets) { if (!isGlobal(s)) continue; if (s.type === "import_or_include" /* ImportOrInclude */) { outline.push({ type: "import", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } else if (s.type === "function_or_method" /* FunctionOrMethod */) { if (s.field) { outline.push({ type: "method", name: s.name, file: s.filePath, field: s.field, description: s.definitionText }); } else { outline.push({ type: "function", name: s.name, file: s.filePath, field: "", description: s.definitionText }); } } else if (s.type === "variable_or_constant" /* VariableOrConstant */) { const t = s.definition?.type || "var"; outline.push({ type: t, name: s.name, file: s.filePath, field: s.field || "", description: s.definitionText }); } else if (s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */) { const t = s.definition?.type || "type"; outline.push({ type: t, name: s.name, file: s.filePath, field: "", description: s.name }); } } return outline; } function formatOutlineText7(outline) { const groups = {}; for (const entry of outline) { const key = entry.field ?? ""; if (!groups[key]) groups[key] = []; groups[key].push(entry); } let result = ""; for (const field of Object.keys(groups).sort()) { const group = groups[field]; const title = field === "" ? "[global]" : `[${field}]`; result += title + "\n"; for (const entry of group) { let line = ` ${entry.type}`; if (entry.description) line += `: ${normalizeTextForSummary(entry.description)}`; result += line + "\n"; } result += "\n"; } return result.trimEnd(); } // ../autocompletion/v2/capturesProcess/css.ts function extractSelectorName(selectorsNode, sourceCode) { function findSelectorName(node) { if (node.type === "class_selector") { const classNameNode = findChildByType(node, "class_name"); if (classNameNode) { return getNodeText(classNameNode, sourceCode); } } if (node.type === "id_selector") { const idNameNode = findChildByType(node, "id_name"); if (idNameNode) { return getNodeText(idNameNode, sourceCode); } } if (node.type === "tag_name") { return getNodeText(node, sourceCode); } if (node.type === "pseudo_class_selector" || node.type === "pseudo_element_selector") { const nameNode = findChildByType(node, "class_name") || findChildByType(node, "tag_name"); if (nameNode) { return getNodeText(nameNode, sourceCode); } } for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child) { const name3 = findSelectorName(child); if (name3) return name3; } } return null; } const name2 = findSelectorName(selectorsNode); if (name2) return name2; const selectorText = getNodeText(selectorsNode, sourceCode).trim(); let firstSelector = selectorText; const separators = [" ", ",", ">", "+", "~"]; for (const sep of separators) { const index2 = firstSelector.indexOf(sep); if (index2 >= 0) { firstSelector = firstSelector.substring(0, index2); } } if (firstSelector.startsWith(".")) return firstSelector.substring(1); if (firstSelector.startsWith("#")) return firstSelector.substring(1); return firstSelector || "selector"; } function isCSSVariable(propertyName) { return propertyName.startsWith("--"); } function getNodeText(node, sourceCode) { return sourceCode.substring(node.startIndex, node.endIndex); } function findChildByType(node, type) { for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && child.type === type) { return child; } } return null; } async function extractSnippetsFromCapturesForCSS(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForCSS]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } for (const capture of captures) { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = getNodeText(node, sourceCode); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); if (capture.name === "definition.rule" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const selectorsCapture = captures.find( (c) => c.name === "selectors.definition.rule" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (selectorsCapture) { let findSelectorType = function(node2) { if (node2.type === "class_selector") return "class_selector"; if (node2.type === "id_selector") return "id_selector"; if (node2.type === "tag_name") return "tag_selector"; if (node2.type === "pseudo_class_selector" || node2.type === "pseudo_element_selector") return "pseudo_selector"; for (let i2 = 0; i2 < node2.childCount; i2++) { const child = node2.child(i2); if (child) { const type = findSelectorType(child); if (type !== "selector") return type; } } return "selector"; }; const selectorText = getNodeText(selectorsCapture.node, sourceCode); const selectorName = extractSelectorName(selectorsCapture.node, sourceCode); let definitionType = "selector"; definitionType = findSelectorType(selectorsCapture.node); snippets.push({ name: selectorName, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "css" /* CSS */, definition: { name: selectorName, type: definitionType }, definitionText: rangeText, signature: selectorName, scope: buildScopeChain(node) }); } } else if (capture.name === "definition.import" && snippetTypes.includes("import_or_include" /* ImportOrInclude */)) { const nameCapture = captures.find( (c) => c.name === "name.definition.import" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let importName = "import"; if (nameCapture) { let rawName = getNodeText(nameCapture.node, sourceCode); if (rawName.startsWith('"') && rawName.endsWith('"')) { rawName = rawName.slice(1, -1); } else if (rawName.startsWith("'") && rawName.endsWith("'")) { rawName = rawName.slice(1, -1); } importName = rawName; } snippets.push({ name: importName, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, fileHash, language: "css" /* CSS */, definitionText: rangeText, signature: `@import "${importName}"`, scope: buildScopeChain(node) }); } else if (capture.name === "definition.keyframes" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const nameCapture = captures.find( (c) => c.name === "name.definition.keyframes" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let keyframesName = "animation"; if (nameCapture) { keyframesName = getNodeText(nameCapture.node, sourceCode); } snippets.push({ name: keyframesName, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "css" /* CSS */, definition: { name: keyframesName, type: "keyframes" }, definitionText: rangeText, signature: keyframesName, scope: buildScopeChain(node) }); } else if (capture.name === "definition.media" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const queryCapture = captures.find( (c) => c.name === "query.definition.media" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let mediaName = "media"; if (queryCapture) { mediaName = getNodeText(queryCapture.node, sourceCode).trim(); } snippets.push({ name: mediaName, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "css" /* CSS */, definition: { name: mediaName, type: "media" }, definitionText: rangeText, signature: `@media ${mediaName}`, scope: buildScopeChain(node) }); } else if (capture.name === "definition.function" && snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const nameCapture = captures.find( (c) => c.name === "name.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (nameCapture) { const functionName = getNodeText(nameCapture.node, sourceCode); const argsCapture = captures.find( (c) => c.name === "args.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (argsCapture) { const argsText = getNodeText(argsCapture.node, sourceCode); const args2 = argsText.split(",").map((arg) => arg.trim()).filter((arg) => arg.length > 0); parameters.push(...args2.map((arg) => ({ name: arg }))); } const signature = parameters.length > 0 ? `${functionName}(${parameters.map((p) => p.name).join(", ")})` : `${functionName}()`; snippets.push({ name: functionName, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, fileHash, language: "css" /* CSS */, parameters, definition: { name: functionName, type: "function", parameters }, definitionText: rangeText, signature, scope: buildScopeChain(node) }); } } else if (capture.name === "definition.declaration" && snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const propertyCapture = captures.find( (c) => c.name === "property.definition.declaration" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (propertyCapture) { const propertyName = getNodeText(propertyCapture.node, sourceCode); if (isCSSVariable(propertyName)) { const valueCapture = captures.find( (c) => c.name === "value.definition.declaration" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let propertyValue = ""; if (valueCapture) { propertyValue = getNodeText(valueCapture.node, sourceCode); } snippets.push({ name: propertyName, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, fileHash, language: "css" /* CSS */, definition: { name: propertyName, type: "css_variable" }, definitionText: `${propertyName}: ${propertyValue};`, signature: `${propertyName}: ${propertyValue}`, scope: buildScopeChain(node) }); } } } } logger.info(`Extracted ${snippets.length} CSS snippets`); return snippets; } function buildSummaryFromSnippets8(snippets) { const selectors = []; const variables = []; const functions = []; const atRules = []; const imports = []; for (const snippet of snippets) { switch (snippet.type) { case "import_or_include" /* ImportOrInclude */: imports.push(snippet); break; case "function_or_method" /* FunctionOrMethod */: functions.push(snippet); break; case "variable_or_constant" /* VariableOrConstant */: variables.push(snippet); break; case "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */: if (snippet.definition?.type?.includes("selector")) { selectors.push(snippet); } else { atRules.push(snippet); } break; } } return { selectors, variables, functions, atRules, imports }; } function formatOutlineText8(summary) { let outline = "CSS File Overview:\n\n"; if (summary.imports.length > 0) { outline += "Imports:\n"; for (const imp of summary.imports) { outline += ` - ${imp.signature} `; } outline += "\n"; } if (summary.variables.length > 0) { outline += "CSS Variables & Properties:\n"; for (const variable of summary.variables) { outline += ` - ${variable.signature} `; } outline += "\n"; } if (summary.selectors.length > 0) { outline += "Selectors:\n"; for (const selector of summary.selectors) { const type = selector.definition?.type || "selector"; outline += ` - ${selector.name} (${type}) `; } outline += "\n"; } if (summary.functions.length > 0) { outline += "CSS Functions:\n"; for (const func2 of summary.functions) { outline += ` - ${func2.signature} `; } outline += "\n"; } if (summary.atRules.length > 0) { outline += "At-Rules:\n"; for (const rule of summary.atRules) { outline += ` - @${rule.definition?.type}: ${rule.name} `; } outline += "\n"; } return outline.trim(); } // ../autocompletion/v2/capturesProcess/html.ts function escapeNewlinesForLogging(text) { return text.split("\n").join("\\n"); } function formatTypeLabel(type) { return type.split("_").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" "); } function getNodeText2(node, sourceCode) { return sourceCode.substring(node.startIndex, node.endIndex); } function findChildByType2(node, type) { for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && child.type === type) { return child; } } return null; } function findChildByTypeRecursive(node, type) { if (node.type === type) { return node; } for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child) { const found = findChildByTypeRecursive(child, type); if (found) return found; } } return null; } function extractTagName(node, sourceCode) { const tagNameNode = findChildByTypeRecursive(node, "tag_name"); if (tagNameNode) { return getNodeText2(tagNameNode, sourceCode); } return "element"; } function extractAttributeInfo(node, sourceCode) { const attributeNameNode = findChildByType2(node, "attribute_name"); const attributeValueNode = findChildByType2(node, "attribute_value") || findChildByType2(node, "quoted_attribute_value"); const name2 = attributeNameNode ? getNodeText2(attributeNameNode, sourceCode) : "attribute"; let value; if (attributeValueNode) { let rawValue = getNodeText2(attributeValueNode, sourceCode); if (rawValue.startsWith('"') && rawValue.endsWith('"') || rawValue.startsWith("'") && rawValue.endsWith("'")) { rawValue = rawValue.slice(1, -1); } value = rawValue; } return { name: name2, value }; } function isSemanticElement(tagName) { const semanticTags = /* @__PURE__ */ new Set([ "header", "nav", "main", "section", "article", "aside", "footer", "figure", "figcaption", "details", "summary", "mark", "time" ]); return semanticTags.has(tagName.toLowerCase()); } function isInteractiveElement(tagName) { const interactiveTags = /* @__PURE__ */ new Set(["button", "input", "select", "textarea", "a", "form"]); return interactiveTags.has(tagName.toLowerCase()); } async function extractSnippetsFromCapturesForHTML(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForHTML]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } for (const capture of captures) { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = getNodeText2(node, sourceCode); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText) + "_" + capture.name; if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); logger.info(`Processing capture: ${capture.name} -> "${escapeNewlinesForLogging(rangeText)}"`); if (capture.name === "definition.doctype" && snippetTypes.includes("import_or_include" /* ImportOrInclude */)) { snippets.push({ name: "DOCTYPE", type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: "DOCTYPE", type: "doctype" }, definitionText: rangeText, signature: "DOCTYPE html", scope: buildScopeChain(node) }); } else if (capture.name === "definition.document" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { snippets.push({ name: "document", type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: "document", type: "document" }, definitionText: rangeText, signature: "HTML Document", scope: buildScopeChain(node) }); } else if (capture.name === "definition.element" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const nameCapture = captures.find( (c) => c.name === "name.definition" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const elementName = nameCapture ? getNodeText2(nameCapture.node, sourceCode) : extractTagName(node, sourceCode); let elementType = "element"; if (isSemanticElement(elementName)) { elementType = "semantic_element"; } else if (isInteractiveElement(elementName)) { elementType = "interactive_element"; } snippets.push({ name: elementName, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: elementName, type: elementType }, definitionText: rangeText, signature: `<${elementName}>`, scope: buildScopeChain(node) }); } else if (capture.name === "definition.script" && snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const nameCapture = captures.find( (c) => c.name === "name.definition" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const scriptName = nameCapture ? getNodeText2(nameCapture.node, sourceCode) : "script"; snippets.push({ name: scriptName, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: scriptName, type: "script" }, definitionText: rangeText, signature: `<${scriptName}>`, scope: buildScopeChain(node) }); } else if (capture.name === "definition.style" && snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const nameCapture = captures.find( (c) => c.name === "name.definition" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const styleName = nameCapture ? getNodeText2(nameCapture.node, sourceCode) : "style"; snippets.push({ name: styleName, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: styleName, type: "style" }, definitionText: rangeText, signature: `<${styleName}>`, scope: buildScopeChain(node) }); } else if (capture.name === "definition.void_element" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const nameCapture = captures.find( (c) => c.name === "name.definition.void" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const elementName = nameCapture ? getNodeText2(nameCapture.node, sourceCode) : extractTagName(node, sourceCode); let elementType = "void_element"; if (isInteractiveElement(elementName)) { elementType = "interactive_element"; } else if (isSemanticElement(elementName)) { elementType = "semantic_element"; } snippets.push({ name: elementName, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: elementName, type: elementType }, definitionText: rangeText, signature: elementType === "void_element" ? `<${elementName} />` : `<${elementName}>`, scope: buildScopeChain(node) }); } else if (capture.name === "definition.self_closing_tag" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const nameCapture = captures.find( (c) => c.name === "name.definition" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const tagName = nameCapture ? getNodeText2(nameCapture.node, sourceCode) : "self_closing_tag"; snippets.push({ name: tagName, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: tagName, type: "self_closing_tag" }, definitionText: rangeText, signature: `<${tagName} />`, scope: buildScopeChain(node) }); } else if (capture.name === "definition.attribute" && snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const nameCapture = captures.find( (c) => c.name === "name.definition" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (nameCapture) { const attributeInfo = extractAttributeInfo(node, sourceCode); const attributeName = attributeInfo.name; let attributeType = "attribute"; if (attributeName.startsWith("data-")) { attributeType = "data_attribute"; } else if (attributeName.startsWith("aria-")) { attributeType = "aria_attribute"; } else if (["id", "class"].includes(attributeName)) { attributeType = "core_attribute"; } const signature = attributeInfo.value ? `${attributeName}="${attributeInfo.value}"` : attributeName; snippets.push({ name: attributeName, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: attributeName, type: attributeType }, definitionText: rangeText, signature, scope: buildScopeChain(node) }); } } else if (capture.name === "definition.comment" && snippetTypes.includes("import_or_include" /* ImportOrInclude */)) { let commentText = rangeText.trim(); if (commentText.startsWith("")) { commentText = commentText.slice(4, -3).trim(); } const firstLine = commentText.split("\n")[0].trim(); const commentName = firstLine.length > 0 ? firstLine : "comment"; snippets.push({ name: commentName, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: commentName, type: "comment" }, definitionText: rangeText, signature: ``, scope: buildScopeChain(node) }); } else if (capture.name === "definition.text" && snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const lineCount = endLine - startLine + 1; if (lineCount >= options.minSnippetLines) { const textContent = rangeText.trim(); const firstLine = textContent.split("\n")[0].trim(); const textName = firstLine.length > 0 ? firstLine : "text"; snippets.push({ name: textName, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: textName, type: "text" }, definitionText: rangeText, signature: textName, scope: buildScopeChain(node) }); } } else if (capture.name === "definition.raw_text" && snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const lineCount = endLine - startLine + 1; if (lineCount >= options.minSnippetLines) { const textContent = rangeText.trim(); const firstLine = textContent.split("\n")[0].trim(); const rawTextName = firstLine.length > 0 ? firstLine : "raw_text"; snippets.push({ name: rawTextName, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: rawTextName, type: "raw_text" }, definitionText: rangeText, signature: rawTextName, scope: buildScopeChain(node) }); } } else if (capture.name === "definition.nested_elements" && snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const tagName = extractTagName(node, sourceCode); snippets.push({ name: `${tagName}_container`, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, fileHash, language: "html" /* HTML */, definition: { name: `${tagName}_container`, type: "nested_elements" }, definitionText: rangeText, signature: `<${tagName}> (with children)`, scope: buildScopeChain(node) }); } } logger.info(`[CodeContext] Extracted ${snippets.length} HTML snippets`); return snippets; } function buildSummaryFromSnippets9(snippets) { const summary = { doctypes: [], elements: [], attributes: [], scripts: [], styles: [], comments: [], textContent: [] }; for (const snippet of snippets) { const defType = snippet.definition?.type || ""; switch (defType) { case "doctype": summary.doctypes.push(snippet); break; case "element": case "semantic_element": case "interactive_element": case "void_element": case "self_closing_tag": case "nested_elements": summary.elements.push(snippet); break; case "attribute": case "data_attribute": case "aria_attribute": case "core_attribute": summary.attributes.push(snippet); break; case "script": summary.scripts.push(snippet); break; case "style": summary.styles.push(snippet); break; case "comment": summary.comments.push(snippet); break; case "text": case "raw_text": summary.textContent.push(snippet); break; } } return summary; } function formatOutlineText9(summary) { const lines = []; if (summary.doctypes.length > 0) { lines.push("## Document Type"); summary.doctypes.forEach((snippet) => { lines.push(`- ${snippet.signature || snippet.name}`); }); lines.push(""); } if (summary.elements.length > 0) { lines.push("## HTML Elements"); summary.elements.forEach((snippet) => { const typeSuffix = snippet.definition?.type === "semantic_element" ? " (semantic)" : snippet.definition?.type === "interactive_element" ? " (interactive)" : ""; lines.push(`- ${snippet.signature || snippet.name}${typeSuffix}`); }); lines.push(""); } if (summary.scripts.length > 0 || summary.styles.length > 0) { lines.push("## Scripts & Styles"); summary.scripts.forEach((snippet) => { lines.push(`- ${snippet.signature || snippet.name} (script)`); }); summary.styles.forEach((snippet) => { lines.push(`- ${snippet.signature || snippet.name} (style)`); }); lines.push(""); } if (summary.attributes.length > 0) { lines.push("## Attributes"); const attributesByType = {}; summary.attributes.forEach((snippet) => { const type = snippet.definition?.type || "attribute"; if (!attributesByType[type]) attributesByType[type] = []; attributesByType[type].push(snippet); }); Object.keys(attributesByType).sort().forEach((type) => { const typeLabel = formatTypeLabel(type); lines.push(`### ${typeLabel}`); attributesByType[type].forEach((snippet) => { lines.push(`- ${snippet.signature || snippet.name}`); }); }); lines.push(""); } if (summary.comments.length > 0) { lines.push("## Comments"); summary.comments.forEach((snippet) => { lines.push(`- ${snippet.name}`); }); lines.push(""); } if (summary.textContent.length > 0) { lines.push("## Text Content"); summary.textContent.forEach((snippet) => { const preview = snippet.name.length > 50 ? snippet.name.substring(0, 47) + "..." : snippet.name; lines.push(`- ${preview}`); }); lines.push(""); } return lines.join("\n").trim(); } // ../autocompletion/v2/capturesProcess/kotlin.ts var crypto2 = __toESM(require("crypto")); function extractModifiers(node, sourceCode) { const modifiers = []; const modifierNode = node.children.find((child) => child.type === "modifiers"); if (modifierNode) { modifierNode.children.forEach((child) => { if (child.type === "visibility_modifier" || child.type === "modifier") { const modifier = sourceCode.substring(child.startIndex, child.endIndex); modifiers.push(modifier); } }); } return modifiers; } function extractImportPath(importNode, sourceCode) { const fullImportText = sourceCode.substring(importNode.startIndex, importNode.endIndex); const importKeywordIndex = fullImportText.indexOf("import"); if (importKeywordIndex === -1) return fullImportText.trim(); const importKeywordEnd = importKeywordIndex + 6; let pathPart = fullImportText.substring(importKeywordEnd).trim(); pathPart = pathPart.split("\n")[0].split("\r")[0].split(";")[0].trim(); return pathPart; } function getDefinitionType(node, sourceCode) { if (node.type === "object_declaration") return "object"; if (node.type === "type_alias") return "typealias"; if (node.type === "class_declaration") { const modifierNode = node.children.find((child) => child.type === "modifiers"); if (modifierNode) { const modifierTexts = modifierNode.children.map( (child) => sourceCode.substring(child.startIndex, child.endIndex) ); if (modifierTexts.includes("sealed")) return "sealed class"; if (modifierTexts.includes("data")) return "data class"; if (modifierTexts.includes("enum")) return "enum"; if (modifierTexts.includes("annotation")) return "annotation class"; } const hasEnumBody = node.children.some((child) => child.type === "enum_class_body"); if (hasEnumBody) return "enum"; const hasInterfaceKeyword = node.children.some((child) => { if (child.type === "interface") return true; const childText = sourceCode.substring(child.startIndex, child.endIndex); return childText === "interface"; }); if (hasInterfaceKeyword) return "interface"; return "class"; } return "class"; } function findParentClassName(captures, node, sourceCode) { const classCapture = captures.find( (c) => c.name === "definition.class" && c.node.startIndex <= node.startIndex && c.node.endIndex >= node.endIndex ); if (classCapture) { const nameNode = classCapture.node.children.find((child) => child.type === "type_identifier"); return nameNode ? sourceCode.substring(nameNode.startIndex, nameNode.endIndex) : void 0; } return void 0; } function parseParameterInfo(paramNode, sourceCode) { const nameNode = paramNode.children.find((child) => child.type === "simple_identifier"); const name2 = nameNode ? sourceCode.substring(nameNode.startIndex, nameNode.endIndex) : ""; const typeNode = paramNode.children.find((child) => child.type === "user_type" || child.type === "type_identifier"); const type = typeNode ? sourceCode.substring(typeNode.startIndex, typeNode.endIndex) : void 0; const defaultValueNode = paramNode.children.find((child) => child.type === "default_value"); const defaultValue = defaultValueNode ? sourceCode.substring(defaultValueNode.startIndex, defaultValueNode.endIndex) : void 0; return { name: name2.trim(), type: type?.trim(), defaultValue: defaultValue?.trim(), isOptional: !!defaultValue }; } function extractParameters(node, sourceCode) { const parameters = []; const parameterList = node.children.find((child) => child.type === "function_value_parameters"); if (parameterList) { const paramNodes = parameterList.children.filter((child) => child.type === "parameter"); paramNodes.forEach((paramNode) => { const paramInfo = parseParameterInfo(paramNode, sourceCode); if (paramInfo.name) { parameters.push(paramInfo); } }); } return parameters; } function extractReturnType(node, sourceCode) { const returnTypeNode = node.children.find((child) => child.type === "user_type" || child.type === "type_identifier"); if (returnTypeNode) { return sourceCode.substring(returnTypeNode.startIndex, returnTypeNode.endIndex); } return "Unit"; } async function extractSnippetsFromCapturesForKotlin(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForKotlin]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } if (snippetTypes.includes("import_or_include" /* ImportOrInclude */)) { captures.forEach((capture) => { if (capture.name === "definition.import") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const importPath = extractImportPath(node, sourceCode); const name2 = importPath; const scope = ["global"]; const rangeText = sourceCode.substring(node.startIndex, node.endIndex).trim(); const hash = crypto2.createHash("md5").update(`${name2}-${filePath}-${startLine}`).digest("hex"); if (seenHashes.has(hash)) { return; } seenHashes.add(hash); snippets.push({ name: name2, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, language: "kotlin" /* Kotlin */, definition: { name: name2, type: "import" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { captures.forEach((capture) => { if (capture.name === "definition.class" || capture.name === "definition.object") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameNode = node.children.find((child) => child.type === "type_identifier"); const name2 = nameNode ? sourceCode.substring(nameNode.startIndex, nameNode.endIndex) : ""; if (!name2) return; const scope = ["global"]; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const hash = crypto2.createHash("md5").update(`${name2}-${filePath}-${startLine}`).digest("hex"); if (seenHashes.has(hash)) { return; } seenHashes.add(hash); const modifiers = extractModifiers(node, sourceCode); const definitionType = getDefinitionType(node, sourceCode); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, language: "kotlin" /* Kotlin */, definition: { name: name2, type: definitionType, visibility: modifiers.includes("private") ? "private" : modifiers.includes("protected") ? "protected" : modifiers.includes("internal") ? "internal" : "public" } }); } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { captures.forEach((capture) => { if (capture.name === "definition.function") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameNode = node.children.find((child) => child.type === "simple_identifier"); const name2 = nameNode ? sourceCode.substring(nameNode.startIndex, nameNode.endIndex) : ""; if (!name2) return; const scope = ["global"]; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const hash = crypto2.createHash("md5").update(`${name2}-${filePath}-${startLine}`).digest("hex"); if (seenHashes.has(hash)) { return; } seenHashes.add(hash); const parameters = extractParameters(node, sourceCode); const returnType = extractReturnType(node, sourceCode); const modifiers = extractModifiers(node, sourceCode); const className = findParentClassName(captures, node, sourceCode); snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, language: "kotlin" /* Kotlin */, parameters, ...className && { field: className }, definition: { name: name2, type: "function", parameters, returnType, visibility: modifiers.includes("private") ? "private" : modifiers.includes("protected") ? "protected" : modifiers.includes("internal") ? "internal" : "public", ...className && { className } } }); } }); } if (snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { captures.forEach((capture) => { if (capture.name === "definition.property") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; let nameNode = node.children.find((child) => child.type === "simple_identifier"); if (!nameNode) { const variableDecl = node.children.find((child) => child.type === "variable_declaration"); if (variableDecl) { nameNode = variableDecl.children.find((child) => child.type === "simple_identifier"); } } const name2 = nameNode ? sourceCode.substring(nameNode.startIndex, nameNode.endIndex) : ""; if (!name2) return; const scope = ["global"]; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const hash = crypto2.createHash("md5").update(`${name2}-${filePath}-${startLine}`).digest("hex"); if (seenHashes.has(hash)) { return; } seenHashes.add(hash); const modifiers = extractModifiers(node, sourceCode); const className = findParentClassName(captures, node, sourceCode); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, language: "kotlin" /* Kotlin */, ...className && { field: className }, definition: { name: name2, type: "property", visibility: modifiers.includes("private") ? "private" : modifiers.includes("protected") ? "protected" : modifiers.includes("internal") ? "internal" : "public", ...className && { className } } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { captures.forEach((capture) => { if (capture.name === "definition.type_alias") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameNode = node.children.find((child) => child.type === "type_identifier"); const name2 = nameNode ? sourceCode.substring(nameNode.startIndex, nameNode.endIndex) : ""; if (!name2) return; const scope = ["global"]; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const hash = crypto2.createHash("md5").update(`${name2}-${filePath}-${startLine}`).digest("hex"); if (seenHashes.has(hash)) { return; } seenHashes.add(hash); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, language: "kotlin" /* Kotlin */, definition: { name: name2, type: "type_alias" } }); } }); } return snippets; } function buildSummaryFromSnippets10(snippets) { const summary = { imports: snippets.filter((s) => s.type === "import_or_include" /* ImportOrInclude */), classes: snippets.filter((s) => s.type === "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */), functions: snippets.filter((s) => s.type === "function_or_method" /* FunctionOrMethod */), variables: snippets.filter((s) => s.type === "variable_or_constant" /* VariableOrConstant */) }; return summary; } function formatOutlineText10(summary) { const lines = []; if (summary.imports?.length > 0) { lines.push("# Imports"); summary.imports.forEach((item) => { lines.push(` import: ${item.name}`); }); lines.push(""); } if (summary.classes?.length > 0) { lines.push("# Classes/Interfaces/Objects"); summary.classes.forEach((item) => { const type = item.definition?.type || "class"; lines.push(` ${type}: ${item.name}`); }); lines.push(""); } if (summary.functions?.length > 0) { lines.push("# Functions/Methods"); summary.functions.forEach((item) => { const params = item.definition?.parameters?.map((p) => `${p.name}: ${p.type || "Any"}`).join(", ") || ""; const returnType = item.definition?.returnType || "Unit"; const className = item.field; const prefix = className ? `[${className}] ` : ""; lines.push(` ${prefix}${item.name}(${params}): ${returnType}`); }); lines.push(""); } if (summary.variables?.length > 0) { lines.push("# Variables/Properties"); summary.variables.forEach((item) => { const className = item.field; const prefix = className ? `[${className}] ` : ""; lines.push(` ${prefix}property: ${item.name}`); }); lines.push(""); } return lines.join("\n"); } // ../autocompletion/v2/capturesProcess/php.ts async function extractSnippetsFromCapturesForPHP(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForPHP]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } const classCaptures = captures.filter( (c) => c.name === "definition.class" || c.name === "definition.abstract_class" || c.name === "definition.final_class" || c.name === "definition.readonly_class" ).map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, nameCap: captures.find( (nc) => (nc.name === "name.definition.class" || nc.name === "name.definition.abstract_class" || nc.name === "name.definition.final_class" || nc.name === "name.definition.readonly_class") && nc.node.startIndex >= c.node.startIndex && nc.node.endIndex <= c.node.endIndex ) })); const interfaceCaptures = captures.filter((c) => c.name === "definition.interface").map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, nameCap: captures.find( (nc) => nc.name === "name.definition.interface" && nc.node.startIndex >= c.node.startIndex && nc.node.endIndex <= c.node.endIndex ) })); const traitCaptures = captures.filter((c) => c.name === "definition.trait").map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, nameCap: captures.find( (nc) => nc.name === "name.definition.trait" && nc.node.startIndex >= c.node.startIndex && nc.node.endIndex <= c.node.endIndex ) })); const enumCaptures = captures.filter((c) => c.name === "definition.enum").map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, nameCap: captures.find( (nc) => nc.name === "name.definition.enum" && nc.node.startIndex >= c.node.startIndex && nc.node.endIndex <= c.node.endIndex ) })); const namespaceCaptures = captures.filter((c) => c.name === "definition.namespace").map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, nameCap: captures.find( (nc) => nc.name === "name.definition.namespace" && nc.node.startIndex >= c.node.startIndex && nc.node.endIndex <= c.node.endIndex ) })); function findNamespaceForNode(node) { let closestNamespace = void 0; let closestDistance = Infinity; for (const ns of namespaceCaptures) { if (ns.start < node.startIndex && ns.nameCap) { const distance = node.startIndex - ns.start; if (distance < closestDistance) { closestDistance = distance; closestNamespace = sourceCode.substring(ns.nameCap.node.startIndex, ns.nameCap.node.endIndex); } } } return closestNamespace; } captures.forEach((capture) => { if (capture.name === "name.definition.use") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) return; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); const scope = buildScopeChain(node); const namespace = findNamespaceForNode(node); snippets.push({ name: name2, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, namespace }); } }); for (const capture of captures) { if (capture.name !== "definition.function" && capture.name !== "definition.method" && capture.name !== "definition.static_method" && capture.name !== "definition.abstract_method" && capture.name !== "definition.final_method") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; let nameCapName; let paramCapName; let bodyCapName; if (capture.name === "definition.function") { nameCapName = "name.definition.function"; paramCapName = "parameters.definition.function"; bodyCapName = "body.definition.function"; } else if (capture.name === "definition.method") { nameCapName = "name.definition.method"; paramCapName = "parameters.definition.method"; bodyCapName = "body.definition.method"; } else if (capture.name === "definition.static_method") { nameCapName = "name.definition.static_method"; paramCapName = "parameters.definition.static_method"; bodyCapName = "body.definition.static_method"; } else if (capture.name === "definition.abstract_method") { nameCapName = "name.definition.abstract_method"; paramCapName = "parameters.definition.abstract_method"; bodyCapName = "body.definition.abstract_method"; } else if (capture.name === "definition.final_method") { nameCapName = "name.definition.final_method"; paramCapName = "parameters.definition.final_method"; bodyCapName = "body.definition.final_method"; } else { continue; } const nameCap = captures.find( (c) => c.name === nameCapName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const paramCap = captures.find( (c) => c.name === paramCapName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (paramCap) { const paramText = sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex); const cleanText = removeParentheses2(paramText).trim(); if (cleanText) { const paramList = parsePHPParameters(cleanText); parameters.push(...paramList.map((param) => ({ name: param }))); } } const bodyCap = captures.find( (c) => c.name === bodyCapName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let rangeText; let implementText = void 0; if (bodyCap) { rangeText = sourceCode.substring(node.startIndex, bodyCap.node.startIndex).trimEnd(); implementText = sourceCode.substring(node.startIndex, node.endIndex); } else { rangeText = sourceCode.substring(node.startIndex, node.endIndex); } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const paramStr = parameters.map((p) => p.name).join(", "); const signature = `${name2}(${paramStr})`; const scope = buildScopeChain(node); let field = void 0; const allParentCaptures = [...classCaptures, ...interfaceCaptures, ...traitCaptures, ...enumCaptures]; for (const parent of allParentCaptures) { if (node.startIndex > parent.start && node.endIndex <= parent.end && parent.nameCap) { field = sourceCode.substring(parent.nameCap.node.startIndex, parent.nameCap.node.endIndex); break; } } const namespace = findNamespaceForNode(node); snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, namespace, definition: { name: name2, type: capture.name === "definition.function" ? "function" : "method", parameters, returnType: "mixed" // PHP默认返回类型 }, parameters, signature, language: "php" /* PHP */, ...implementText ? { implementText } : {} }); } for (const capture of captures) { if (capture.name !== "definition.property" && capture.name !== "definition.static_property" && capture.name !== "definition.readonly_property" && capture.name !== "definition.promoted_property") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; let nameCapName; if (capture.name === "definition.property") { nameCapName = "name.definition.property"; } else if (capture.name === "definition.static_property") { nameCapName = "name.definition.static_property"; } else if (capture.name === "definition.readonly_property") { nameCapName = "name.definition.readonly_property"; } else if (capture.name === "definition.promoted_property") { nameCapName = "name.definition.promoted_property"; } else { continue; } const nameCap = captures.find( (c) => c.name === nameCapName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); let field = void 0; const allParentCaptures = [...classCaptures, ...interfaceCaptures, ...traitCaptures, ...enumCaptures]; for (const parent of allParentCaptures) { if (node.startIndex > parent.start && node.endIndex <= parent.end && parent.nameCap) { field = sourceCode.substring(parent.nameCap.node.startIndex, parent.nameCap.node.endIndex); break; } } const namespace = findNamespaceForNode(node); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, namespace, language: "php" /* PHP */ }); } for (const capture of captures) { if (capture.name !== "definition.constant") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name.definition.constant" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); let field = void 0; const allParentCaptures = [...classCaptures, ...interfaceCaptures, ...traitCaptures, ...enumCaptures]; for (const parent of allParentCaptures) { if (node.startIndex > parent.start && node.endIndex <= parent.end && parent.nameCap) { field = sourceCode.substring(parent.nameCap.node.startIndex, parent.nameCap.node.endIndex); break; } } const namespace = findNamespaceForNode(node); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash, field, namespace, language: "php" /* PHP */ }); } const typeDefs = [ { capture: "name.definition.class", outlineType: "class" }, { capture: "name.definition.abstract_class", outlineType: "abstract_class" }, { capture: "name.definition.final_class", outlineType: "final_class" }, { capture: "name.definition.readonly_class", outlineType: "readonly_class" }, { capture: "name.definition.interface", outlineType: "interface" }, { capture: "name.definition.trait", outlineType: "trait" }, { capture: "name.definition.enum", outlineType: "enum" } ]; for (const { capture, outlineType } of typeDefs) { const defCaptureName = `definition.${outlineType}`; for (const cap of captures.filter((c) => c.name === capture)) { const node = cap.node; const isInMethod = captures.some( (fc) => (fc.name === "definition.function" || fc.name === "definition.method" || fc.name === "definition.static_method" || fc.name === "definition.abstract_method" || fc.name === "definition.final_method") && fc.node.startIndex < node.startIndex && node.endIndex < fc.node.endIndex ); if (isInMethod) continue; const defCap = captures.find( (c) => c.name === defCaptureName && c.node.startIndex <= node.startIndex && node.endIndex <= c.node.endIndex ); const rangeText = defCap ? sourceCode.substring(defCap.node.startIndex, defCap.node.endIndex) : sourceCode.substring(node.startIndex, node.endIndex); const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const name2 = sourceCode.substring(node.startIndex, node.endIndex); const scope = buildScopeChain(node); const namespace = findNamespaceForNode(node); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, implementText: rangeText, scope, fileHash, namespace, language: "php" /* PHP */ }); } } return snippets; } function parsePHPParameters(paramText) { const params = []; let current = ""; let depth = 0; let inString = false; let stringChar = ""; for (let i2 = 0; i2 < paramText.length; i2++) { const char = paramText[i2]; const prev = i2 > 0 ? paramText[i2 - 1] : ""; if (!inString) { if (char === '"' || char === "'") { inString = true; stringChar = char; } else if (char === "(" || char === "[" || char === "{") { depth++; } else if (char === ")" || char === "]" || char === "}") { depth--; } else if (char === "," && depth === 0) { if (current.trim()) { params.push(extractPHPParamName(current.trim())); } current = ""; continue; } } else { if (char === stringChar && prev !== "\\") { inString = false; stringChar = ""; } } current += char; } if (current.trim()) { params.push(extractPHPParamName(current.trim())); } return params; } function extractPHPParamName(param) { let cleaned = removeReferenceAndSplatOperators(param); const variableName = findPHPVariableName(cleaned); if (variableName) { return variableName; } return param; } function removeParentheses2(text) { if (text.startsWith("(") && text.endsWith(")")) { return text.slice(1, -1); } return text; } function removeReferenceAndSplatOperators(param) { let result = param.trim(); while (result.startsWith(" ") || result.startsWith(" ")) { result = result.slice(1); } if (result.startsWith("&")) { result = result.slice(1).trim(); } if (result.startsWith("...")) { result = result.slice(3).trim(); } return result; } function findPHPVariableName(text) { for (let i2 = 0; i2 < text.length; i2++) { if (text[i2] === "$") { let variableName = "$"; let j = i2 + 1; while (j < text.length) { const char = text[j]; if (isValidPHPVariableChar(char)) { variableName += char; j++; } else { break; } } if (variableName.length > 1) { return variableName; } } } return null; } function isValidPHPVariableChar(char) { return char >= "a" && char <= "z" || char >= "A" && char <= "Z" || char >= "0" && char <= "9" || char === "_"; } function buildSummaryFromSnippets11(snippets) { const outline = { imports: [], classes: [], interfaces: [], traits: [], enums: [], functions: [], constants: [], namespaces: [] }; for (const snippet of snippets) { if (snippet.namespace && !outline.namespaces.includes(snippet.namespace)) { outline.namespaces.push(snippet.namespace); } switch (snippet.type) { case "import_or_include" /* ImportOrInclude */: outline.imports.push(snippet.name); break; case "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */: if (snippet.name.includes("interface")) { outline.interfaces.push(snippet.name); } else if (snippet.name.includes("trait")) { outline.traits.push(snippet.name); } else if (snippet.name.includes("enum")) { outline.enums.push(snippet.name); } else { outline.classes.push(snippet.name); } break; case "function_or_method" /* FunctionOrMethod */: outline.functions.push(snippet.name); break; case "variable_or_constant" /* VariableOrConstant */: if (snippet.name.includes("const")) { outline.constants.push(snippet.name); } break; } } return outline; } function formatOutlineText11(outline) { const sections = []; if (outline.namespaces.length > 0) { sections.push(`Namespaces: ${outline.namespaces.join(", ")}`); } if (outline.imports.length > 0) { sections.push(`Imports: ${outline.imports.join(", ")}`); } if (outline.classes.length > 0) { sections.push(`Classes: ${outline.classes.join(", ")}`); } if (outline.interfaces.length > 0) { sections.push(`Interfaces: ${outline.interfaces.join(", ")}`); } if (outline.traits.length > 0) { sections.push(`Traits: ${outline.traits.join(", ")}`); } if (outline.enums.length > 0) { sections.push(`Enums: ${outline.enums.join(", ")}`); } if (outline.functions.length > 0) { sections.push(`Functions: ${outline.functions.join(", ")}`); } if (outline.constants.length > 0) { sections.push(`Constants: ${outline.constants.join(", ")}`); } return sections.join("\n"); } // ../autocompletion/v2/capturesProcess/rust.ts async function extractSnippetsFromCapturesForRust(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForRust]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } const containerCaptures = captures.filter( (c) => c.name === "definition.struct" || c.name === "definition.enum" || c.name === "definition.trait" || c.name === "definition.impl" || c.name === "definition.impl_trait" ).map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, name: c.name, nameCap: findNameCaptureForContainer(c, captures, sourceCode) })).filter((c) => c.nameCap); if (snippetTypes.includes("import_or_include" /* ImportOrInclude */)) { captures.forEach((capture) => { if (capture.name === "definition.use_declaration") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) return; seenHashes.add(snippetHash); const name2 = extractUseStatementName(rangeText); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "import_or_include" /* ImportOrInclude */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash }); } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { for (const capture of captures) { if (capture.name !== "definition.function") continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === "name.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const paramCap = captures.find( (c) => c.name === "parameters.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = []; if (paramCap) { const paramText = sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex); const cleanParams = removeParentheses3(paramText).trim(); if (cleanParams) { const paramList = parseRustParameters(cleanParams); parameters.push(...paramList.map((param) => ({ name: param }))); } } const bodyCap = captures.find( (c) => c.name === "body.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let definitionText; let implementText = void 0; if (bodyCap) { const functionHeader = sourceCode.substring(node.startIndex, bodyCap.node.startIndex).trimEnd(); definitionText = functionHeader.endsWith("{") ? functionHeader.slice(0, -1).trim() : functionHeader; implementText = sourceCode.substring(node.startIndex, node.endIndex); } else { definitionText = sourceCode.substring(node.startIndex, node.endIndex); } const rangeText = sourceCode.substring(node.startIndex, node.endIndex); let field = void 0; const sortedContainers = containerCaptures.sort((a, b) => { if (a.name === "definition.impl_trait" && b.name !== "definition.impl_trait") return -1; if (a.name !== "definition.impl_trait" && b.name === "definition.impl_trait") return 1; return 0; }); for (const container of sortedContainers) { if (node.startIndex > container.start && node.endIndex <= container.end && container.nameCap) { field = container.nameCap; break; } } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText, implementText, parameters, field, scope, fileHash }); } for (const capture of captures) { if (capture.name !== "name.definition.method") continue; const methodNode = capture.node; const name2 = sourceCode.substring(methodNode.startIndex, methodNode.endIndex); const implCapture = captures.find( (c) => (c.name === "definition.impl" || c.name === "definition.impl_trait") && c.node.startIndex <= methodNode.startIndex && c.node.endIndex >= methodNode.endIndex ); if (!implCapture) continue; const functionNode = findParentFunctionNode(methodNode, sourceCode); if (!functionNode) continue; const startLine = functionNode.startPosition.row + 1; const endLine = functionNode.endPosition.row + 1; const paramCap = captures.find( (c) => c.name === "parameters.definition.method" && c.node.startIndex >= functionNode.startIndex && c.node.endIndex <= functionNode.endIndex ); const parameters = []; if (paramCap) { const paramText = sourceCode.substring(paramCap.node.startIndex, paramCap.node.endIndex); const cleanParams = removeParentheses3(paramText).trim(); if (cleanParams) { const paramList = parseRustParameters(cleanParams); parameters.push(...paramList.map((param) => ({ name: param }))); } } const bodyCap = captures.find( (c) => c.name === "body.definition.method" && c.node.startIndex >= functionNode.startIndex && c.node.endIndex <= functionNode.endIndex ); let definitionText; let implementText = void 0; if (bodyCap) { const methodHeader = sourceCode.substring(functionNode.startIndex, bodyCap.node.startIndex).trimEnd(); definitionText = methodHeader.endsWith("{") ? methodHeader.slice(0, -1).trim() : methodHeader; implementText = sourceCode.substring(functionNode.startIndex, functionNode.endIndex); } else { definitionText = sourceCode.substring(functionNode.startIndex, functionNode.endIndex); } const rangeText = sourceCode.substring(functionNode.startIndex, functionNode.endIndex); let field = void 0; const sortedContainers = containerCaptures.sort((a, b) => { if (a.name === "definition.impl_trait" && b.name !== "definition.impl_trait") return -1; if (a.name !== "definition.impl_trait" && b.name === "definition.impl_trait") return 1; return 0; }); for (const container of sortedContainers) { if (functionNode.startIndex > container.start && functionNode.endIndex <= container.end && container.nameCap) { field = container.nameCap; break; } } const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(functionNode); snippets.push({ name: name2, type: "function_or_method" /* FunctionOrMethod */, filePath, startLine, endLine, rangeText, definitionText, implementText, parameters, field, scope, fileHash }); } } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const structureTypes = [ "definition.struct", "definition.enum", "definition.trait", "definition.impl", "definition.impl_trait" ]; const processedNodes = /* @__PURE__ */ new Set(); for (const capture of captures) { if (!structureTypes.includes(capture.name)) continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nodeKey = `${node.startIndex}:${node.endIndex}`; if (processedNodes.has(nodeKey)) continue; if (capture.name === "definition.impl") { const hasImplTrait = captures.some( (c) => c.name === "definition.impl_trait" && c.node.startIndex === node.startIndex && c.node.endIndex === node.endIndex ); if (hasImplTrait) continue; } processedNodes.add(nodeKey); let nameCap; let name2 = ""; switch (capture.name) { case "definition.struct": nameCap = captures.find( (c) => c.name === "name.definition.struct" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (nameCap) { name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); } break; case "definition.enum": nameCap = captures.find( (c) => c.name === "name.definition.enum" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (nameCap) { name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); } break; case "definition.trait": nameCap = captures.find( (c) => c.name === "name.definition.trait" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (nameCap) { name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); } break; case "definition.impl": nameCap = captures.find( (c) => c.name === "name.definition.impl" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (nameCap) { name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); } break; case "definition.impl_trait": const traitCap = captures.find( (c) => c.name === "name.definition.impl_trait" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const forCap = captures.find( (c) => c.name === "name.definition.impl_for" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (traitCap && forCap) { const traitName = sourceCode.substring(traitCap.node.startIndex, traitCap.node.endIndex); const forName = sourceCode.substring(forCap.node.startIndex, forCap.node.endIndex); name2 = `${traitName} for ${forName}`; } break; } if (!name2) continue; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); const scope = buildScopeChain(node); snippets.push({ name: name2, type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, filePath, startLine, endLine, rangeText, definitionText: rangeText, scope, fileHash }); } } if (snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const variableTypes = [ { captureName: "definition.variable", nameCapture: "name.definition.variable" }, { captureName: "definition.constant", nameCapture: "name.definition.constant" }, { captureName: "definition.static", nameCapture: "name.definition.static" } ]; for (const { captureName, nameCapture } of variableTypes) { for (const capture of captures) { if (capture.name !== captureName) continue; const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const nameCap = captures.find( (c) => c.name === nameCapture && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (!nameCap) continue; const name2 = sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex); const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (seenHashes.has(snippetHash)) continue; seenHashes.add(snippetHash); let field = void 0; for (const container of containerCaptures) { if (node.startIndex > container.start && node.endIndex <= container.end && container.nameCap) { field = container.nameCap; break; } } const scope = buildScopeChain(node); snippets.push({ name: name2, type: "variable_or_constant" /* VariableOrConstant */, filePath, startLine, endLine, rangeText, definitionText: rangeText, field, scope, fileHash }); } } } return snippets; } function parseRustParameters(paramText) { const params = []; let current = ""; let depth = 0; let inString = false; let escapeNext = false; for (let i2 = 0; i2 < paramText.length; i2++) { const char = paramText[i2]; if (escapeNext) { current += char; escapeNext = false; continue; } if (char === "\\") { escapeNext = true; current += char; continue; } if (char === '"' || char === "'") { inString = !inString; current += char; continue; } if (inString) { current += char; continue; } if (char === "<" || char === "(" || char === "[" || char === "{") { depth++; } else if (char === ">" || char === ")" || char === "]" || char === "}") { depth--; } if (char === "," && depth === 0) { const param2 = current.trim(); if (param2) { const colonIndex = param2.indexOf(":"); const paramName = colonIndex > -1 ? param2.substring(0, colonIndex).trim() : param2; if (paramName === "self" || paramName === "&self" || paramName === "&mut self") { params.push(paramName); } else { params.push(paramName); } } current = ""; } else { current += char; } } const param = current.trim(); if (param) { const colonIndex = param.indexOf(":"); const paramName = colonIndex > -1 ? param.substring(0, colonIndex).trim() : param; if (paramName === "self" || paramName === "&self" || paramName === "&mut self") { params.push(paramName); } else { params.push(paramName); } } return params; } function extractUseStatementName(useStatement) { let cleaned = removeUseKeywordAndSemicolon(useStatement).trim(); const asIndex = cleaned.lastIndexOf(" as "); if (asIndex > -1) { return cleaned.substring(asIndex + 4).trim(); } if (cleaned.includes("{") && cleaned.includes("}")) { const braceContent = extractBraceContent(cleaned); if (braceContent) { const items = braceContent.split(",").map((s) => s.trim()); return items.join(", "); } } const parts2 = cleaned.split("::"); return parts2[parts2.length - 1].trim(); } function findNameCaptureForContainer(container, captures, sourceCode) { let nameCaptureName; switch (container.name) { case "definition.struct": nameCaptureName = "name.definition.struct"; break; case "definition.enum": nameCaptureName = "name.definition.enum"; break; case "definition.trait": nameCaptureName = "name.definition.trait"; break; case "definition.impl": nameCaptureName = "name.definition.impl"; break; case "definition.impl_trait": const traitCap = captures.find( (c) => c.name === "name.definition.impl_trait" && c.node.startIndex >= container.node.startIndex && c.node.endIndex <= container.node.endIndex ); const forCap = captures.find( (c) => c.name === "name.definition.impl_for" && c.node.startIndex >= container.node.startIndex && c.node.endIndex <= container.node.endIndex ); if (traitCap && forCap) { const traitName = sourceCode.substring(traitCap.node.startIndex, traitCap.node.endIndex); const forName = sourceCode.substring(forCap.node.startIndex, forCap.node.endIndex); return `${traitName} for ${forName}`; } return void 0; default: return void 0; } const nameCap = captures.find( (c) => c.name === nameCaptureName && c.node.startIndex >= container.node.startIndex && c.node.endIndex <= container.node.endIndex ); return nameCap ? sourceCode.substring(nameCap.node.startIndex, nameCap.node.endIndex) : void 0; } function findParentFunctionNode(methodNameNode, sourceCode) { let current = methodNameNode.parent; while (current) { if (current.type === "function_item") { return current; } current = current.parent; } return void 0; } function removeParentheses3(text) { if (text.startsWith("(") && text.endsWith(")")) { return text.slice(1, -1); } return text; } function removeUseKeywordAndSemicolon(useStatement) { let result = useStatement.trim(); if (result.startsWith("use ")) { result = result.substring(4); } if (result.endsWith(";")) { result = result.slice(0, -1); } return result; } function extractBraceContent(text) { const startIndex = text.indexOf("{"); const endIndex = text.lastIndexOf("}"); if (startIndex > -1 && endIndex > startIndex) { return text.substring(startIndex + 1, endIndex); } return null; } function buildSummaryFromSnippets12(snippets) { const summary = { functions: [], structs: [], enums: [], traits: [], impls: [], constants: [], variables: [], imports: [] }; for (const snippet of snippets) { switch (snippet.type) { case "function_or_method" /* FunctionOrMethod */: summary.functions.push({ name: snippet.name, parameters: snippet.parameters?.map((p) => p.name) || [], field: snippet.field }); break; case "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */: const defText = snippet.definitionText || ""; if (defText.startsWith("struct ")) { summary.structs.push({ name: snippet.name }); } else if (defText.startsWith("enum ")) { summary.enums.push({ name: snippet.name }); } else if (defText.startsWith("trait ")) { summary.traits.push({ name: snippet.name }); } else if (defText.startsWith("impl ")) { summary.impls.push({ name: snippet.name }); } break; case "variable_or_constant" /* VariableOrConstant */: const varDefText = snippet.definitionText || ""; if (varDefText.startsWith("const ") || varDefText.startsWith("static ")) { summary.constants.push({ name: snippet.name, field: snippet.field }); } else { summary.variables.push({ name: snippet.name, field: snippet.field }); } break; case "import_or_include" /* ImportOrInclude */: summary.imports.push({ name: snippet.name }); break; } } return summary; } function formatOutlineText12(summary) { let outlineText = ""; if (summary.imports.length > 0) { outlineText += "Imports:\n"; for (const imp of summary.imports) { outlineText += ` - ${imp.name} `; } outlineText += "\n"; } if (summary.structs.length > 0) { outlineText += "Structs:\n"; for (const struct of summary.structs) { outlineText += ` - ${struct.name} `; } outlineText += "\n"; } if (summary.enums.length > 0) { outlineText += "Enums:\n"; for (const enumItem of summary.enums) { outlineText += ` - ${enumItem.name} `; } outlineText += "\n"; } if (summary.traits.length > 0) { outlineText += "Traits:\n"; for (const trait of summary.traits) { outlineText += ` - ${trait.name} `; } outlineText += "\n"; } if (summary.impls.length > 0) { outlineText += "Implementations:\n"; for (const impl of summary.impls) { outlineText += ` - ${impl.name} `; } outlineText += "\n"; } if (summary.functions.length > 0) { outlineText += "Functions/Methods:\n"; for (const func2 of summary.functions) { const paramStr = func2.parameters.length > 0 ? `(${func2.parameters.join(", ")})` : "()"; const fieldStr = func2.field ? ` [in ${func2.field}]` : ""; outlineText += ` - ${func2.name}${paramStr}${fieldStr} `; } outlineText += "\n"; } if (summary.constants.length > 0) { outlineText += "Constants/Statics:\n"; for (const constant of summary.constants) { const fieldStr = constant.field ? ` [in ${constant.field}]` : ""; outlineText += ` - ${constant.name}${fieldStr} `; } outlineText += "\n"; } if (summary.variables.length > 0) { outlineText += "Variables:\n"; for (const variable of summary.variables) { const fieldStr = variable.field ? ` [in ${variable.field}]` : ""; outlineText += ` - ${variable.name}${fieldStr} `; } outlineText += "\n"; } return outlineText.trim(); } // ../autocompletion/v2/capturesProcess/c.ts async function extractSnippetsFromCapturesForC(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForC]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } const containerCaptures = captures.filter((c) => c.name === "definition.struct" || c.name === "definition.union" || c.name === "definition.enum").map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, name: c.name, nameCap: findNameCaptureForContainer2(c, captures, sourceCode) })).filter((c) => c.nameCap); if (snippetTypes.includes("import_or_include" /* ImportOrInclude */)) { captures.forEach((capture) => { if (capture.name === "definition.include") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const includeNameCapture = captures.find( (c) => c.name === "name.definition.include" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const includeName = includeNameCapture ? sourceCode.substring(includeNameCapture.node.startIndex, includeNameCapture.node.endIndex) : ""; snippets.push({ type: "import_or_include" /* ImportOrInclude */, name: includeName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */ }); } } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const functionCaptures = captures.filter((c) => c.name === "definition.function"); functionCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const functionNameCapture = captures.find( (c) => c.name === "name.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const functionName = functionNameCapture ? sourceCode.substring(functionNameCapture.node.startIndex, functionNameCapture.node.endIndex) : ""; const parametersCapture = captures.find( (c) => c.name === "parameters.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = parametersCapture ? extractParametersFromNode(parametersCapture.node, sourceCode) : []; const bodyCapture = captures.find( (c) => c.name === "body.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const hasBody = !!bodyCapture; snippets.push({ type: "function_or_method" /* FunctionOrMethod */, name: functionName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */, parameters, definition: { name: functionName, type: "function", parameters } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const structCaptures = captures.filter((c) => c.name === "definition.struct"); structCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const structNameCapture = captures.find( (c) => c.name === "name.definition.struct" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const structName = structNameCapture ? sourceCode.substring(structNameCapture.node.startIndex, structNameCapture.node.endIndex) : ""; const fields = extractFieldsFromStructNode(node, sourceCode, captures); snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: structName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */, definition: { name: structName, type: "struct" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const unionCaptures = captures.filter((c) => c.name === "definition.union"); unionCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const unionNameCapture = captures.find( (c) => c.name === "name.definition.union" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const unionName = unionNameCapture ? sourceCode.substring(unionNameCapture.node.startIndex, unionNameCapture.node.endIndex) : ""; const fields = extractFieldsFromStructNode(node, sourceCode, captures); snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: unionName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */, definition: { name: unionName, type: "union" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const enumCaptures = captures.filter((c) => c.name === "definition.enum"); enumCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const enumNameCapture = captures.find( (c) => c.name === "name.definition.enum" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const enumName = enumNameCapture ? sourceCode.substring(enumNameCapture.node.startIndex, enumNameCapture.node.endIndex) : ""; const enumerators = extractEnumeratorsFromEnumNode(node, sourceCode, captures); snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: enumName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */, definition: { name: enumName, type: "enum" } }); } }); } if (snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const variableCaptures = captures.filter((c) => c.name === "definition.variable"); variableCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const variableNameCapture = captures.find( (c) => c.name === "name.definition.variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const variableName = variableNameCapture ? sourceCode.substring(variableNameCapture.node.startIndex, variableNameCapture.node.endIndex) : ""; snippets.push({ type: "variable_or_constant" /* VariableOrConstant */, name: variableName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */, definition: { name: variableName, type: "variable" } }); } }); } if (snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const staticVariableCaptures = captures.filter((c) => c.name === "definition.static_variable"); staticVariableCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const staticVariableNameCapture = captures.find( (c) => c.name === "name.definition.variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const staticVariableName = staticVariableNameCapture ? sourceCode.substring( staticVariableNameCapture.node.startIndex, staticVariableNameCapture.node.endIndex ) : ""; snippets.push({ type: "variable_or_constant" /* VariableOrConstant */, name: staticVariableName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */, definition: { name: staticVariableName, type: "static_variable" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const typedefCaptures = captures.filter((c) => c.name === "definition.type"); typedefCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const typedefNameCapture = captures.find( (c) => c.name === "name.definition.type" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const typedefName = typedefNameCapture ? sourceCode.substring(typedefNameCapture.node.startIndex, typedefNameCapture.node.endIndex) : ""; snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: typedefName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "c" /* C */, definition: { name: typedefName, type: "typedef" } }); } }); } logger.info(`Extracted ${snippets.length} C snippets`); return snippets; } function extractParametersFromNode(node, sourceCode) { const parameters = []; for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && child.type === "parameter_declaration") { const parameterText = sourceCode.substring(child.startIndex, child.endIndex); const parameterName = extractParameterName(child, sourceCode); parameters.push({ name: parameterName, type: parameterText }); } } return parameters; } function extractParameterName(node, sourceCode) { for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && child.type === "identifier") { return sourceCode.substring(child.startIndex, child.endIndex); } } return ""; } function extractFieldsFromStructNode(node, sourceCode, captures) { const fields = []; const fieldCaptures = captures.filter( (c) => c.name === "name.definition.field" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); fieldCaptures.forEach((capture) => { const fieldName = sourceCode.substring(capture.node.startIndex, capture.node.endIndex); fields.push(fieldName); }); return fields; } function extractEnumeratorsFromEnumNode(node, sourceCode, captures) { const enumerators = []; const enumeratorCaptures = captures.filter( (c) => c.name === "name.definition.enumerator" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); enumeratorCaptures.forEach((capture) => { const enumeratorName = sourceCode.substring(capture.node.startIndex, capture.node.endIndex); enumerators.push(enumeratorName); }); return enumerators; } function getNameCaptureNameForContainer(containerCaptureName) { switch (containerCaptureName) { case "definition.struct": return "name.definition.struct"; case "definition.union": return "name.definition.union"; case "definition.enum": return "name.definition.enum"; default: return containerCaptureName; } } function findNameCaptureForContainer2(containerCapture, captures, sourceCode) { const node = containerCapture.node; const nameCaptureName = getNameCaptureNameForContainer(containerCapture.name); const nameCapture = captures.find( (c) => c.name === nameCaptureName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); return nameCapture ? sourceCode.substring(nameCapture.node.startIndex, nameCapture.node.endIndex) : null; } function buildSummaryFromSnippets13(snippets) { const summary = { includes: [], functions: [], structs: [], unions: [], enums: [], variables: [] }; snippets.forEach((snippet) => { switch (snippet.type) { case "import_or_include" /* ImportOrInclude */: summary.includes.push(snippet.name); break; case "function_or_method" /* FunctionOrMethod */: summary.functions.push(snippet.name); break; case "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */: if (snippet.rangeText.includes("struct")) { summary.structs.push(snippet.name); } else if (snippet.rangeText.includes("union")) { summary.unions.push(snippet.name); } else if (snippet.rangeText.includes("enum")) { summary.enums.push(snippet.name); } break; case "variable_or_constant" /* VariableOrConstant */: summary.variables.push(snippet.name); break; } }); return summary; } function formatOutlineText13(summary) { let outline = ""; if (summary.includes.length > 0) { outline += `Includes: ${summary.includes.join(", ")} `; } if (summary.functions.length > 0) { outline += `Functions: ${summary.functions.join(", ")} `; } if (summary.structs.length > 0) { outline += `Structs: ${summary.structs.join(", ")} `; } if (summary.unions.length > 0) { outline += `Unions: ${summary.unions.join(", ")} `; } if (summary.enums.length > 0) { outline += `Enums: ${summary.enums.join(", ")} `; } if (summary.variables.length > 0) { outline += `Variables: ${summary.variables.join(", ")} `; } return outline; } // ../autocompletion/v2/capturesProcess/cpp.ts async function extractSnippetsFromCapturesForCPP(captures, sourceCode, filePath, fileHash, snippetTypes, options) { const logger = Logger.getDefaultLogger().with("[extractSnippetsFromCapturesForCPP]"); const snippets = []; const seenHashes = /* @__PURE__ */ new Set(); if (snippetTypes.length === 0) { logger.warn(`No snippet types provided, skipping`); return snippets; } const containerCaptures = captures.filter( (c) => c.name === "definition.class" || c.name === "definition.struct" || c.name === "definition.union" || c.name === "definition.enum" || c.name === "definition.template" ).map((c) => ({ node: c.node, start: c.node.startIndex, end: c.node.endIndex, name: c.name, nameCap: findNameCaptureForContainer3(c, captures, sourceCode) })).filter((c) => c.nameCap); if (snippetTypes.includes("import_or_include" /* ImportOrInclude */)) { captures.forEach((capture) => { if (capture.name === "definition.include") { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const includeNameCapture = captures.find( (c) => c.name === "name.definition.include" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const includeName = includeNameCapture ? sourceCode.substring(includeNameCapture.node.startIndex, includeNameCapture.node.endIndex) : ""; snippets.push({ type: "import_or_include" /* ImportOrInclude */, name: includeName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */ }); } } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const functionCaptures = captures.filter((c) => c.name === "definition.function"); functionCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const functionNameCapture = captures.find( (c) => c.name === "name.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const functionName = functionNameCapture ? sourceCode.substring(functionNameCapture.node.startIndex, functionNameCapture.node.endIndex) : ""; const parametersCapture = captures.find( (c) => c.name === "parameters.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = parametersCapture ? extractParametersFromNode2(parametersCapture.node, sourceCode) : []; const bodyCapture = captures.find( (c) => c.name === "body.definition.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const hasBody = !!bodyCapture; snippets.push({ type: "function_or_method" /* FunctionOrMethod */, name: functionName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, parameters, definition: { name: functionName, type: "function", parameters } }); } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const methodCaptures = captures.filter((c) => c.name === "definition.method"); methodCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const methodNameCapture = captures.find( (c) => c.name === "name.definition.method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const methodName = methodNameCapture ? sourceCode.substring(methodNameCapture.node.startIndex, methodNameCapture.node.endIndex) : ""; const parametersCapture = captures.find( (c) => c.name === "parameters.definition.method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = parametersCapture ? extractParametersFromNode2(parametersCapture.node, sourceCode) : []; const bodyCapture = captures.find( (c) => c.name === "body.definition.method" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const hasBody = !!bodyCapture; const parentContainer = findParentContainer(node, containerCaptures); const field = parentContainer?.nameCap || void 0; snippets.push({ type: "function_or_method" /* FunctionOrMethod */, name: methodName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, parameters, field, definition: { name: methodName, type: "method", parameters } }); } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const constructorCaptures = captures.filter((c) => c.name === "definition.constructor"); constructorCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const constructorNameCapture = captures.find( (c) => c.name === "name.definition.constructor" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const constructorName = constructorNameCapture ? sourceCode.substring(constructorNameCapture.node.startIndex, constructorNameCapture.node.endIndex) : ""; const parametersCapture = captures.find( (c) => c.name === "parameters.definition.constructor" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = parametersCapture ? extractParametersFromNode2(parametersCapture.node, sourceCode) : []; const parentContainer = findParentContainer(node, containerCaptures); const field = parentContainer?.nameCap || void 0; snippets.push({ type: "function_or_method" /* FunctionOrMethod */, name: constructorName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, parameters, field, definition: { name: constructorName, type: "constructor", parameters } }); } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const destructorCaptures = captures.filter((c) => c.name === "definition.destructor"); destructorCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const destructorNameCapture = captures.find( (c) => c.name === "name.definition.destructor" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const destructorName = destructorNameCapture ? sourceCode.substring(destructorNameCapture.node.startIndex, destructorNameCapture.node.endIndex) : ""; const parentContainer = findParentContainer(node, containerCaptures); const field = parentContainer?.nameCap || void 0; snippets.push({ type: "function_or_method" /* FunctionOrMethod */, name: destructorName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, field, definition: { name: destructorName, type: "destructor", parameters: [] } }); } }); } if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const operatorCaptures = captures.filter((c) => c.name === "definition.operator"); operatorCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const operatorNameCapture = captures.find( (c) => c.name === "name.definition.operator" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const operatorName = operatorNameCapture ? sourceCode.substring(operatorNameCapture.node.startIndex, operatorNameCapture.node.endIndex) : ""; const parametersCapture = captures.find( (c) => c.name === "parameters.definition.operator" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const parameters = parametersCapture ? extractParametersFromNode2(parametersCapture.node, sourceCode) : []; const parentContainer = findParentContainer(node, containerCaptures); const field = parentContainer?.nameCap || void 0; snippets.push({ type: "function_or_method" /* FunctionOrMethod */, name: operatorName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, parameters, field, definition: { name: operatorName, type: "operator", parameters } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const classCaptures = captures.filter((c) => c.name === "definition.class"); const templateCaptures = captures.filter((c) => c.name === "definition.template"); classCaptures.forEach((capture) => { const node = capture.node; const isWithinTemplate = templateCaptures.some((templateCapture) => { return templateCapture.node.startIndex <= node.startIndex && node.endIndex <= templateCapture.node.endIndex; }); if (isWithinTemplate) { return; } const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const classNameCapture = captures.find( (c) => c.name === "name.definition.class" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const className = classNameCapture ? sourceCode.substring(classNameCapture.node.startIndex, classNameCapture.node.endIndex) : ""; const fields = extractFieldsFromContainerNode(node, sourceCode, captures); snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: className, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: className, type: "class" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const structCaptures = captures.filter((c) => c.name === "definition.struct"); structCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const structNameCapture = captures.find( (c) => c.name === "name.definition.struct" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const structName = structNameCapture ? sourceCode.substring(structNameCapture.node.startIndex, structNameCapture.node.endIndex) : ""; const fields = extractFieldsFromContainerNode(node, sourceCode, captures); snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: structName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: structName, type: "struct" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const unionCaptures = captures.filter((c) => c.name === "definition.union"); unionCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const unionNameCapture = captures.find( (c) => c.name === "name.definition.union" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const unionName = unionNameCapture ? sourceCode.substring(unionNameCapture.node.startIndex, unionNameCapture.node.endIndex) : ""; const fields = extractFieldsFromContainerNode(node, sourceCode, captures); snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: unionName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: unionName, type: "union" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const enumCaptures = captures.filter((c) => c.name === "definition.enum"); enumCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const enumNameCapture = captures.find( (c) => c.name === "name.definition.enum" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const enumName = enumNameCapture ? sourceCode.substring(enumNameCapture.node.startIndex, enumNameCapture.node.endIndex) : ""; const enumerators = extractEnumeratorsFromEnumNode2(node, sourceCode, captures); snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: enumName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: enumName, type: "enum" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const templateCaptures = captures.filter((c) => c.name === "definition.template"); templateCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const templateClassNameCapture = captures.find( (c) => c.name === "name.definition.template.class" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const templateStructNameCapture = captures.find( (c) => c.name === "name.definition.template.struct" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const templateFunctionNameCapture = captures.find( (c) => c.name === "name.definition.template.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); let templateName = ""; let templateType = "template"; if (templateClassNameCapture) { templateName = sourceCode.substring( templateClassNameCapture.node.startIndex, templateClassNameCapture.node.endIndex ); templateType = "template_class"; } else if (templateStructNameCapture) { templateName = sourceCode.substring( templateStructNameCapture.node.startIndex, templateStructNameCapture.node.endIndex ); templateType = "template_struct"; } else if (templateFunctionNameCapture) { templateName = sourceCode.substring( templateFunctionNameCapture.node.startIndex, templateFunctionNameCapture.node.endIndex ); templateType = "template_function"; } const parametersCapture = captures.find( (c) => c.name === "parameters.definition.template" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const templateParameters = parametersCapture ? extractTemplateParametersFromNode(parametersCapture.node, sourceCode) : []; if (templateType === "template_function") { if (snippetTypes.includes("function_or_method" /* FunctionOrMethod */)) { const functionParametersCapture = captures.find( (c) => c.name === "parameters.definition.template.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const functionParameters = functionParametersCapture ? extractParametersFromNode2(functionParametersCapture.node, sourceCode) : []; snippets.push({ type: "function_or_method" /* FunctionOrMethod */, name: templateName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, parameters: functionParameters, definition: { name: templateName, type: templateType, parameters: functionParameters } }); } } else { snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: templateName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: templateName, type: templateType } }); } } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const namespaceCaptures = captures.filter((c) => c.name === "definition.namespace"); namespaceCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const namespaceNameCapture = captures.find( (c) => c.name === "name.definition.namespace" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const namespaceName = namespaceNameCapture ? sourceCode.substring(namespaceNameCapture.node.startIndex, namespaceNameCapture.node.endIndex) : ""; snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: namespaceName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: namespaceName, type: "namespace" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const typedefCaptures = captures.filter((c) => c.name === "definition.typedef"); typedefCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const typedefNameCapture = captures.find( (c) => c.name === "name.definition.typedef" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const typedefName = typedefNameCapture ? sourceCode.substring(typedefNameCapture.node.startIndex, typedefNameCapture.node.endIndex) : ""; snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: typedefName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: typedefName, type: "typedef" } }); } }); } if (snippetTypes.includes("class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */)) { const usingCaptures = captures.filter((c) => c.name === "definition.using"); usingCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const usingNameCapture = captures.find( (c) => c.name === "name.definition.using" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const usingName = usingNameCapture ? sourceCode.substring(usingNameCapture.node.startIndex, usingNameCapture.node.endIndex) : ""; snippets.push({ type: "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, name: usingName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: usingName, type: "using" } }); } }); } if (snippetTypes.includes("variable_or_constant" /* VariableOrConstant */)) { const variableCaptures = captures.filter((c) => c.name === "definition.variable"); variableCaptures.forEach((capture) => { const node = capture.node; const startLine = node.startPosition.row + 1; const endLine = node.endPosition.row + 1; const rangeText = sourceCode.substring(node.startIndex, node.endIndex); const snippetHash = generateSnippetHash(filePath, startLine, endLine, rangeText); if (!seenHashes.has(snippetHash)) { seenHashes.add(snippetHash); const scope = buildScopeChain(node); const variableNameCapture = captures.find( (c) => c.name === "name.definition.variable" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); const variableName = variableNameCapture ? sourceCode.substring(variableNameCapture.node.startIndex, variableNameCapture.node.endIndex) : ""; snippets.push({ type: "variable_or_constant" /* VariableOrConstant */, name: variableName, rangeText, startLine, endLine, filePath, fileHash, scope, language: "cpp" /* CPP */, definition: { name: variableName, type: "variable" } }); } }); } logger.info(`Extracted ${snippets.length} C++ snippets`); return snippets; } function extractParametersFromNode2(node, sourceCode) { const parameters = []; for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && child.type === "parameter_declaration") { const parameterText = sourceCode.substring(child.startIndex, child.endIndex); const parameterName = extractParameterName2(child, sourceCode); parameters.push({ name: parameterName, type: parameterText }); } } return parameters; } function extractParameterName2(node, sourceCode) { for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && child.type === "identifier") { return sourceCode.substring(child.startIndex, child.endIndex); } } return ""; } function extractTemplateParametersFromNode(node, sourceCode) { const parameters = []; for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && (child.type === "type_parameter_declaration" || child.type === "parameter_declaration")) { const parameterText = sourceCode.substring(child.startIndex, child.endIndex); const parameterName = extractTemplateParameterName(child, sourceCode); parameters.push({ name: parameterName, type: parameterText }); } } return parameters; } function extractTemplateParameterName(node, sourceCode) { for (let i2 = 0; i2 < node.childCount; i2++) { const child = node.child(i2); if (child && (child.type === "type_identifier" || child.type === "identifier")) { return sourceCode.substring(child.startIndex, child.endIndex); } } return ""; } function extractFieldsFromContainerNode(node, sourceCode, captures) { const fields = []; const fieldCaptures = captures.filter( (c) => c.name === "name.definition.field" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); fieldCaptures.forEach((capture) => { const fieldName = sourceCode.substring(capture.node.startIndex, capture.node.endIndex); fields.push(fieldName); }); return fields; } function extractEnumeratorsFromEnumNode2(node, sourceCode, captures) { const enumerators = []; const enumeratorCaptures = captures.filter( (c) => c.name === "name.definition.enumerator" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); enumeratorCaptures.forEach((capture) => { const enumeratorName = sourceCode.substring(capture.node.startIndex, capture.node.endIndex); enumerators.push(enumeratorName); }); return enumerators; } function findParentContainer(node, containerCaptures) { for (const container of containerCaptures) { if (container.start <= node.startIndex && node.endIndex <= container.end) { return container; } } return null; } function getNameCaptureNameForContainer2(containerCaptureName) { switch (containerCaptureName) { case "definition.class": return "name.definition.class"; case "definition.struct": return "name.definition.struct"; case "definition.union": return "name.definition.union"; case "definition.enum": return "name.definition.enum"; case "definition.template": return "name.definition.template.class"; // 默认查找类模板 default: return containerCaptureName; } } function findNameCaptureForContainer3(containerCapture, captures, sourceCode) { const node = containerCapture.node; const nameCaptureName = getNameCaptureNameForContainer2(containerCapture.name); if (containerCapture.name === "definition.template") { const templateClassNameCapture = captures.find( (c) => c.name === "name.definition.template.class" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (templateClassNameCapture) { return sourceCode.substring( templateClassNameCapture.node.startIndex, templateClassNameCapture.node.endIndex ); } const templateStructNameCapture = captures.find( (c) => c.name === "name.definition.template.struct" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (templateStructNameCapture) { return sourceCode.substring( templateStructNameCapture.node.startIndex, templateStructNameCapture.node.endIndex ); } const templateFunctionNameCapture = captures.find( (c) => c.name === "name.definition.template.function" && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); if (templateFunctionNameCapture) { return sourceCode.substring( templateFunctionNameCapture.node.startIndex, templateFunctionNameCapture.node.endIndex ); } } const nameCapture = captures.find( (c) => c.name === nameCaptureName && c.node.startIndex >= node.startIndex && c.node.endIndex <= node.endIndex ); return nameCapture ? sourceCode.substring(nameCapture.node.startIndex, nameCapture.node.endIndex) : null; } function buildSummaryFromSnippets14(snippets) { const summary = { includes: [], namespaces: [], classes: [], structs: [], unions: [], enums: [], templates: [], functions: [], methods: [], constructors: [], destructors: [], operators: [], variables: [], typedefs: [], usings: [] }; snippets.forEach((snippet) => { switch (snippet.type) { case "import_or_include" /* ImportOrInclude */: summary.includes.push(snippet.name); break; case "function_or_method" /* FunctionOrMethod */: if (snippet.definition?.type === "function") { summary.functions.push(snippet.name); } else if (snippet.definition?.type === "method") { summary.methods.push(snippet.name); } else if (snippet.definition?.type === "constructor") { summary.constructors.push(snippet.name); } else if (snippet.definition?.type === "destructor") { summary.destructors.push(snippet.name); } else if (snippet.definition?.type === "operator") { summary.operators.push(snippet.name); } else if (snippet.definition?.type === "template_function") { summary.functions.push(snippet.name); } break; case "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */: if (snippet.definition?.type === "class") { summary.classes.push(snippet.name); } else if (snippet.definition?.type === "struct") { summary.structs.push(snippet.name); } else if (snippet.definition?.type === "union") { summary.unions.push(snippet.name); } else if (snippet.definition?.type === "enum") { summary.enums.push(snippet.name); } else if (snippet.definition?.type === "template_class" || snippet.definition?.type === "template_struct") { summary.templates.push(snippet.name); } else if (snippet.definition?.type === "namespace") { summary.namespaces.push(snippet.name); } else if (snippet.definition?.type === "typedef") { summary.typedefs.push(snippet.name); } else if (snippet.definition?.type === "using") { summary.usings.push(snippet.name); } break; case "variable_or_constant" /* VariableOrConstant */: summary.variables.push(snippet.name); break; } }); return summary; } function formatOutlineText14(summary) { let outline = ""; if (summary.includes.length > 0) { outline += `Includes: ${summary.includes.join(", ")} `; } if (summary.namespaces.length > 0) { outline += `Namespaces: ${summary.namespaces.join(", ")} `; } if (summary.classes.length > 0) { outline += `Classes: ${summary.classes.join(", ")} `; } if (summary.structs.length > 0) { outline += `Structs: ${summary.structs.join(", ")} `; } if (summary.unions.length > 0) { outline += `Unions: ${summary.unions.join(", ")} `; } if (summary.enums.length > 0) { outline += `Enums: ${summary.enums.join(", ")} `; } if (summary.templates.length > 0) { outline += `Templates: ${summary.templates.join(", ")} `; } if (summary.functions.length > 0) { outline += `Functions: ${summary.functions.join(", ")} `; } if (summary.methods.length > 0) { outline += `Methods: ${summary.methods.join(", ")} `; } if (summary.constructors.length > 0) { outline += `Constructors: ${summary.constructors.join(", ")} `; } if (summary.destructors.length > 0) { outline += `Destructors: ${summary.destructors.join(", ")} `; } if (summary.operators.length > 0) { outline += `Operators: ${summary.operators.join(", ")} `; } if (summary.variables.length > 0) { outline += `Variables: ${summary.variables.join(", ")} `; } if (summary.typedefs.length > 0) { outline += `Typedefs: ${summary.typedefs.join(", ")} `; } if (summary.usings.length > 0) { outline += `Usings: ${summary.usings.join(", ")} `; } return outline; } // ../autocompletion/v2/capturesProcess/index.ts var extractSnippetsFromCaptures = { ["go" /* Go */]: extractSnippetsFromCapturesForGo, ["python" /* Python */]: extractSnippetsFromCapturesForPython, ["java" /* Java */]: extractSnippetsFromCapturesForJava, ["javascript" /* JavaScript */]: extractSnippetsFromCapturesForJavaScript, ["jsx" /* JSX */]: extractSnippetsFromCapturesForJSX, ["typescript" /* TypeScript */]: extractSnippetsFromCapturesForTypeScript, ["tsx" /* TSX */]: extractSnippetsFromCapturesForTSX, ["swift" /* Swift */]: extractSnippetsFromCapturesForSwift, ["css" /* CSS */]: extractSnippetsFromCapturesForCSS, ["html" /* HTML */]: extractSnippetsFromCapturesForHTML, ["kotlin" /* Kotlin */]: extractSnippetsFromCapturesForKotlin, ["php" /* PHP */]: extractSnippetsFromCapturesForPHP, ["rust" /* Rust */]: extractSnippetsFromCapturesForRust, ["c" /* C */]: extractSnippetsFromCapturesForC, ["cpp" /* CPP */]: extractSnippetsFromCapturesForCPP, ["unknown" /* Unknown */]: extractSnippetsFromCapturesForGeneral }; var generateOverViewFromSnippets = { ["go" /* Go */]: (snippets) => { return formatOutlineText(buildSummaryFromSnippets(snippets)); }, ["python" /* Python */]: (snippets) => { return formatOutlineText2(buildSummaryFromSnippets2(snippets)); }, ["java" /* Java */]: (snippets) => { return formatOutlineText3(buildSummaryFromSnippets3(snippets)); }, ["javascript" /* JavaScript */]: (snippets) => { return ""; }, ["jsx" /* JSX */]: (snippets) => { return formatOutlineText4(buildSummaryFromSnippets4(snippets)); }, ["typescript" /* TypeScript */]: (snippets) => { return formatOutlineText5(buildSummaryFromSnippets5(snippets)); }, ["tsx" /* TSX */]: (snippets) => { return formatOutlineText6(buildSummaryFromSnippets6(snippets)); }, ["swift" /* Swift */]: (snippets) => { return formatOutlineText7(buildSummaryFromSnippets7(snippets)); }, ["css" /* CSS */]: (snippets) => { return formatOutlineText8(buildSummaryFromSnippets8(snippets)); }, ["html" /* HTML */]: (snippets) => { return formatOutlineText9(buildSummaryFromSnippets9(snippets)); }, ["kotlin" /* Kotlin */]: (snippets) => { return formatOutlineText10(buildSummaryFromSnippets10(snippets)); }, ["php" /* PHP */]: (snippets) => { return formatOutlineText11(buildSummaryFromSnippets11(snippets)); }, ["rust" /* Rust */]: (snippets) => { return formatOutlineText12(buildSummaryFromSnippets12(snippets)); }, ["c" /* C */]: (snippets) => { return formatOutlineText13(buildSummaryFromSnippets13(snippets)); }, ["cpp" /* CPP */]: (snippets) => { return formatOutlineText14(buildSummaryFromSnippets14(snippets)); }, ["unknown" /* Unknown */]: (snippets) => { return ""; } }; // ../autocompletion/v2/dependenciesProcess/queries/go.ts var go_default2 = `(call_expression function: (identifier) @function.call.direct) (call_expression function: (selector_expression operand: (identifier) @method.call.receiver field: (field_identifier) @method.call.name))`; // ../autocompletion/v2/dependenciesProcess/queries/typescript.ts var typescript_default2 = ` ; \u76F4\u63A5\u51FD\u6570\u8C03\u7528 - function() (call_expression function: (identifier) @function.call.direct) ; \u65B9\u6CD5\u8C03\u7528 - object.method() (call_expression function: (member_expression object: (identifier) @method.call.receiver property: (property_identifier) @method.call.name) (#not-match? @method.call.receiver "^[A-Z]")) ; \u94FE\u5F0F\u65B9\u6CD5\u8C03\u7528 - object.method1().method2() (call_expression function: (member_expression object: (call_expression) property: (property_identifier) @method.call.chain)) ; \u9759\u6001\u65B9\u6CD5\u8C03\u7528 - Class.staticMethod() (\u9996\u5B57\u6BCD\u5927\u5199\u7684\u6807\u8BC6\u7B26) (call_expression function: (member_expression object: (identifier) @static.call.class property: (property_identifier) @static.call.method) (#match? @static.call.class "^[A-Z]")) ; \u547D\u540D\u7A7A\u95F4/\u6A21\u5757\u8C03\u7528 - namespace.function() (call_expression function: (member_expression object: (identifier) @namespace.call.name property: (property_identifier) @namespace.call.function) (#match? @namespace.call.name "^[A-Z]") (#not-match? @namespace.call.function "^(constructor|new|create|get|set|add|remove|update|delete)$")) ; \u5D4C\u5957\u5C5E\u6027\u8C03\u7528 - object.nested.method() (call_expression function: (member_expression object: (member_expression object: (identifier) @nested.call.root property: (property_identifier) @nested.call.intermediate) property: (property_identifier) @nested.call.method)) ; this \u65B9\u6CD5\u8C03\u7528 - this.method() (call_expression function: (member_expression object: (this) @this.call.receiver property: (property_identifier) @this.call.method)) ; super \u65B9\u6CD5\u8C03\u7528 - super.method() (call_expression function: (member_expression object: (super) @super.call.receiver property: (property_identifier) @super.call.method)) ; \u7BAD\u5934\u51FD\u6570\u8C03\u7528 - (() => {})() (call_expression function: (arrow_function) @arrow.call.function) ; \u51FD\u6570\u8868\u8FBE\u5F0F\u8C03\u7528 - (function() {})() (call_expression function: (function_expression) @function.call.expression) ; \u6570\u7EC4\u65B9\u6CD5\u8C03\u7528 - array.map(), array.filter() (call_expression function: (member_expression object: (identifier) @array.call.object property: (property_identifier) @array.call.method) (#match? @array.call.method "^(map|filter|reduce|forEach|find|some|every|sort|push|pop|shift|unshift|slice|splice|concat|join|indexOf|includes)$")) ; Promise \u65B9\u6CD5\u8C03\u7528 - promise.then(), promise.catch() (\u660E\u786E\u7684Promise\u65B9\u6CD5) (call_expression function: (member_expression object: (identifier) @promise.call.object property: (property_identifier) @promise.call.method) (#match? @promise.call.method "^(then|catch|finally)$")) ; \u53EF\u9009\u94FE\u8C03\u7528 - object?.method?.() (call_expression function: (member_expression object: (identifier) @optional.call.receiver property: (property_identifier) @optional.call.method)) ; \u6784\u9020\u51FD\u6570\u8C03\u7528 - new Constructor() (new_expression constructor: (identifier) @constructor.call.name) ; \u6CDB\u578B\u51FD\u6570\u8C03\u7528 - genericFunction() (call_expression function: (identifier) @generic.call.function type_arguments: (type_arguments)) ; \u6A21\u677F\u5B57\u7B26\u4E32\u4E2D\u7684\u8868\u8FBE\u5F0F\u8C03\u7528 (template_substitution (call_expression function: (identifier) @template.call.function)) ; await \u8868\u8FBE\u5F0F\u4E2D\u7684\u51FD\u6570\u8C03\u7528 (await_expression (call_expression function: (identifier) @await.call.function)) ; \u5F02\u6B65\u65B9\u6CD5\u8C03\u7528 (await_expression (call_expression function: (member_expression object: (identifier) @async.call.receiver property: (property_identifier) @async.call.method))) `; // ../autocompletion/v2/dependenciesProcess/queries/javascript.ts var javascript_default2 = ` ; \u76F4\u63A5\u51FD\u6570\u8C03\u7528 - function() (call_expression function: (identifier) @function.call.direct) ; \u65B9\u6CD5\u8C03\u7528 - object.method() (call_expression function: (member_expression object: (identifier) @method.call.receiver property: (property_identifier) @method.call.name) (#not-match? @method.call.receiver "^[A-Z]")) ; \u94FE\u5F0F\u65B9\u6CD5\u8C03\u7528 - object.method1().method2() (call_expression function: (member_expression object: (call_expression) property: (property_identifier) @method.call.chain)) ; \u9759\u6001\u65B9\u6CD5\u8C03\u7528 - Class.staticMethod() (\u9996\u5B57\u6BCD\u5927\u5199\u7684\u6807\u8BC6\u7B26) (call_expression function: (member_expression object: (identifier) @static.call.class property: (property_identifier) @static.call.method) (#match? @static.call.class "^[A-Z]")) ; \u547D\u540D\u7A7A\u95F4/\u6A21\u5757\u8C03\u7528 - namespace.function() (call_expression function: (member_expression object: (identifier) @namespace.call.name property: (property_identifier) @namespace.call.function) (#match? @namespace.call.name "^[A-Z]") (#not-match? @namespace.call.function "^(constructor|new|create|get|set|add|remove|update|delete)$")) ; \u5D4C\u5957\u5C5E\u6027\u8C03\u7528 - object.nested.method() (call_expression function: (member_expression object: (member_expression object: (identifier) @nested.call.root property: (property_identifier) @nested.call.intermediate) property: (property_identifier) @nested.call.method)) ; this \u65B9\u6CD5\u8C03\u7528 - this.method() (call_expression function: (member_expression object: (this) @this.call.receiver property: (property_identifier) @this.call.method)) ; super \u65B9\u6CD5\u8C03\u7528 - super.method() (call_expression function: (member_expression object: (super) @super.call.receiver property: (property_identifier) @super.call.method)) ; \u7BAD\u5934\u51FD\u6570\u8C03\u7528 - (() => {})() (call_expression function: (arrow_function) @arrow.call.function) ; \u51FD\u6570\u8868\u8FBE\u5F0F\u8C03\u7528 - (function() {})() (call_expression function: (function_expression) @function.call.expression) ; \u6570\u7EC4\u65B9\u6CD5\u8C03\u7528 - array.map(), array.filter() (call_expression function: (member_expression object: (identifier) @array.call.object property: (property_identifier) @array.call.method) (#match? @array.call.method "^(map|filter|reduce|forEach|find|some|every|sort|push|pop|shift|unshift|slice|splice|concat|join|indexOf|includes)$")) ; Promise \u65B9\u6CD5\u8C03\u7528 - promise.then(), promise.catch() (\u660E\u786E\u7684Promise\u65B9\u6CD5) (call_expression function: (member_expression object: (identifier) @promise.call.object property: (property_identifier) @promise.call.method) (#match? @promise.call.method "^(then|catch|finally)$")) ; \u53EF\u9009\u94FE\u8C03\u7528 - object?.method?.() (call_expression function: (member_expression object: (identifier) @optional.call.receiver property: (property_identifier) @optional.call.method)) ; \u6784\u9020\u51FD\u6570\u8C03\u7528 - new Constructor() (new_expression constructor: (identifier) @constructor.call.name) ; \u6A21\u677F\u5B57\u7B26\u4E32\u4E2D\u7684\u8868\u8FBE\u5F0F\u8C03\u7528 (template_substitution (call_expression function: (identifier) @template.call.function)) ; await \u8868\u8FBE\u5F0F\u4E2D\u7684\u51FD\u6570\u8C03\u7528 (await_expression (call_expression function: (identifier) @await.call.function)) ; \u5F02\u6B65\u65B9\u6CD5\u8C03\u7528 (await_expression (call_expression function: (member_expression object: (identifier) @async.call.receiver property: (property_identifier) @async.call.method))) `; // ../autocompletion/v2/dependenciesProcess/queries/java.ts var java_default2 = ` ; \u76F4\u63A5\u65B9\u6CD5\u8C03\u7528 - method() (method_invocation name: (identifier) @method.call.direct) ; \u5BF9\u8C61\u65B9\u6CD5\u8C03\u7528 - object.method() (method_invocation object: (identifier) @method.call.receiver name: (identifier) @method.call.name) ; \u94FE\u5F0F\u65B9\u6CD5\u8C03\u7528 - object.method1().method2() (method_invocation object: (method_invocation) name: (identifier) @method.call.chain) ; \u9759\u6001\u65B9\u6CD5\u8C03\u7528 - Class.staticMethod() (method_invocation object: (identifier) @static.call.class name: (identifier) @static.call.method (#match? @static.call.class "^[A-Z]")) ; this \u65B9\u6CD5\u8C03\u7528 - this.method() (method_invocation object: (this) @this.call.receiver name: (identifier) @this.call.method) ; super \u65B9\u6CD5\u8C03\u7528 - super.method() (method_invocation object: (super) @super.call.receiver name: (identifier) @super.call.method) ; \u6784\u9020\u51FD\u6570\u8C03\u7528 - new Constructor() (object_creation_expression type: (type_identifier) @constructor.call.name) `; // ../autocompletion/v2/dependenciesProcess/queries/python.ts var python_default2 = ` ; \u76F4\u63A5\u51FD\u6570\u8C03\u7528 - function() (call function: (identifier) @function.call.direct) ; \u65B9\u6CD5\u8C03\u7528 - object.method() (call function: (attribute object: (identifier) @method.call.receiver attribute: (identifier) @method.call.name)) ; \u7C7B\u65B9\u6CD5\u8C03\u7528 - ClassName.method() (\u9996\u5B57\u6BCD\u5927\u5199) (call function: (attribute object: (identifier) @class.call.name attribute: (identifier) @class.call.method) (#match? @class.call.name "^[A-Z]")) ; \u94FE\u5F0F\u65B9\u6CD5\u8C03\u7528 - obj.method1().method2() (call function: (attribute object: (call) attribute: (identifier) @method.call.chain)) ; self\u65B9\u6CD5\u8C03\u7528 - self.method() (call function: (attribute object: (identifier) @self.call.receiver attribute: (identifier) @self.call.method) (#eq? @self.call.receiver "self")) ; super\u65B9\u6CD5\u8C03\u7528 - super().method() (call function: (attribute object: (call function: (identifier) @super.call.function) attribute: (identifier) @super.call.method) (#eq? @super.call.function "super")) ; \u5F02\u6B65\u51FD\u6570\u8C03\u7528 - await function() (await (call function: (identifier) @async.call.function)) ; \u5F02\u6B65\u65B9\u6CD5\u8C03\u7528 - await obj.method() (await (call function: (attribute object: (identifier) @async.call.receiver attribute: (identifier) @async.call.method))) ; \u88C5\u9970\u5668\u51FD\u6570\u8C03\u7528 - @decorator (decorator (identifier) @decorator.call.function) ; \u88C5\u9970\u5668\u65B9\u6CD5\u8C03\u7528 - @obj.decorator (decorator (attribute object: (identifier) @decorator.call.receiver attribute: (identifier) @decorator.call.method)) ; \u5217\u8868\u63A8\u5BFC\u5F0F\u4E2D\u7684\u51FD\u6570\u8C03\u7528 (list_comprehension (call function: (identifier) @comprehension.call.function)) ; \u5217\u8868\u63A8\u5BFC\u5F0F\u4E2D\u7684\u65B9\u6CD5\u8C03\u7528 (list_comprehension (call function: (attribute object: (identifier) @comprehension.call.receiver attribute: (identifier) @comprehension.call.method))) ; \u751F\u6210\u5668\u8868\u8FBE\u5F0F\u4E2D\u7684\u51FD\u6570\u8C03\u7528 (generator_expression (call function: (identifier) @generator.call.function)) ; \u751F\u6210\u5668\u8868\u8FBE\u5F0F\u4E2D\u7684\u65B9\u6CD5\u8C03\u7528 (generator_expression (call function: (attribute object: (identifier) @generator.call.receiver attribute: (identifier) @generator.call.method))) ; Lambda \u8868\u8FBE\u5F0F\u4E2D\u7684\u51FD\u6570\u8C03\u7528 (lambda (call function: (identifier) @lambda.call.function)) ; Lambda \u8868\u8FBE\u5F0F\u4E2D\u7684\u65B9\u6CD5\u8C03\u7528 (lambda (call function: (attribute object: (identifier) @lambda.call.receiver attribute: (identifier) @lambda.call.method))) ; \u5D4C\u5957\u5C5E\u6027\u8C03\u7528 - obj.attr.method() (call function: (attribute object: (attribute object: (identifier) @nested.call.root attribute: (identifier) @nested.call.intermediate) attribute: (identifier) @nested.call.method)) ; \u51FD\u6570\u4F5C\u4E3A\u53C2\u6570\u7684\u8C03\u7528 - func(other_func) (call function: (identifier) @function.call.direct arguments: (argument_list (identifier) @function.call.argument)) ; \u65B9\u6CD5\u4F5C\u4E3A\u53C2\u6570\u7684\u8C03\u7528 - func(obj.method) (call function: (identifier) @function.call.direct arguments: (argument_list (attribute object: (identifier) @method.call.receiver attribute: (identifier) @method.call.name))) `; // ../autocompletion/v2/dependenciesProcess/queries/jsx.ts var jsx_default2 = ` ; === React\u7279\u5B9A\u67E5\u8BE2\uFF08\u4F18\u5148\u7EA7\u6700\u9AD8\uFF09=== ; \u9AD8\u9636\u7EC4\u4EF6 HOC \u8C03\u7528 - withRouter(Component), memo(Component) - \u5FC5\u987B\u5728\u76F4\u63A5\u51FD\u6570\u8C03\u7528\u4E4B\u524D (call_expression function: (identifier) @hoc.call.name arguments: (arguments (identifier) @hoc.call.component) (#match? @hoc.call.name "^(with[A-Z]|connect|memo|forwardRef)")) ; React.createElement \u8C03\u7528 - \u5FC5\u987B\u5728\u5176\u4ED6\u65B9\u6CD5\u8C03\u7528\u4E4B\u524D (call_expression function: (member_expression object: (identifier) @react.create.namespace property: (property_identifier) @react.create.method) (#eq? @react.create.namespace "React") (#eq? @react.create.method "createElement")) ; State \u76F8\u5173 hooks - useState, useReducer (call_expression function: (identifier) @state.hook.call (#match? @state.hook.call "^(useState|useReducer)$")) ; Effect \u76F8\u5173 hooks - useEffect, useLayoutEffect (call_expression function: (identifier) @effect.hook.call (#match? @effect.hook.call "^(useEffect|useLayoutEffect|useInsertionEffect)$")) ; Memo \u76F8\u5173 hooks - useMemo, useCallback (call_expression function: (identifier) @memo.hook.call (#match? @memo.hook.call "^(useMemo|useCallback)$")) ; Ref \u8C03\u7528 - useRef, createRef (call_expression function: (identifier) @ref.hook.call (#match? @ref.hook.call "^(useRef|createRef)$")) ; Context \u8C03\u7528 - useContext(ThemeContext) (call_expression function: (identifier) @context.hook.call (#eq? @context.hook.call "useContext")) ; \u5176\u4ED6 React Hooks \u8C03\u7528 - \u4E0D\u5728\u4E0A\u8FF0\u7279\u5B9A\u5206\u7C7B\u4E2D\u7684hooks (call_expression function: (identifier) @react.hook.call (#match? @react.hook.call "^use[A-Z]") (#not-match? @react.hook.call "^(useState|useReducer|useEffect|useLayoutEffect|useInsertionEffect|useMemo|useCallback|useRef|createRef|useContext)$")) ; Event handlers \u5728\u8C03\u7528\u8868\u8FBE\u5F0F\u4E2D - handleClick() (call_expression function: (identifier) @event.handler.function (#match? @event.handler.function "^handle[A-Z]")) ; === \u5F02\u6B65\u8C03\u7528\uFF08\u4F18\u5148\u7EA7\u8F83\u9AD8\uFF09=== ; await \u8868\u8FBE\u5F0F\u4E2D\u7684\u51FD\u6570\u8C03\u7528 (await_expression (call_expression function: (identifier) @await.call.function)) ; \u5F02\u6B65\u65B9\u6CD5\u8C03\u7528 (await_expression (call_expression function: (member_expression object: (identifier) @async.call.receiver property: (property_identifier) @async.call.method))) ; === \u7279\u5B9A\u65B9\u6CD5\u8C03\u7528\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E\u901A\u7528\u65B9\u6CD5\u8C03\u7528\uFF09=== ; Promise \u65B9\u6CD5\u8C03\u7528 - promise.then(), promise.catch() (call_expression function: (member_expression object: (identifier) @promise.call.object property: (property_identifier) @promise.call.method) (#match? @promise.call.method "^(then|catch|finally)$")) ; \u6570\u7EC4\u65B9\u6CD5\u8C03\u7528 - array.map(), array.filter() (call_expression function: (member_expression object: (identifier) @array.call.object property: (property_identifier) @array.call.method) (#match? @array.call.method "^(map|filter|reduce|forEach|find|some|every|sort|push|pop|shift|unshift|slice|splice|concat|join|indexOf|includes)$")) ; === \u6784\u9020\u51FD\u6570\u548C\u7C7B\u8C03\u7528 === ; \u6784\u9020\u51FD\u6570\u8C03\u7528 - new Constructor() (new_expression constructor: (identifier) @constructor.call.name) ; \u9759\u6001\u65B9\u6CD5\u8C03\u7528 - Class.staticMethod() (\u9996\u5B57\u6BCD\u5927\u5199\u7684\u6807\u8BC6\u7B26) (call_expression function: (member_expression object: (identifier) @static.call.class property: (property_identifier) @static.call.method) (#match? @static.call.class "^[A-Z]")) ; === \u5BF9\u8C61\u65B9\u6CD5\u8C03\u7528 === ; this \u65B9\u6CD5\u8C03\u7528 - this.method() (call_expression function: (member_expression object: (this) @this.call.receiver property: (property_identifier) @this.call.method)) ; super \u65B9\u6CD5\u8C03\u7528 - super.method() (call_expression function: (member_expression object: (super) @super.call.receiver property: (property_identifier) @super.call.method)) ; \u53EF\u9009\u94FE\u8C03\u7528 - object?.method?.() (call_expression function: (member_expression object: (identifier) @optional.call.receiver property: (property_identifier) @optional.call.method)) ; \u94FE\u5F0F\u65B9\u6CD5\u8C03\u7528 - object.method1().method2() (call_expression function: (member_expression object: (call_expression) property: (property_identifier) @method.call.chain)) ; \u5D4C\u5957\u5C5E\u6027\u8C03\u7528 - object.nested.method() (call_expression function: (member_expression object: (member_expression object: (identifier) @nested.call.root property: (property_identifier) @nested.call.intermediate) property: (property_identifier) @nested.call.method)) ; \u65B9\u6CD5\u8C03\u7528 - object.method() (call_expression function: (member_expression object: (identifier) @method.call.receiver property: (property_identifier) @method.call.name) (#not-match? @method.call.receiver "^[A-Z]")) ; === \u547D\u540D\u7A7A\u95F4\u8C03\u7528 === ; \u547D\u540D\u7A7A\u95F4/\u6A21\u5757\u8C03\u7528 - namespace.function() (call_expression function: (member_expression object: (identifier) @namespace.call.name property: (property_identifier) @namespace.call.function) (#match? @namespace.call.name "^[A-Z]") (#not-match? @namespace.call.function "^(constructor|new|create|get|set|add|remove|update|delete)$")) ; === \u7279\u6B8A\u51FD\u6570\u8C03\u7528 === ; \u7BAD\u5934\u51FD\u6570\u8C03\u7528 - (() => {})() (call_expression function: (arrow_function) @arrow.call.function) ; \u51FD\u6570\u8868\u8FBE\u5F0F\u8C03\u7528 - (function() {})() (call_expression function: (function_expression) @function.call.expression) ; \u6A21\u677F\u5B57\u7B26\u4E32\u4E2D\u7684\u8868\u8FBE\u5F0F\u8C03\u7528 (template_substitution (call_expression function: (identifier) @template.call.function)) ; === \u901A\u7528\u76F4\u63A5\u51FD\u6570\u8C03\u7528\uFF08\u4F18\u5148\u7EA7\u6700\u4F4E\uFF09=== ; \u76F4\u63A5\u51FD\u6570\u8C03\u7528 - function() (call_expression function: (identifier) @function.call.direct) `; // ../autocompletion/v2/dependenciesProcess/queries/tsx.ts var tsx_default2 = ` ; === React\u7279\u5B9A\u67E5\u8BE2\uFF08\u4F18\u5148\u7EA7\u6700\u9AD8\uFF09=== ; \u9AD8\u9636\u7EC4\u4EF6 HOC \u8C03\u7528 - withRouter(Component), memo(Component) - \u5FC5\u987B\u5728\u76F4\u63A5\u51FD\u6570\u8C03\u7528\u4E4B\u524D (call_expression function: (identifier) @hoc.call.name arguments: (arguments (identifier) @hoc.call.component) (#match? @hoc.call.name "^(with[A-Z]|connect|memo|forwardRef)")) ; React.createElement \u8C03\u7528 - \u5FC5\u987B\u5728\u5176\u4ED6\u65B9\u6CD5\u8C03\u7528\u4E4B\u524D (call_expression function: (member_expression object: (identifier) @react.create.namespace property: (property_identifier) @react.create.method) (#eq? @react.create.namespace "React") (#eq? @react.create.method "createElement")) ; State \u76F8\u5173 hooks - useState, useReducer (call_expression function: (identifier) @state.hook.call (#match? @state.hook.call "^(useState|useReducer)$")) ; Effect \u76F8\u5173 hooks - useEffect, useLayoutEffect (call_expression function: (identifier) @effect.hook.call (#match? @effect.hook.call "^(useEffect|useLayoutEffect|useInsertionEffect)$")) ; Memo \u76F8\u5173 hooks - useMemo, useCallback (call_expression function: (identifier) @memo.hook.call (#match? @memo.hook.call "^(useMemo|useCallback)$")) ; Ref \u8C03\u7528 - useRef, createRef (call_expression function: (identifier) @ref.hook.call (#match? @ref.hook.call "^(useRef|createRef)$")) ; Context \u8C03\u7528 - useContext(ThemeContext) (call_expression function: (identifier) @context.hook.call (#eq? @context.hook.call "useContext")) ; \u5176\u4ED6 React Hooks \u8C03\u7528 - \u4E0D\u5728\u4E0A\u8FF0\u7279\u5B9A\u5206\u7C7B\u4E2D\u7684hooks (call_expression function: (identifier) @react.hook.call (#match? @react.hook.call "^use[A-Z]") (#not-match? @react.hook.call "^(useState|useReducer|useEffect|useLayoutEffect|useInsertionEffect|useMemo|useCallback|useRef|createRef|useContext)$")) ; Event handlers \u5728\u8C03\u7528\u8868\u8FBE\u5F0F\u4E2D - handleClick() (call_expression function: (identifier) @event.handler.function (#match? @event.handler.function "^handle[A-Z]")) ; === TypeScript\u7279\u5B9A\u67E5\u8BE2 === ; \u6CDB\u578B\u51FD\u6570\u8C03\u7528 - function() (call_expression function: (identifier) @generic.call.function type_arguments: (type_arguments)) ; \u6CDB\u578B\u65B9\u6CD5\u8C03\u7528 - object.method() (call_expression function: (member_expression object: (identifier) @generic.call.receiver property: (property_identifier) @generic.call.method) type_arguments: (type_arguments)) ; \u6CDB\u578BPromise\u65B9\u6CD5\u8C03\u7528 - promise.then() (call_expression function: (member_expression object: (identifier) @promise.call.object property: (property_identifier) @promise.call.method) type_arguments: (type_arguments) (#match? @promise.call.method "^(then|catch|finally)$")) ; \u7C7B\u578B\u65AD\u8A00\u8C03\u7528 - as Type (as_expression) @type.assertion ; === \u5F02\u6B65\u8C03\u7528\uFF08\u4F18\u5148\u7EA7\u8F83\u9AD8\uFF09=== ; await \u8868\u8FBE\u5F0F\u4E2D\u7684\u51FD\u6570\u8C03\u7528 (await_expression (call_expression function: (identifier) @await.call.function)) ; \u5F02\u6B65\u65B9\u6CD5\u8C03\u7528 (await_expression (call_expression function: (member_expression object: (identifier) @async.call.receiver property: (property_identifier) @async.call.method))) ; === \u7279\u5B9A\u65B9\u6CD5\u8C03\u7528\uFF08\u4F18\u5148\u7EA7\u9AD8\u4E8E\u901A\u7528\u65B9\u6CD5\u8C03\u7528\uFF09=== ; Promise \u65B9\u6CD5\u8C03\u7528 - promise.then(), promise.catch() (call_expression function: (member_expression object: (identifier) @promise.call.object property: (property_identifier) @promise.call.method) (#match? @promise.call.method "^(then|catch|finally)$")) ; \u6570\u7EC4\u65B9\u6CD5\u8C03\u7528 - array.map(), array.filter() (call_expression function: (member_expression object: (identifier) @array.call.object property: (property_identifier) @array.call.method) (#match? @array.call.method "^(map|filter|reduce|forEach|find|some|every|sort|push|pop|shift|unshift|slice|splice|concat|join|indexOf|includes)$")) ; === \u6784\u9020\u51FD\u6570\u548C\u7C7B\u8C03\u7528 === ; \u6784\u9020\u51FD\u6570\u8C03\u7528 - new Constructor() (new_expression constructor: (identifier) @constructor.call.name) ; \u6CDB\u578B\u6784\u9020\u51FD\u6570\u8C03\u7528 - new Constructor() (new_expression constructor: (identifier) @generic.constructor.call.name type_arguments: (type_arguments)) ; \u9759\u6001\u65B9\u6CD5\u8C03\u7528 - Class.staticMethod() (\u9996\u5B57\u6BCD\u5927\u5199\u7684\u6807\u8BC6\u7B26) (call_expression function: (member_expression object: (identifier) @static.call.class property: (property_identifier) @static.call.method) (#match? @static.call.class "^[A-Z]")) ; === \u5BF9\u8C61\u65B9\u6CD5\u8C03\u7528 === ; this \u65B9\u6CD5\u8C03\u7528 - this.method() (call_expression function: (member_expression object: (this) @this.call.receiver property: (property_identifier) @this.call.method)) ; super \u65B9\u6CD5\u8C03\u7528 - super.method() (call_expression function: (member_expression object: (super) @super.call.receiver property: (property_identifier) @super.call.method)) ; \u53EF\u9009\u94FE\u8C03\u7528 - object?.method?.() (call_expression function: (member_expression object: (identifier) @optional.call.receiver property: (property_identifier) @optional.call.method)) ; \u94FE\u5F0F\u65B9\u6CD5\u8C03\u7528 - object.method1().method2() (call_expression function: (member_expression object: (call_expression) property: (property_identifier) @method.call.chain)) ; \u5D4C\u5957\u5C5E\u6027\u8C03\u7528 - object.nested.method() (call_expression function: (member_expression object: (member_expression object: (identifier) @nested.call.root property: (property_identifier) @nested.call.intermediate) property: (property_identifier) @nested.call.method)) ; \u65B9\u6CD5\u8C03\u7528 - object.method() (call_expression function: (member_expression object: (identifier) @method.call.receiver property: (property_identifier) @method.call.name) (#not-match? @method.call.receiver "^[A-Z]")) ; === \u547D\u540D\u7A7A\u95F4\u8C03\u7528 === ; \u547D\u540D\u7A7A\u95F4/\u6A21\u5757\u8C03\u7528 - namespace.function() (call_expression function: (member_expression object: (identifier) @namespace.call.name property: (property_identifier) @namespace.call.function) (#match? @namespace.call.name "^[A-Z]") (#not-match? @namespace.call.function "^(constructor|new|create|get|set|add|remove|update|delete)$")) ; === \u7279\u6B8A\u51FD\u6570\u8C03\u7528 === ; \u7BAD\u5934\u51FD\u6570\u8C03\u7528 - (() => {})() (call_expression function: (arrow_function) @arrow.call.function) ; \u51FD\u6570\u8868\u8FBE\u5F0F\u8C03\u7528 - (function() {})() (call_expression function: (function_expression) @function.call.expression) ; \u6A21\u677F\u5B57\u7B26\u4E32\u4E2D\u7684\u8868\u8FBE\u5F0F\u8C03\u7528 (template_substitution (call_expression function: (identifier) @template.call.function)) ; === \u901A\u7528\u76F4\u63A5\u51FD\u6570\u8C03\u7528\uFF08\u4F18\u5148\u7EA7\u6700\u4F4E\uFF09=== ; \u76F4\u63A5\u51FD\u6570\u8C03\u7528 - function() (call_expression function: (identifier) @function.call.direct) `; // ../autocompletion/v2/dependenciesProcess/go.ts function dependenciesCapturesProcessForGo(captures) { const result = analyzeGoFunctionCalls(captures); return result.functionCalls.map((call) => ({ name: call.calledFunctionName, type: "function_or_method" /* FunctionOrMethod */, filePath: "", startLine: call.line, endLine: call.line, startPosition: { row: call.line, column: call.column }, endPosition: { row: call.line, column: call.column }, rangeText: "", fileHash: "" })); } function analyzeGoFunctionCalls(captures) { const functionCalls = []; const scopeInfo = { packageName: void 0, typeName: void 0, functionName: "unknown" }; console.log(`[analyzeGoFunctionCalls] Processing ${captures.length} captures`); const methodCallsByLine = /* @__PURE__ */ new Map(); for (const capture of captures) { const node = capture.node; const captureText = node.text.trim(); const line = node.startPosition.row; console.log(`[analyzeGoFunctionCalls] Processing capture: ${capture.name} = "${captureText}"`); switch (capture.name) { case "function.call.direct": console.log(`[analyzeGoFunctionCalls] Adding direct function call: ${captureText}`); functionCalls.push({ calledFunctionName: captureText, callType: "direct", line: line + 1, column: node.startPosition.column }); break; case "method.call.name": if (!methodCallsByLine.has(line)) { methodCallsByLine.set(line, {}); } methodCallsByLine.get(line).functionName = captureText; break; case "method.call.receiver": if (!methodCallsByLine.has(line)) { methodCallsByLine.set(line, {}); } methodCallsByLine.get(line).receiver = captureText; break; default: console.log(`[analyzeGoFunctionCalls] Unhandled capture type: ${capture.name}`); break; } } for (const [line, callInfo] of methodCallsByLine) { if (callInfo.functionName && callInfo.receiver) { console.log(`[analyzeGoFunctionCalls] Adding method call: ${callInfo.receiver}.${callInfo.functionName}`); functionCalls.push({ calledFunctionName: callInfo.functionName, callType: "method", receiver: callInfo.receiver, line: line + 1, column: 0 }); } } console.log( `[analyzeGoFunctionCalls] Final result: ${functionCalls.length} function calls, scope: ${JSON.stringify(scopeInfo)}` ); return { functionCalls, scopeInfo }; } // ../autocompletion/v2/dependenciesProcess/typescript.ts function dependenciesCapturesProcessForTypeScript(captures) { const result = analyzeTypeScriptFunctionCalls(captures); return result.functionCalls.map((call) => ({ name: call.calledFunctionName, type: "function_or_method" /* FunctionOrMethod */, filePath: "", startLine: call.line, endLine: call.line, startPosition: { row: call.line, column: call.column }, endPosition: { row: call.line, column: call.column }, rangeText: "", fileHash: "", definition: { name: call.calledFunctionName, type: call.callType }, field: call.className || call.namespace, signature: `${call.calledFunctionName}()`, language: "typescript" /* TypeScript */ })); } function analyzeTypeScriptFunctionCalls(captures) { const functionCalls = []; const scopeInfo = { moduleName: void 0, className: void 0, functionName: "unknown", isAsync: false }; const callGroups = /* @__PURE__ */ new Map(); const callsByLine = /* @__PURE__ */ new Map(); for (const capture of captures) { const node = capture.node; const captureText = node.text.trim(); const line = node.startPosition.row; switch (capture.name) { case "function.call.direct": functionCalls.push({ calledFunctionName: captureText, callType: "direct", line: line + 1, column: node.startPosition.column }); break; case "method.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const methodCall = callsByLine.get(line); methodCall.functionName = captureText; methodCall.callType = "method"; break; case "method.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "static.call.class": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const staticCall = callsByLine.get(line); staticCall.className = captureText; staticCall.callType = "static"; break; case "static.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "namespace.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const namespaceCall = callsByLine.get(line); namespaceCall.namespace = captureText; namespaceCall.callType = "namespace"; break; case "namespace.call.function": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "this.call.method": functionCalls.push({ calledFunctionName: captureText, callType: "this", receiver: "this", line: line + 1, column: node.startPosition.column }); break; case "super.call.method": functionCalls.push({ calledFunctionName: captureText, callType: "super", receiver: "super", line: line + 1, column: node.startPosition.column }); break; case "constructor.call.name": functionCalls.push({ calledFunctionName: captureText, callType: "constructor", line: line + 1, column: node.startPosition.column }); break; case "method.call.chain": functionCalls.push({ calledFunctionName: captureText, callType: "chain", line: line + 1, column: node.startPosition.column }); break; case "array.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const arrayCall = callsByLine.get(line); arrayCall.functionName = captureText; arrayCall.callType = "array"; break; case "array.call.object": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "promise.call.method": const promiseGroupKey = `promise-${line}`; if (!callGroups.has(promiseGroupKey)) { callGroups.set(promiseGroupKey, {}); } callGroups.get(promiseGroupKey)["method"] = captureText; callGroups.get(promiseGroupKey)["line"] = line.toString(); callGroups.get(promiseGroupKey)["column"] = node.startPosition.column.toString(); break; case "promise.call.object": const promiseObjGroupKey = `promise-${line}`; if (!callGroups.has(promiseObjGroupKey)) { callGroups.set(promiseObjGroupKey, {}); } callGroups.get(promiseObjGroupKey)["receiver"] = captureText; break; case "await.call.function": functionCalls.push({ calledFunctionName: captureText, callType: "async", isAsync: true, line: line + 1, column: node.startPosition.column }); break; case "async.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncCall = callsByLine.get(line); asyncCall.functionName = captureText; asyncCall.callType = "async"; asyncCall.isAsync = true; break; case "async.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "optional.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const optionalCall = callsByLine.get(line); optionalCall.functionName = captureText; optionalCall.callType = "optional"; optionalCall.isOptional = true; break; case "optional.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "generic.call.function": console.log(`[analyzeTypeScriptFunctionCalls] Adding generic function call: ${captureText}`); functionCalls.push({ calledFunctionName: captureText, callType: "generic", isGeneric: true, line: line + 1, column: node.startPosition.column }); break; case "template.call.function": console.log(`[analyzeTypeScriptFunctionCalls] Adding template function call: ${captureText}`); functionCalls.push({ calledFunctionName: captureText, callType: "template", line: line + 1, column: node.startPosition.column }); break; case "nested.call.root": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const nestedCall = callsByLine.get(line); nestedCall.receiver = captureText; nestedCall.callType = "nested"; break; case "nested.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; default: break; } } for (const [groupKey, group] of callGroups) { if (groupKey.startsWith("promise-") && group["method"] && group["receiver"]) { functionCalls.push({ calledFunctionName: group["method"], callType: "promise", receiver: group["receiver"], line: parseInt(group["line"]) + 1, column: parseInt(group["column"]) }); } } const processedCalls = /* @__PURE__ */ new Set(); for (const [line, callInfo] of callsByLine) { if (callInfo.functionName) { const callTypes = []; if (callInfo.callType === "promise") { callTypes.push({ type: "promise", receiver: callInfo.receiver, functionName: callInfo.functionName }); } if (callInfo.callType === "array") { callTypes.push({ type: "array", receiver: callInfo.receiver, functionName: callInfo.functionName }); } if (callInfo.className) { callTypes.push({ type: "static", receiver: callInfo.className, functionName: callInfo.functionName, className: callInfo.className }); } if (callInfo.namespace) { callTypes.push({ type: "namespace", receiver: callInfo.namespace, functionName: callInfo.functionName, namespace: callInfo.namespace }); } if (callInfo.isAsync) { callTypes.push({ type: "async", receiver: callInfo.receiver, functionName: callInfo.functionName, isAsync: true }); } if (callInfo.callType === "nested") { callTypes.push({ type: "nested", receiver: callInfo.receiver, functionName: callInfo.functionName }); } if (callTypes.length === 0 && callInfo.receiver) { callTypes.push({ type: "method", receiver: callInfo.receiver, functionName: callInfo.functionName }); } for (const callType of callTypes) { const callKey = `${line}-${callType.type}-${callType.functionName}-${callType.receiver || ""}`; if (!processedCalls.has(callKey)) { processedCalls.add(callKey); functionCalls.push({ calledFunctionName: callType.functionName, callType: callType.type, receiver: callType.receiver, className: callType.className, namespace: callType.namespace, line: line + 1, column: 0, isAsync: callType.isAsync, isOptional: callInfo.isOptional, isGeneric: callInfo.isGeneric }); } } } } return { functionCalls, scopeInfo }; } // ../autocompletion/v2/dependenciesProcess/javascript.ts function dependenciesCapturesProcessForJavaScript(captures) { const result = analyzeJavaScriptFunctionCalls(captures); return result.functionCalls.map((call) => ({ name: call.calledFunctionName, type: "function_or_method" /* FunctionOrMethod */, filePath: "", startLine: call.line, endLine: call.line, startPosition: { row: call.line, column: call.column }, endPosition: { row: call.line, column: call.column }, rangeText: "", fileHash: "", definition: { name: call.calledFunctionName, type: call.callType }, field: call.className || call.namespace, signature: `${call.calledFunctionName}()`, language: "javascript" /* JavaScript */ })); } function analyzeJavaScriptFunctionCalls(captures) { const functionCalls = []; const scopeInfo = { moduleName: void 0, className: void 0, functionName: "unknown", isAsync: false }; const callsByLine = /* @__PURE__ */ new Map(); for (const capture of captures) { const node = capture.node; const captureText = node.text.trim(); const line = node.startPosition.row; switch (capture.name) { case "function.call.direct": functionCalls.push({ calledFunctionName: captureText, callType: "direct", line: line + 1, column: node.startPosition.column }); break; case "method.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const methodCall = callsByLine.get(line); methodCall.functionName = captureText; methodCall.callType = "method"; break; case "method.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "static.call.class": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const staticCall = callsByLine.get(line); staticCall.className = captureText; staticCall.callType = "static"; break; case "static.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "this.call.method": functionCalls.push({ calledFunctionName: captureText, callType: "this", receiver: "this", line: line + 1, column: node.startPosition.column }); break; case "super.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = "super"; break; case "super.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const superCall = callsByLine.get(line); superCall.functionName = captureText; superCall.callType = "super"; break; case "constructor.call.name": functionCalls.push({ calledFunctionName: captureText, callType: "constructor", line: line + 1, column: node.startPosition.column }); break; case "method.call.chain": functionCalls.push({ calledFunctionName: captureText, callType: "chain", line: line + 1, column: node.startPosition.column }); break; case "namespace.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const namespaceCall = callsByLine.get(line); namespaceCall.namespace = captureText; namespaceCall.callType = "namespace"; break; case "namespace.call.function": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "arrow.call.function": functionCalls.push({ calledFunctionName: "arrow_function", callType: "arrow", line: line + 1, column: node.startPosition.column }); break; case "function.call.expression": functionCalls.push({ calledFunctionName: "function_expression", callType: "arrow", // 归类为箭头函数类型 line: line + 1, column: node.startPosition.column }); break; case "array.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const arrayCall = callsByLine.get(line); arrayCall.functionName = captureText; arrayCall.callType = "array"; break; case "array.call.object": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "promise.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const promiseCall = callsByLine.get(line); promiseCall.functionName = captureText; promiseCall.callType = "promise"; break; case "promise.call.object": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "template.call.function": functionCalls.push({ calledFunctionName: captureText, callType: "template", line: line + 1, column: node.startPosition.column }); break; case "optional.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const optionalCall = callsByLine.get(line); optionalCall.receiver = captureText; optionalCall.isOptional = true; break; case "optional.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const optionalMethodCall = callsByLine.get(line); optionalMethodCall.functionName = captureText; optionalMethodCall.callType = "optional"; break; case "await.call.function": functionCalls.push({ calledFunctionName: captureText, callType: "async", isAsync: true, line: line + 1, column: node.startPosition.column }); break; case "async.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncCall = callsByLine.get(line); asyncCall.receiver = captureText; asyncCall.isAsync = true; break; case "async.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncMethodCall = callsByLine.get(line); asyncMethodCall.functionName = captureText; asyncMethodCall.callType = "async"; break; case "nested.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const nestedCall = callsByLine.get(line); nestedCall.functionName = captureText; nestedCall.callType = "nested"; break; case "nested.call.root": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; default: break; } } for (const [line, callInfo] of callsByLine) { if (callInfo.functionName) { functionCalls.push({ calledFunctionName: callInfo.functionName, callType: callInfo.callType || "method", receiver: callInfo.receiver, className: callInfo.className, namespace: callInfo.namespace, line: line + 1, column: 0, isAsync: callInfo.isAsync, isOptional: callInfo.isOptional }); } } return { functionCalls, scopeInfo }; } // ../autocompletion/v2/dependenciesProcess/java.ts function dependenciesCapturesProcessForJava(captures) { const result = analyzeJavaFunctionCalls(captures); return result.functionCalls.map((call) => ({ name: call.calledFunctionName, type: "function_or_method" /* FunctionOrMethod */, filePath: "", startLine: call.line, endLine: call.line, startPosition: { row: call.line, column: call.column }, endPosition: { row: call.line, column: call.column }, rangeText: "", fileHash: "", definition: { name: call.calledFunctionName, type: call.callType }, field: call.className || call.packageName, signature: `${call.calledFunctionName}()`, language: "java" /* Java */ })); } function analyzeJavaFunctionCalls(captures) { const functionCalls = []; const scopeInfo = { packageName: void 0, className: void 0, functionName: "unknown" }; const callsByLine = /* @__PURE__ */ new Map(); for (const capture of captures) { const node = capture.node; const captureText = node.text.trim(); const line = node.startPosition.row; switch (capture.name) { case "method.call.direct": functionCalls.push({ calledFunctionName: captureText, callType: "direct", line: line + 1, column: node.startPosition.column }); break; case "method.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const methodCall = callsByLine.get(line); methodCall.functionName = captureText; methodCall.callType = "method"; break; case "method.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "static.call.class": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const staticCall = callsByLine.get(line); staticCall.className = captureText; staticCall.callType = "static"; break; case "static.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "this.call.method": functionCalls.push({ calledFunctionName: captureText, callType: "this", receiver: "this", line: line + 1, column: node.startPosition.column }); break; case "super.call.method": functionCalls.push({ calledFunctionName: captureText, callType: "super", receiver: "super", line: line + 1, column: node.startPosition.column }); break; case "constructor.call.name": functionCalls.push({ calledFunctionName: captureText, callType: "constructor", line: line + 1, column: node.startPosition.column }); break; case "method.call.chain": functionCalls.push({ calledFunctionName: captureText, callType: "chain", line: line + 1, column: node.startPosition.column }); break; default: break; } } for (const [line, callInfo] of callsByLine) { if (callInfo.functionName) { const callData = { calledFunctionName: callInfo.functionName, callType: callInfo.callType || "method", receiver: callInfo.receiver, className: callInfo.className, packageName: callInfo.packageName, fieldName: callInfo.fieldName, line: line + 1, column: 0, isGeneric: callInfo.isGeneric, isException: callInfo.isException }; functionCalls.push(callData); } } return { functionCalls, scopeInfo }; } // ../autocompletion/v2/dependenciesProcess/python.ts function dependenciesCapturesProcessForPython(captures) { const result = analyzePythonFunctionCalls(captures); return result.functionCalls.map((call) => ({ name: call.calledFunctionName, type: "function_or_method" /* FunctionOrMethod */, filePath: "", startLine: call.line, endLine: call.line, startPosition: { row: call.line, column: call.column }, endPosition: { row: call.line, column: call.column }, rangeText: "", fileHash: "", definition: { name: call.calledFunctionName, type: call.callType }, field: call.className, signature: `${call.calledFunctionName}()`, language: "python" /* Python */ })); } function analyzePythonFunctionCalls(captures) { const functionCalls = []; const scopeInfo = { moduleName: void 0, className: void 0, functionName: "unknown", isAsync: false }; console.log(`[analyzePythonFunctionCalls] Processing ${captures.length} captures`); const callsByLine = /* @__PURE__ */ new Map(); for (const capture of captures) { const node = capture.node; const captureText = node.text.trim(); const line = node.startPosition.row; console.log(`[analyzePythonFunctionCalls] Processing capture: ${capture.name} = "${captureText}"`); switch (capture.name) { case "function.call.direct": console.log(`[analyzePythonFunctionCalls] Adding direct function call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const directCall = callsByLine.get(line); if (!directCall.functionName) { directCall.functionName = captureText; } if (!directCall.callType) { directCall.callType = "direct"; } break; case "method.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const methodCall = callsByLine.get(line); methodCall.functionName = captureText; methodCall.callType = "method"; break; case "method.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "class.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const classCall = callsByLine.get(line); classCall.className = captureText; classCall.callType = "class"; break; case "class.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "self.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const selfCall = callsByLine.get(line); selfCall.receiver = captureText; selfCall.callType = "self"; break; case "self.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "super.call.function": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const superCall = callsByLine.get(line); superCall.receiver = "super"; superCall.callType = "super"; break; case "super.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "async.call.function": console.log(`[analyzePythonFunctionCalls] Adding async function call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncDirectCall = callsByLine.get(line); asyncDirectCall.functionName = captureText; asyncDirectCall.callType = "async"; asyncDirectCall.isAsync = true; break; case "async.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncCall = callsByLine.get(line); asyncCall.receiver = captureText; asyncCall.callType = "async"; asyncCall.isAsync = true; break; case "async.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "decorator.call.function": console.log(`[analyzePythonFunctionCalls] Adding decorator function call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const decoratorDirectCall = callsByLine.get(line); decoratorDirectCall.functionName = captureText; decoratorDirectCall.callType = "decorator"; decoratorDirectCall.isDecorator = true; break; case "decorator.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const decoratorCall = callsByLine.get(line); decoratorCall.receiver = captureText; decoratorCall.callType = "decorator"; decoratorCall.isDecorator = true; break; case "decorator.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "method.call.chain": console.log(`[analyzePythonFunctionCalls] Adding chain method call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const chainCall = callsByLine.get(line); chainCall.functionName = captureText; chainCall.callType = "chain"; break; case "comprehension.call.function": console.log(`[analyzePythonFunctionCalls] Adding comprehension function call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const comprehensionDirectCall = callsByLine.get(line); comprehensionDirectCall.functionName = captureText; comprehensionDirectCall.callType = "comprehension"; break; case "comprehension.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const comprehensionCall = callsByLine.get(line); comprehensionCall.receiver = captureText; comprehensionCall.callType = "comprehension"; break; case "comprehension.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "generator.call.function": console.log(`[analyzePythonFunctionCalls] Adding generator function call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const generatorDirectCall = callsByLine.get(line); generatorDirectCall.functionName = captureText; generatorDirectCall.callType = "generator"; break; case "generator.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const generatorCall = callsByLine.get(line); generatorCall.receiver = captureText; generatorCall.callType = "generator"; break; case "generator.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "lambda.call.function": console.log(`[analyzePythonFunctionCalls] Adding lambda function call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const lambdaDirectCall = callsByLine.get(line); lambdaDirectCall.functionName = captureText; lambdaDirectCall.callType = "lambda"; break; case "lambda.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const lambdaCall = callsByLine.get(line); lambdaCall.receiver = captureText; lambdaCall.callType = "lambda"; break; case "lambda.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "nested.call.root": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const nestedCall = callsByLine.get(line); nestedCall.root = captureText; nestedCall.callType = "nested"; break; case "nested.call.intermediate": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).intermediate = captureText; break; case "nested.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).functionName = captureText; break; case "function.call.argument": console.log(`[analyzePythonFunctionCalls] Adding argument function call: ${captureText}`); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const argumentCall = callsByLine.get(line); argumentCall.functionName = captureText; argumentCall.callType = "argument"; break; default: console.log(`[analyzePythonFunctionCalls] Unhandled capture type: ${capture.name}`); break; } } const processedCalls = /* @__PURE__ */ new Set(); for (const [line, callInfo] of callsByLine) { if (callInfo.functionName) { let finalCallType = callInfo.callType; if (callInfo.isDecorator) { finalCallType = "decorator"; } else if (callInfo.isAsync) { finalCallType = "async"; } else if (callInfo.receiver === "self") { finalCallType = "self"; } else if (callInfo.className) { finalCallType = "class"; } else if (callInfo.receiver && callInfo.callType === "method") { finalCallType = "method"; } const callKey = `${line}-${finalCallType}-${callInfo.functionName}-${callInfo.receiver || ""}-${callInfo.className || ""}`; if (!processedCalls.has(callKey)) { processedCalls.add(callKey); let receiver = callInfo.receiver; if (finalCallType === "nested" && callInfo.root && callInfo.intermediate) { receiver = `${callInfo.root}.${callInfo.intermediate}`; } functionCalls.push({ calledFunctionName: callInfo.functionName, callType: finalCallType, receiver, className: callInfo.className, line: line + 1, column: 0, isAsync: callInfo.isAsync, isDecorator: callInfo.isDecorator }); console.log( `[analyzePythonFunctionCalls] Adding ${finalCallType} call: ${callInfo.functionName} (receiver: ${receiver || "none"})` ); } } } console.log( `[analyzePythonFunctionCalls] Final result: ${functionCalls.length} function calls, scope: ${JSON.stringify(scopeInfo)}` ); return { functionCalls, scopeInfo }; } // ../autocompletion/v2/dependenciesProcess/jsx.ts function dependenciesCapturesProcessForJSX(captures) { const result = analyzeJSXFunctionCalls(captures); return result.functionCalls.map((call) => ({ name: call.calledFunctionName, type: "function_or_method" /* FunctionOrMethod */, filePath: "", startLine: call.line, endLine: call.line, startPosition: { row: call.line, column: call.column }, endPosition: { row: call.line, column: call.column }, rangeText: "", fileHash: "", definition: { name: call.calledFunctionName, type: call.callType, isAsync: call.isAsync }, field: call.className || call.namespace || call.component || call.context, signature: buildSignatureForJSXCall(call), language: "jsx" /* JSX */ })); } function buildSignatureForJSXCall(call) { switch (call.callType) { case "react_hook": return `${call.calledFunctionName}() // React Hook`; case "react_component": return `${call.calledFunctionName}() // React Component`; case "event_handler": return `${call.calledFunctionName}() // Event Handler`; case "react_create": return `React.createElement(${call.component}) // React.createElement`; case "hoc": return `${call.calledFunctionName}(${call.component}) // Higher-Order Component`; case "context_hook": return `useContext(${call.context}) // Context Hook`; case "ref_hook": return `${call.calledFunctionName}() // Ref Hook`; case "state_hook": return `${call.calledFunctionName}() // State Hook`; case "effect_hook": return `${call.calledFunctionName}() // Effect Hook`; case "memo_hook": return `${call.calledFunctionName}() // Memo Hook`; default: return `${call.calledFunctionName}()`; } } function analyzeJSXFunctionCalls(captures) { const functionCalls = []; const scopeInfo = { moduleName: void 0, componentName: void 0, functionName: "unknown", isAsync: false, isReactComponent: false }; const callsByLine = /* @__PURE__ */ new Map(); const processedCalls = /* @__PURE__ */ new Set(); const priorityGroups = { hoc: [], reactCreate: [], reactHooks: [], eventHandlers: [], awaitCalls: [], arrayMethods: [], promiseMethods: [], directCalls: [], methodCalls: [], other: [] }; for (const capture of captures) { switch (capture.name) { case "hoc.call.name": case "hoc.call.component": priorityGroups.hoc.push(capture); break; case "react.create.namespace": case "react.create.method": priorityGroups.reactCreate.push(capture); break; case "state.hook.call": case "effect.hook.call": case "memo.hook.call": case "ref.hook.call": case "context.hook.call": case "react.hook.call": priorityGroups.reactHooks.push(capture); break; case "event.handler.function": priorityGroups.eventHandlers.push(capture); break; case "await.call.function": case "async.call.receiver": case "async.call.method": priorityGroups.awaitCalls.push(capture); break; case "array.call.method": case "array.call.object": priorityGroups.arrayMethods.push(capture); break; case "promise.call.method": case "promise.call.object": priorityGroups.promiseMethods.push(capture); break; case "function.call.direct": priorityGroups.directCalls.push(capture); break; case "method.call.name": case "method.call.receiver": case "method.call.chain": case "optional.call.receiver": case "optional.call.method": case "static.call.class": case "static.call.method": priorityGroups.methodCalls.push(capture); break; default: priorityGroups.other.push(capture); break; } } const allGroups = [ priorityGroups.hoc, priorityGroups.reactCreate, priorityGroups.reactHooks, priorityGroups.eventHandlers, priorityGroups.awaitCalls, priorityGroups.arrayMethods, priorityGroups.promiseMethods, priorityGroups.methodCalls, priorityGroups.other, priorityGroups.directCalls // 直接调用放最后,优先级最低 ]; for (const group of allGroups) { for (const capture of group) { const node = capture.node; const captureText = node.text.trim(); const line = node.startPosition.row; const callKey = `${line}-${node.startPosition.column}-${captureText}-${capture.name}`; if (processedCalls.has(callKey)) { continue; } if (capture.name === "function.call.direct") { const generalCallKey = `${line}-${captureText}`; let isAlreadyProcessed = false; for (const existingKey of processedCalls) { if (existingKey.includes(generalCallKey)) { isAlreadyProcessed = true; break; } } const lineCall = callsByLine.get(line); if (lineCall?.functionName === captureText) { isAlreadyProcessed = true; } if (isAlreadyProcessed) { continue; } } switch (capture.name) { case "hoc.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const hocCall = callsByLine.get(line); hocCall.functionName = captureText; hocCall.callType = "hoc"; hocCall.isReactSpecific = true; break; case "hoc.call.component": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).component = captureText; break; case "react.create.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const createCall = callsByLine.get(line); createCall.functionName = captureText; createCall.callType = "react_create"; createCall.isReactSpecific = true; break; case "state.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "state_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "effect.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "effect_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "memo.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "memo_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "ref.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "ref_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "context.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "context_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "react.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "react_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "event.handler.function": functionCalls.push({ calledFunctionName: captureText, callType: "event_handler", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "await.call.function": functionCalls.push({ calledFunctionName: captureText, callType: "async", isAsync: true, line: line + 1, column: node.startPosition.column }); processedCalls.add(callKey); break; case "promise.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const promiseCall = callsByLine.get(line); promiseCall.functionName = captureText; promiseCall.callType = "promise"; break; case "promise.call.object": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "array.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const arrayCall = callsByLine.get(line); arrayCall.functionName = captureText; arrayCall.callType = "array"; break; case "array.call.object": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "async.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncCall = callsByLine.get(line); asyncCall.receiver = captureText; asyncCall.isAsync = true; break; case "async.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncMethodCall = callsByLine.get(line); asyncMethodCall.functionName = captureText; asyncMethodCall.callType = "async"; break; case "method.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const methodCall = callsByLine.get(line); if (!methodCall.callType) { methodCall.functionName = captureText; methodCall.callType = "method"; } break; case "method.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "static.call.class": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const staticClassCall = callsByLine.get(line); if (!staticClassCall.callType || staticClassCall.callType === "method") { staticClassCall.className = captureText; staticClassCall.callType = "static"; } break; case "static.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const staticMethodCall = callsByLine.get(line); if (!staticMethodCall.callType || staticMethodCall.callType === "method") { staticMethodCall.functionName = captureText; staticMethodCall.callType = "static"; } break; case "optional.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const optionalCall = callsByLine.get(line); optionalCall.receiver = captureText; optionalCall.isOptional = true; break; case "optional.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const optionalMethodCall = callsByLine.get(line); break; case "function.call.direct": functionCalls.push({ calledFunctionName: captureText, callType: "direct", line: line + 1, column: node.startPosition.column }); processedCalls.add(callKey); break; case "method.call.chain": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const chainCall = callsByLine.get(line); if (captureText.match(/^(then|catch|finally)$/)) { chainCall.functionName = captureText; chainCall.callType = "promise"; } else { if (!chainCall.callType) { chainCall.functionName = captureText; chainCall.callType = "chain"; } } break; // 其他情况处理... default: break; } } } for (const [line, callInfo] of callsByLine) { if (callInfo.functionName) { const callKey = `${line}-0-${callInfo.functionName}-compound`; if (!processedCalls.has(callKey)) { functionCalls.push({ calledFunctionName: callInfo.functionName, callType: callInfo.callType || "method", receiver: callInfo.receiver, className: callInfo.className, namespace: callInfo.namespace, component: callInfo.component, context: callInfo.context, line: line + 1, column: 0, isAsync: callInfo.isAsync, isOptional: callInfo.isOptional, isReactSpecific: callInfo.isReactSpecific }); processedCalls.add(callKey); } } } return { functionCalls, scopeInfo }; } // ../autocompletion/v2/dependenciesProcess/tsx.ts function dependenciesCapturesProcessForTSX(captures) { const result = analyzeTSXFunctionCalls(captures); return result.functionCalls.map((call) => { const def = { name: call.calledFunctionName, type: call.callType, isAsync: call.isAsync }; if (call.isGeneric) def.isGeneric = true; if (call.isReactSpecific) def.isReactSpecific = true; return { name: call.calledFunctionName, type: "function_or_method" /* FunctionOrMethod */, filePath: "", startLine: call.line, endLine: call.line, startPosition: { row: call.line, column: call.column }, endPosition: { row: call.line, column: call.column }, rangeText: "", fileHash: "", definition: def, field: call.className || call.namespace || call.component || call.context || call.typeArgument, signature: buildSignatureForTSXCall(call), language: "tsx" /* TSX */ }; }); } function buildSignatureForTSXCall(call) { switch (call.callType) { case "react_hook": return `${call.calledFunctionName}() // React Hook`; case "react_component": return `${call.calledFunctionName}() // React Component`; case "tsx_component": return `${call.calledFunctionName}() // TSX Component`; case "event_handler": return `${call.calledFunctionName}() // Event Handler`; case "react_create": return `React.createElement(${call.component}) // React.createElement`; case "hoc": return `${call.calledFunctionName}(${call.component}) // Higher-Order Component`; case "context_hook": return `useContext(${call.context}) // Context Hook`; case "ref_hook": return `${call.calledFunctionName}() // Ref Hook`; case "state_hook": return `${call.calledFunctionName}() // State Hook`; case "effect_hook": return `${call.calledFunctionName}() // Effect Hook`; case "memo_hook": return `${call.calledFunctionName}() // Memo Hook`; case "generic_call": return `${call.calledFunctionName}<${call.typeArgument}>() // Generic Function`; case "generic_method": return `${call.receiver}.${call.calledFunctionName}<${call.typeArgument}>() // Generic Method`; case "type_assertion": return `as ${call.typeArgument} // Type Assertion`; default: return `${call.calledFunctionName}()`; } } function analyzeTSXFunctionCalls(captures) { const functionCalls = []; const scopeInfo = { moduleName: void 0, componentName: void 0, functionName: "unknown", isAsync: false, isReactComponent: false, isTypeScript: true }; const callsByLine = /* @__PURE__ */ new Map(); const processedCalls = /* @__PURE__ */ new Set(); const priorityGroups = { hoc: [], reactCreate: [], reactHooks: [], eventHandlers: [], genericCalls: [], typeAssertions: [], awaitCalls: [], arrayMethods: [], promiseMethods: [], directCalls: [], methodCalls: [], other: [] }; for (const capture of captures) { switch (capture.name) { case "hoc.call.name": case "hoc.call.component": priorityGroups.hoc.push(capture); break; case "react.create.namespace": case "react.create.method": priorityGroups.reactCreate.push(capture); break; case "state.hook.call": case "effect.hook.call": case "memo.hook.call": case "ref.hook.call": case "context.hook.call": case "react.hook.call": priorityGroups.reactHooks.push(capture); break; case "event.handler.function": priorityGroups.eventHandlers.push(capture); break; case "generic.call.function": case "generic.call.receiver": case "generic.call.method": case "generic.constructor.call.name": priorityGroups.genericCalls.push(capture); break; case "type.assertion.type": priorityGroups.typeAssertions.push(capture); break; case "await.call.function": case "async.call.receiver": case "async.call.method": priorityGroups.awaitCalls.push(capture); break; case "array.call.method": case "array.call.object": priorityGroups.arrayMethods.push(capture); break; case "promise.call.method": case "promise.call.object": priorityGroups.promiseMethods.push(capture); break; case "function.call.direct": priorityGroups.directCalls.push(capture); break; case "method.call.name": case "method.call.receiver": case "method.call.chain": case "optional.call.receiver": case "optional.call.method": case "static.call.class": case "static.call.method": priorityGroups.methodCalls.push(capture); break; default: priorityGroups.other.push(capture); break; } } const allGroups = [ priorityGroups.hoc, priorityGroups.reactCreate, priorityGroups.reactHooks, priorityGroups.eventHandlers, priorityGroups.genericCalls, priorityGroups.typeAssertions, priorityGroups.awaitCalls, priorityGroups.arrayMethods, priorityGroups.promiseMethods, priorityGroups.methodCalls, priorityGroups.other, priorityGroups.directCalls // 直接调用放最后,优先级最低 ]; for (const group of allGroups) { for (const capture of group) { const node = capture.node; const captureText = node.text.trim(); const line = node.startPosition.row; const callKey = `${line}-${node.startPosition.column}-${captureText}-${capture.name}`; if (processedCalls.has(callKey)) { continue; } if (capture.name === "function.call.direct") { const generalCallKey = `${line}-${captureText}`; let isAlreadyProcessed = false; for (const existingKey of processedCalls) { if (existingKey.includes(generalCallKey)) { isAlreadyProcessed = true; break; } } const lineCall = callsByLine.get(line); if (lineCall?.functionName === captureText) { isAlreadyProcessed = true; } if (isAlreadyProcessed) { continue; } } switch (capture.name) { case "hoc.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const hocCall = callsByLine.get(line); hocCall.functionName = captureText; hocCall.callType = "hoc"; hocCall.isReactSpecific = true; break; case "hoc.call.component": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).component = captureText; break; case "react.create.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const createCall = callsByLine.get(line); createCall.functionName = captureText; createCall.callType = "react_create"; createCall.isReactSpecific = true; break; case "state.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "state_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "effect.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "effect_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "memo.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "memo_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "ref.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "ref_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "context.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "context_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "react.hook.call": functionCalls.push({ calledFunctionName: captureText, callType: "react_hook", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "event.handler.function": console.log( `[DEBUG] Event handler captured: ${captureText} at line ${line + 1}, column ${node.startPosition.column}` ); functionCalls.push({ calledFunctionName: captureText, callType: "event_handler", line: line + 1, column: node.startPosition.column, isReactSpecific: true }); processedCalls.add(callKey); break; case "generic.call.function": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const genericCall = callsByLine.get(line); genericCall.functionName = captureText; genericCall.callType = "generic_call"; genericCall.isGeneric = true; break; case "generic.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "generic.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const genericMethodCall = callsByLine.get(line); genericMethodCall.functionName = captureText; genericMethodCall.callType = "generic_method"; genericMethodCall.isGeneric = true; break; case "generic.constructor.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const genericConstructorCall = callsByLine.get(line); genericConstructorCall.functionName = captureText; genericConstructorCall.callType = "constructor"; genericConstructorCall.isGeneric = true; break; case "type.assertion.type": functionCalls.push({ calledFunctionName: "as", callType: "type_assertion", typeArgument: captureText, line: line + 1, column: node.startPosition.column }); processedCalls.add(callKey); break; case "await.call.function": functionCalls.push({ calledFunctionName: captureText, callType: "async", isAsync: true, line: line + 1, column: node.startPosition.column }); processedCalls.add(callKey); break; case "promise.call.method": console.log( `[DEBUG] Promise method captured: ${captureText} at line ${line + 1}, column ${node.startPosition.column}` ); if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const promiseCall = callsByLine.get(line); promiseCall.functionName = captureText; promiseCall.callType = "promise"; break; case "promise.call.object": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "array.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const arrayCall = callsByLine.get(line); arrayCall.functionName = captureText; arrayCall.callType = "array"; break; case "array.call.object": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "async.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncCall = callsByLine.get(line); asyncCall.receiver = captureText; asyncCall.isAsync = true; break; case "async.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const asyncMethodCall = callsByLine.get(line); asyncMethodCall.functionName = captureText; asyncMethodCall.callType = "async"; break; case "method.call.name": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const methodCall = callsByLine.get(line); if (!methodCall.callType) { methodCall.functionName = captureText; methodCall.callType = "method"; } break; case "method.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } callsByLine.get(line).receiver = captureText; break; case "static.call.class": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const staticClassCall = callsByLine.get(line); if (!staticClassCall.callType || staticClassCall.callType === "method") { staticClassCall.className = captureText; staticClassCall.callType = "static"; } break; case "static.call.method": functionCalls.push({ calledFunctionName: captureText, callType: "static", line: line + 1, column: node.startPosition.column }); processedCalls.add(callKey); break; case "optional.call.receiver": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const optionalCall = callsByLine.get(line); optionalCall.receiver = captureText; optionalCall.isOptional = true; break; case "optional.call.method": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const optionalMethodCall = callsByLine.get(line); break; case "function.call.direct": functionCalls.push({ calledFunctionName: captureText, callType: "direct", line: line + 1, column: node.startPosition.column }); processedCalls.add(callKey); break; case "method.call.chain": if (!callsByLine.has(line)) { callsByLine.set(line, {}); } const chainCall = callsByLine.get(line); if (captureText.match(/^(then|catch|finally)$/)) { chainCall.functionName = captureText; chainCall.callType = "promise"; } else { if (!chainCall.callType) { chainCall.functionName = captureText; chainCall.callType = "chain"; } } break; // 其他情况处理... default: break; } } } for (const [line, callInfo] of callsByLine) { if (callInfo.functionName) { const callKey = `${line}-0-${callInfo.functionName}-compound`; if (!processedCalls.has(callKey)) { let callType = callInfo.callType; if (callType === "event_handler") { } else if (callType === "promise") { } else if (callInfo.className && (callType === "generic_method" || callType === "method")) { callType = "static"; } functionCalls.push({ calledFunctionName: callInfo.functionName, callType: callType || "method", receiver: callInfo.receiver, className: callInfo.className, namespace: callInfo.namespace, component: callInfo.component, context: callInfo.context, typeArgument: callInfo.typeArgument, line: line + 1, column: 0, isAsync: callInfo.isAsync, isOptional: callInfo.isOptional, isReactSpecific: callInfo.isReactSpecific, isGeneric: callInfo.isGeneric }); processedCalls.add(callKey); } } } for (const capture of captures) { if (capture.name === "type.assertion") { const node = capture.node; functionCalls.push({ calledFunctionName: "as", callType: "type_assertion", line: node.startPosition.row + 1, column: node.startPosition.column }); } } return { functionCalls, scopeInfo }; } // ../autocompletion/v2/dependenciesProcess/index.ts var dependenciesCapturesQueries = { ["go" /* Go */]: go_default2, ["python" /* Python */]: python_default2, ["typescript" /* TypeScript */]: typescript_default2, ["javascript" /* JavaScript */]: javascript_default2, ["java" /* Java */]: java_default2, ["jsx" /* JSX */]: jsx_default2, ["tsx" /* TSX */]: tsx_default2, ["swift" /* Swift */]: null, ["css" /* CSS */]: null, ["html" /* HTML */]: null, ["kotlin" /* Kotlin */]: null, ["php" /* PHP */]: null, ["rust" /* Rust */]: null, ["c" /* C */]: null, ["cpp" /* CPP */]: null, ["unknown" /* Unknown */]: null }; var dependenciesProcessors = { ["go" /* Go */]: dependenciesCapturesProcessForGo, ["python" /* Python */]: dependenciesCapturesProcessForPython, ["typescript" /* TypeScript */]: dependenciesCapturesProcessForTypeScript, ["javascript" /* JavaScript */]: dependenciesCapturesProcessForJavaScript, ["java" /* Java */]: dependenciesCapturesProcessForJava, ["jsx" /* JSX */]: dependenciesCapturesProcessForJSX, ["tsx" /* TSX */]: dependenciesCapturesProcessForTSX, ["swift" /* Swift */]: (captures) => [], ["css" /* CSS */]: (captures) => [], ["html" /* HTML */]: (captures) => [], ["kotlin" /* Kotlin */]: (captures) => [], ["php" /* PHP */]: (captures) => [], ["rust" /* Rust */]: (captures) => [], ["c" /* C */]: (captures) => [], ["cpp" /* CPP */]: (captures) => [], ["unknown" /* Unknown */]: (captures) => [] }; // ../autocompletion/v2/utils/languageCommentUtils.ts var lineCommentSymbols = { ["go" /* Go */]: "//", ["python" /* Python */]: "#", ["typescript" /* TypeScript */]: "//", ["javascript" /* JavaScript */]: "//", ["java" /* Java */]: "//", ["unknown" /* Unknown */]: "" }; function formatCodeWithLanguageWithLineComment(text, language) { if (language === "unknown" /* Unknown */) { return text; } const lineCommentSymbol = lineCommentSymbols[language]; if (!lineCommentSymbol) { return text; } const lines = text.split("\n"); const formattedLines = lines.map((line) => { return `${lineCommentSymbol} ${line}`; }); return formattedLines.join("\n"); } // ../autocompletion/v2/utils/treeUtils.ts var fs2 = __toESM(require("fs/promises")); var path3 = __toESM(require("path")); var gitignoreCache = /* @__PURE__ */ new Map(); async function getGitignoreFilter(dirPathRoot) { const gitignorePath = path3.join(dirPathRoot, ".gitignore"); try { const stat2 = await fs2.stat(gitignorePath); const cached = gitignoreCache.get(gitignorePath); if (cached && cached.mtimeMs === stat2.mtimeMs) { return cached.filter; } const content = await fs2.readFile(gitignorePath, "utf8"); const rules = content.split(/\r?\n/).map((l) => l.trim()).filter((l) => l && !l.startsWith("#")); const matchers = rules.map((rule) => { if (rule.endsWith("/")) { const dirRule = rule.replace(/\/$/, ""); return (p, isDir) => isDir && p.includes(dirRule); } else { return (p, isDir) => p.includes(rule); } }); const filter = (p, isDir) => !matchers.some((fn) => fn(p, isDir)); gitignoreCache.set(gitignorePath, { mtimeMs: stat2.mtimeMs, rules, filter }); return filter; } catch { return () => true; } } async function treeView(dirPathRoot, filePaths, limitNum, maxDepth, options = {}) { const { showDotDirs = false, allowOtherExtensions = false } = options; const absRoot = path3.resolve(dirPathRoot); const normFilePaths = filePaths.map((fp) => path3.resolve(dirPathRoot, fp)); const expandDirs = /* @__PURE__ */ new Set(); const siblingDirs = /* @__PURE__ */ new Set(); const fileExts = /* @__PURE__ */ new Map(); for (const fileAbs of normFilePaths) { let cur = path3.dirname(fileAbs); siblingDirs.add(cur); if (!fileExts.has(cur)) fileExts.set(cur, /* @__PURE__ */ new Set()); fileExts.get(cur).add(path3.extname(fileAbs)); while (cur.startsWith(absRoot)) { expandDirs.add(cur); if (cur === absRoot) break; cur = path3.dirname(cur); } } const gitignoreFilter = await getGitignoreFilter(absRoot); async function walk(dir, depth, prefix, isLast) { if (depth > maxDepth) { const entries2 = await fs2.readdir(dir, { withFileTypes: true }); return [prefix + ellipsisLine(entries2.length, "(\u8D85\u51FA\u6DF1\u5EA6)")]; } let entries = []; try { entries = await fs2.readdir(dir, { withFileTypes: true }); } catch { return [prefix + "[\u65E0\u6CD5\u8BFB\u53D6\u76EE\u5F55]"]; } const isSiblingDir = siblingDirs.has(dir); if (!showDotDirs && !isSiblingDir) { entries = entries.filter((e) => !e.name.startsWith(".")); } entries = entries.filter( (e) => gitignoreFilter(path3.relative(absRoot, path3.join(dir, e.name)), e.isDirectory()) ); entries.sort((a, b) => { const aPath = path3.join(dir, a.name); const bPath = path3.join(dir, b.name); const aExpand = expandDirs.has(dir); const bExpand = expandDirs.has(dir); if (aExpand && bExpand) { if (a.isDirectory() !== b.isDirectory()) return Number(a.isDirectory()) - Number(b.isDirectory()); return a.name.localeCompare(b.name); } else { if (a.isDirectory() !== b.isDirectory()) return Number(b.isDirectory()) - Number(a.isDirectory()); return a.name.localeCompare(b.name); } }); const lines2 = []; let shown = 0; let omitted = 0; const showAllSiblings = isSiblingDir; const requiredExts = fileExts.get(dir); if (showAllSiblings) { const siblingFiles = entries.filter( (e) => !e.isDirectory() && (allowOtherExtensions || !requiredExts || requiredExts.has(path3.extname(e.name))) ); const siblingDirs2 = entries.filter((e) => e.isDirectory()); for (let i2 = 0; i2 < siblingFiles.length && shown < limitNum; i2++, shown++) { const entry = siblingFiles[i2]; const isEntryLast = shown === limitNum - 1 || i2 === siblingFiles.length - 1 && shown + siblingDirs2.length >= limitNum || shown === siblingFiles.length + siblingDirs2.length - 1; const branch = isEntryLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 "; lines2.push(prefix + branch + entry.name); } for (let i2 = 0; i2 < siblingDirs2.length && shown < limitNum; i2++, shown++) { const entry = siblingDirs2[i2]; const entryPath = path3.join(dir, entry.name); const isEntryLast = shown === limitNum - 1 || i2 === siblingDirs2.length - 1 || shown === siblingFiles.length + siblingDirs2.length - 1; const branch = isEntryLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 "; const nextPrefix = prefix + (isEntryLast ? " " : "\u2502 "); if (expandDirs.has(entryPath)) { lines2.push(prefix + branch + entry.name + "/"); const sub = await walk(entryPath, depth + 1, nextPrefix, isEntryLast); lines2.push(...sub); } else { const subEntries = await fs2.readdir(entryPath, { withFileTypes: true }); const filteredSubEntries = subEntries.filter( (e) => gitignoreFilter(path3.relative(absRoot, path3.join(entryPath, e.name)), e.isDirectory()) ); lines2.push(prefix + branch + entry.name + `/ ...(${filteredSubEntries.length}\u9879)`); } } const total = siblingFiles.length + siblingDirs2.length; if (shown < total) { lines2.push(prefix + ellipsisLine(total - shown)); } return lines2; } for (let i2 = 0; i2 < entries.length; i2++) { const entry = entries[i2]; const entryPath = path3.join(dir, entry.name); const isDir = entry.isDirectory(); const isEntryLast = shown === limitNum - 1 || i2 === entries.length - 1 || shown === entries.length - 1; if (shown >= limitNum) { omitted = entries.length - shown; lines2.push(prefix + ellipsisLine(omitted)); break; } const branch = isEntryLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 "; const nextPrefix = prefix + (isEntryLast ? " " : "\u2502 "); if (isDir) { if (expandDirs.has(entryPath)) { lines2.push(prefix + branch + entry.name + "/"); const sub = await walk(entryPath, depth + 1, nextPrefix, isEntryLast); lines2.push(...sub); } else { const subEntries = await fs2.readdir(entryPath, { withFileTypes: true }); const filteredSubEntries = subEntries.filter( (e) => gitignoreFilter(path3.relative(absRoot, path3.join(entryPath, e.name)), e.isDirectory()) ); lines2.push(prefix + branch + entry.name + `/ ...(${filteredSubEntries.length}\u9879)`); } } else { if (showAllSiblings) { if (allowOtherExtensions || !requiredExts || requiredExts.has(path3.extname(entry.name))) { lines2.push(prefix + branch + entry.name); } } else if (normFilePaths.includes(entryPath)) { lines2.push(prefix + branch + entry.name); } } shown++; } return lines2; } function ellipsisLine(count, note) { return `...(${count}\u9879${note ? note : ""})`; } const rootName = path3.basename(absRoot) || absRoot; const lines = await walk(absRoot, 1, "", true); return [rootName + "/", ...lines].join("\n"); } // ../autocompletion/v2/CodeContext.ts var CodeContext = class { _options; logger; get options() { return this._options; } constructor(options, logger) { this._options = { numLinesAsContext: 128, numLinesAsContextSuffix: 32, numImplementContexts: 3 }; this.logger = logger?.with("[CodeContext]") || Logger.getDefaultLogger().with("[CodeContext]"); try { if (options && typeof options === "object") { for (const key in options) { if (options[key] === void 0) { throw new Error(`Option ${key} is not defined`); } this._options[key] = options[key]; } } } catch (error) { this.logger.error(`Error checking options: ${error}, using default options`); } } async capture(codeText, file) { const languageParsers = await loadRequiredLanguageParsers([file.filePath]); const languageParser = languageParsers[file.fileExtension]; if (!languageParser) { this.logger.warn(`No languageParser available for extension: ${file.fileExtension}`); return null; } const parser = languageParser.parser; const query = languageParser.query; if (!parser || !query) { this.logger.warn(`No parser or query available for extension: ${file.fileExtension}`); return null; } const tree = parser.parse(codeText); this.logger.info(`Successfully parsed AST for: ${path4.basename(file.filePath)}`); const captures = query.captures(tree.rootNode); return captures; } async captureDependencies(codeText, file) { const queryText = dependenciesCapturesQueries[file.language]; if (!queryText) { this.logger.warn(`No query available for extension: ${file.fileExtension}`); return null; } const languageParsers = await loadRequiredLanguageParsers([file.filePath]); const languageParser = languageParsers[file.fileExtension]; if (!languageParser) { this.logger.warn(`No languageParser available for extension: ${file.fileExtension}`); return null; } const parser = languageParser.parser; const query = parser.getLanguage().query(queryText); if (!parser || !query) { this.logger.warn(`No parser or query available for extension: ${file.fileExtension}`); return null; } const tree = parser.parse(codeText); this.logger.info(`Successfully parsed AST for: ${path4.basename(file.filePath)}`); const captures = query.captures(tree.rootNode); return captures; } /** * 切分代码为 CodeSnippets * 使用 tree-sitter 进行语义切分,提取完整的函数、类、方法等定义 */ async chunk(codeText, options) { const { file, snippetTypes = [], maxSnippetLines = 50, minSnippetLines = 3 } = options; const codeSnippets = new CodeSnippets(); try { const fileHash = this.calculateFileHash(codeText); if (!this.isSupportedLanguage(file.language)) { if (file.language === "unknown" /* Unknown */) { this.logger.info(`Language ${file.language} not supported now`); } else { this.logger.warn(`Language ${file.language} not supported now`); } return codeSnippets; } const captures = await this.capture(codeText, file); if (!captures || captures.length === 0) { this.logger.warn(`No captures found`); return codeSnippets; } const extractSnippetsFromCapturesFunc = extractSnippetsFromCaptures[file.language]; try { if (!extractSnippetsFromCapturesFunc) { this.logger.info(`No extractSnippetsFromCapturesFunc available for language: ${file.language}`); return codeSnippets; } const snippets = await extractSnippetsFromCapturesFunc( captures, codeText, file.filePath, fileHash, snippetTypes, { maxSnippetLines, minSnippetLines } ); this.logger.info(`Extracted ${snippets.length} snippets total`); if (snippets && snippets.length > 0) { await codeSnippets.insert(snippets); } } catch (error) { this.logger.warn(`Error extracting snippets for ${file.filePath}:`, error); } return codeSnippets; } catch (error) { this.logger.error(`Error parsing AST for ${file.filePath}:`, error); return codeSnippets; } } async extractDependencies(codeText, file) { const captures = await this.captureDependencies(codeText, file); if (!captures || captures.length === 0) { this.logger.warn(`No captures found`); return []; } const processor = dependenciesProcessors[file.language]; if (!processor) { this.logger.warn(`No processor available for language: ${file.language}`); return []; } try { const dependencies = processor(captures); if (!dependencies || dependencies.length === 0) { this.logger.warn(`No dependencies found`); return []; } return dependencies; } catch (error) { this.logger.warn(`Error extracting dependencies for ${file.filePath}:`, error); return []; } } /** * 索引文件集合,提取所有文件的代码片段 */ async index(codeFiles, options) { const { maxSnippetLines = 50, minSnippetLines = 3, snippetTypes = [], includeFileTypes = [] } = options || {}; const allSnippets = new CodeSnippets(); this.logger.info(`Indexing ${codeFiles.files?.length || 0} files`); const indexPromises = (codeFiles.files || []).map(async (fileMeta) => { try { const fileExtension = path4.extname(fileMeta.filePath).toLowerCase().slice(1); if (!includeFileTypes.includes(fileExtension)) { return new CodeSnippets(); } const content = await fileMeta.read?.(); if (!content) { this.logger.warn(`Could not read content for file: ${fileMeta.filePath}`); return new CodeSnippets(); } const fileSnippets = await this.chunk(content, { file: fileMeta, snippetTypes, maxSnippetLines, minSnippetLines }); this.logger.info( `Indexed ${fileSnippets.snippets.length} snippets from ${path4.basename(fileMeta.filePath)}` ); return fileSnippets; } catch (error) { this.logger.error(`Error indexing file ${fileMeta.filePath}:`, error); return new CodeSnippets(); } }); const fileSnippetsArray = await Promise.all(indexPromises); for (const fileSnippets of fileSnippetsArray) { await allSnippets.merge(fileSnippets); } this.logger.info(`Total indexed snippets: ${allSnippets.snippets.length}`); return allSnippets; } async getFunctionOrMethodSurroundingCursor(codeSnippets, cursorPosition, file) { const snippets = await codeSnippets.filter((snippet) => { return cursorPosition.row >= snippet.startLine && cursorPosition.row <= snippet.endLine; }); if (!snippets || snippets.snippets.length === 0) { this.logger.warn(`No snippets found for file: ${file.filePath}`); return null; } return snippets.snippets[0]; } /** * 检索与当前位置相关的代码片段 - 智能上下文策略 */ /** * 检索与当前位置相关的代码片段 - 使用 capture 机制,直接返回文件原文 */ async retriveRelates(codeText, line, column, file, globalContext) { const relatedSnippets = new CodeSnippets(); if (!globalContext) { this.logger.warn(`No global context provided`); return relatedSnippets; } this.logger.info(`Retrieving related snippets for line ${line}, column ${column}`); const functionOrMethod = await this.getFunctionOrMethodSurroundingCursor( globalContext, { row: line, column }, file ); if (!functionOrMethod) { this.logger.warn(`No function or method found for line ${line}, column ${column}`); return relatedSnippets; } if (!functionOrMethod.implementText) { this.logger.warn(`No implementText available for function or method: ${functionOrMethod.name}`); return relatedSnippets; } const dependencies = await this.extractDependencies(functionOrMethod.implementText, file); if (!dependencies || dependencies.length === 0) { this.logger.warn(`No dependencies found`); return relatedSnippets; } let relatedSnippetsWithDependencies = []; dependencies.sort((a, b) => { return Math.abs(functionOrMethod.startLine + a.startLine - line) - Math.abs(functionOrMethod.startLine + b.startLine - line); }); for (const dependency of dependencies) { if (relatedSnippetsWithDependencies.length >= this.options.numImplementContexts) { break; } relatedSnippetsWithDependencies = relatedSnippetsWithDependencies.concat( await globalContext.find({ filePath: file.filePath, name: dependency.name, type: dependency.type, field: dependency.field }) ); } await relatedSnippets.insert(relatedSnippetsWithDependencies); return relatedSnippets; } /** * 后处理 LLM 生成的补全文本 * 使用 getStringBeforeCloseSymbol 处理符号闭合 */ postprocess(completion, options) { if (!completion || completion.trim() === "") { return ""; } this.logger.info(`Postprocessing completion: "${completion.substring(0, 100)}..."`); let processedCompletion = completion; processedCompletion = processedCompletion.trimEnd(); if (options && options.modelType === "qwen" /* Qwen */) { let { closeSymbol, suffixPrefix } = findFirstMatchingCloseSymbol(options.prompt, "<|fim_suffix|>"); processedCompletion = postProcessCompletionSynthesis( processedCompletion, options.prefix, options.suffix, closeSymbol, suffixPrefix ); } this.logger.info(`Postprocessed result: "${processedCompletion.substring(0, 100)}..."`); return processedCompletion; } /** * 获取代码补全所需的完整上下文 */ async getCompletionContext(documentInfo, positionInfo, globalContext) { this.logger.info( `Getting completion context for line ${positionInfo.line}, character ${positionInfo.character}` ); const { prefix, suffix } = await this.getCurrentContext(documentInfo, positionInfo); this.logger.info(`Prefix: "${prefix.substring(prefix.length - 50)}..."`); this.logger.info(`Suffix: "${suffix.substring(0, 50)}..."`); const generateOverViewFromSnippetsFunc = generateOverViewFromSnippets[documentInfo.file.language]; let overview = void 0; if (typeof generateOverViewFromSnippetsFunc === "function" && documentInfo.file.snippetMetas) { overview = generateOverViewFromSnippetsFunc(documentInfo.file.snippetMetas || []); } const relatedSnippets = await this.retriveRelates( documentInfo.content, positionInfo.line + 1, // 转换为 1-based positionInfo.character, documentInfo.file, globalContext ); this.logger.info(`Found ${relatedSnippets.snippets.length} related snippets`); return { prefix, suffix, snippets: relatedSnippets.snippets, overview, filePath: documentInfo.file.filePath, fileHash: documentInfo.file.fileHash, gitUrl: "" }; } /** * 预处理上下文 - 输出3个字符串 */ async preprocess(completionContext, options) { if (isInsideWord(completionContext.prefix, completionContext.suffix, (msg) => this.logger.info(msg))) { return { prefix: completionContext.prefix, suffix: completionContext.suffix, extraContexts: [], shouldSkipCompletion: false }; } const extraContexts = []; const recentOpenFiles = options.recentOpenFiles.filter((file) => file.language === options.codeFile.language).map((file) => file.filePath); if (options.codeFile.projectRoot) { try { const treeViewText = await treeView(options.codeFile.projectRoot, recentOpenFiles, 10, 10); extraContexts.push({ type: "RepoTreeView" /* RepoTreeView */, content: `## Repo Tree View ${treeViewText}` }); } catch (error) { this.logger.warn(`Error getting repo tree view: ${error}`); } } extraContexts.push({ type: "FileInfo" /* FileInfo */, content: `## Description This is a ${options.codeFile.language} file.` }); if (completionContext.overview) { extraContexts.push({ type: "FileCodeOverview" /* FileCodeOverview */, content: `## File Overview ${completionContext.overview}` }); } if (completionContext.snippets.length > 0) { extraContexts.push({ type: "RelatedFunctionDefinition" /* RelatedFunctionDefinition */, content: `## Related Function Definitions ${completionContext.snippets.map((snippet) => snippet.definitionText).join("\n")}` }); } if (this.options.numImplementContexts > 0 && completionContext.snippets.length > 0) { extraContexts.push({ type: "RelatedFuntionImplement" /* RelatedFuntionImplement */, content: `## Related Function Implementations ${completionContext.snippets.map((snippet) => snippet.implementText).join("\n")}` }); } if (options.recentOpenFiles && options.recentOpenFiles.length > 0) { const sameLanguageFiles = options.recentOpenFiles.filter( (file) => file.language === options.codeFile.language && file.filePath !== options.codeFile.filePath ); if (sameLanguageFiles.length > 0) { const symbolOverviews = []; for (const file of sameLanguageFiles) { if (file.snippetMetas && file.snippetMetas.length > 0) { const generateOverViewFunc = generateOverViewFromSnippets[file.language]; if (typeof generateOverViewFunc === "function") { const overview = generateOverViewFunc(file.snippetMetas); if (overview.trim()) { symbolOverviews.push(`### ${file.filePath} ${overview}`); } } } } if (symbolOverviews.length > 0) { extraContexts.push({ type: "RelatedFunctionDefinition" /* RelatedFunctionDefinition */, content: `## Open Tabs Symbol Overview ${symbolOverviews.join("\n\n")}` }); } } } extraContexts.push({ type: "EndContextPrompt" /* EndContextPrompt */, content: `## Recent Open Files ${recentOpenFiles.join(", ")} End of Context, Above is the context of the current file. You are editing the file at line ${options.editCursor.line}, character ${options.editCursor.character}, Starting Coding.` }); for (const extraContext of extraContexts) { extraContext.content = formatCodeWithLanguageWithLineComment( extraContext.content, options.codeFile.language ); } return { prefix: completionContext.prefix, suffix: completionContext.suffix, extraContexts, shouldSkipCompletion: false }; } /** * 获取当前光标位置的上下文 - 基于函数级别而非行級別 */ async getCurrentContext(documentInfo, positionInfo) { const currentFunction = documentInfo.file.snippetMetas?.filter((snippet) => { if (snippet.startLine && snippet.endLine) { return positionInfo.line >= snippet.startLine && positionInfo.line <= snippet.endLine; } return false; })[0]; if (currentFunction) { this.logger.info( `Found function: ${currentFunction.name} at lines ${currentFunction.startLine}-${currentFunction.endLine}` ); if (!currentFunction.implementText) { this.logger.warn(`No implementText available for function: ${currentFunction.name}`); return this.getSurroundingCodeContextSimple(documentInfo, positionInfo); } const originalTextLines = documentInfo.content.split("\n"); let startLine = Math.max(1, currentFunction.startLine); const functionLines = currentFunction.implementText.split("\n"); let endLine = Math.min(startLine + functionLines.length, documentInfo.lineCount); const remainsLinesCount = this.options.numLinesAsContext - (endLine - startLine); if (remainsLinesCount > 0) { const halfRemainsLinesCount = Math.floor(remainsLinesCount / 2); startLine = Math.max(1, startLine - halfRemainsLinesCount); endLine = Math.min(documentInfo.lineCount, endLine + halfRemainsLinesCount); } const startIndex = startLine - 1; const endIndex = endLine - 1; if (startIndex < 0 || startIndex > originalTextLines.length || endIndex < 0 || endIndex > originalTextLines.length) { this.logger.warn(`Invalid startIndex or endIndex: ${startIndex}, ${endIndex}`); return this.getSurroundingCodeContextSimple(documentInfo, positionInfo); } let prefix = originalTextLines.slice(startIndex, positionInfo.line).join("\n"); let suffix = ""; if (positionInfo.line < originalTextLines.length) { suffix = originalTextLines[positionInfo.line].substring(positionInfo.character) + "\n" + originalTextLines.slice(positionInfo.line + 1, endIndex + 1).join("\n"); } if (positionInfo.line >= 0 && positionInfo.line < originalTextLines.length) { prefix += "\n" + originalTextLines[positionInfo.line].substring(0, positionInfo.character); } this.logger.info(`Function-level context - Prefix: ${prefix.length} chars, Suffix: ${suffix.length} chars`); return { prefix, suffix }; } else { this.logger.info(`No function found at position, using line-level context`); return this.getSurroundingCodeContextSimple(documentInfo, positionInfo); } } isSimpleContextEnough(documentInfo, positionInfo) { const { startLine, endLine } = this.getSurroundingCodeContextSimpleStartAndEnd(documentInfo, positionInfo); return startLine <= 0 && endLine >= documentInfo.lineCount - 1; } getSurroundingCodeContextSimpleStartAndEnd(documentInfo, positionInfo) { const line = positionInfo.line; const startLine = Math.max(0, line - this.options.numLinesAsContext); const endLine = Math.min(documentInfo.lineCount - 1, line + this.options.numLinesAsContextSuffix); return { startLine, endLine }; } getSurroundingCodeContextSimple(documentInfo, positionInfo) { const line = positionInfo.line; const { startLine, endLine } = this.getSurroundingCodeContextSimpleStartAndEnd(documentInfo, positionInfo); const lines = documentInfo.content.split("\n"); let prefix = lines.slice(startLine, line).join("\n"); let suffix = ""; if (line < lines.length) { suffix = lines[line].substring(positionInfo.character) + "\n" + lines.slice(line + 1, endLine).join("\n"); } if (line >= 0 && line < lines.length) { prefix += "\n" + lines[line].substring(0, positionInfo.character); } return { prefix, suffix }; } // ==================== 辅助方法 ==================== calculateFileHash(content) { return crypto3.createHash("md5").update(content).digest("hex"); } isSupportedLanguage(language) { return CodeLanguageTypeSupport.includes(language); } }; // cli.ts var { program } = require_commander(); var codeContext = new CodeContext(); function getExtension(filePath) { return filePath.substring(filePath.lastIndexOf(".") + 1, filePath.length); } async function index(codeFiles, maxSnippetLines) { const maxLines = maxSnippetLines || 100; const allSnippets = new CodeSnippets(); const indexPromises = codeFiles.files.map(async (file) => { try { if (file.language === void 0 || !Object.values(CodeLanguageType).includes(file.language)) { console.log(`Unsupported language: ${file.language}`); return new CodeSnippets(); } const content = file.content; if (!content) { console.log(`Content is empty for file: ${file.filePath}`); return new CodeSnippets(); } file.fileExtension = getExtension(file.filePath); const fileSnippets = await codeContext.chunk(content, { file, maxSnippetLines: maxLines, snippetTypes: [ "function_or_method" /* FunctionOrMethod */, "class_or_interface_or_struct" /* ClassOrInterfaceOrStructOrEnum */, "variable_or_constant" /* VariableOrConstant */, "import_or_include" /* ImportOrInclude */ ] }); return fileSnippets; } catch (error) { return new CodeSnippets(); } }); const fileSnippetsArray = await Promise.all(indexPromises); for (const fileSnippets of fileSnippetsArray) { await allSnippets.merge(fileSnippets); } return allSnippets; } program.command("index ").option("-m ", "--maxlines ", "Maximum number of lines for each snippet").description("Index the given files.").action(async (input, cmd) => { const codeFiles = { files: JSON.parse(input) }; const indexResult = await index( codeFiles, cmd.maxlines ? parseInt(cmd.maxlines, 10) : void 0 ); console.log(`${JSON.stringify(indexResult.getSnippets(), null, 2)}`); }); program.parse(process.argv); //# sourceMappingURL=cli.cjs.map