Files
MonkeyCode/backend/pkg/cli/tools/dist/cli.cjs
chriscco 5ad50a9a26 feat: 添加了CLI脚本文件
fix: update content assignment in CreateFromIndexResult to use ImplementText

feat: enhance EnsureWorkspace method with automatic name generation and retry logic for workspace creation
2025-07-31 15:56:06 +08:00

18001 lines
683 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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<string, Command[] | Option[]>}
*/
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 <source> [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 <service>', 'start named service')
* .command('stop [service]', 'stop named service, or all if no name supplied');
*
* @param {string} nameAndArgs - command name and arguments, args are `<required>` 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('<input-file>');
* 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('<cmd> [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>', 'type of pizza') // required option-argument
* .option('-c, --cheese [CHEESE]', 'add extra cheese', 'mozzarella') // optional option-argument with default
* .option('-t, --tip <VALUE>', '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}<T>`,
type: "function_or_method" /* FunctionOrMethod */,
filePath,
startLine,
endLine,
rangeText,
definitionText: `${name2}<T>`,
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.endsWith("-->")) {
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: `<!-- ${commentName} -->`,
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) : "<anonymous>";
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<T>()
(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<T>()
(call_expression
function: (identifier) @generic.call.function
type_arguments: (type_arguments))
; \u6CDB\u578B\u65B9\u6CD5\u8C03\u7528 - object.method<T>()
(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<T>()
(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<T>()
(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 <input> ").option("-m <number>", "--maxlines <number>", "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