pando-ai 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -16
- package/dist/cli.js +297 -140
- package/dist/watcher-process.js +368 -368
- package/dist/workers/chunk-A6FOFRZ6.mjs +518 -0
- package/dist/workers/indexer-worker.mjs +1 -1
- package/dist/workers/snapshot-worker.mjs +5 -5
- package/package.json +4 -3
- package/resources/tools/generated_pando-tools.json +46 -128
- package/tools/clang-indexer/bin/pando-clang-indexer +0 -0
- package/tools/clojure-editor/lib/pando-clojure-editor-standalone.jar +0 -0
- package/tools/clojure-indexer/lib/pando-clojure-indexer-standalone.jar +0 -0
- package/dist/workers/chunk-Z7LW7C4Z.mjs +0 -518
|
@@ -1,518 +0,0 @@
|
|
|
1
|
-
import{c as pn,d as re,e as L,f as ct}from"./chunk-ODST7O2H.mjs";import{a as dn}from"./chunk-AYCBSZ56.mjs";var G={getAbbrev(n,e="ts"){return n},getKindFromAbbrev(n,e="ts"){return n}};function ye(n){let e=`${n.sourceFile}#${n.sourceStart}-${n.sourceEnd}`,t=n.refKind??"",r=n.refName??"",i=n.targetFile??"",s=n.targetStart!=null&&n.targetEnd!=null?`#${n.targetStart}-${n.targetEnd}`:"",o=n.targetNodeId??"",a=`${e}:REF:${t}:${r}|${i}${s}|${o}`;return ct(a)}function ut(n){let e=[],t=new Set,r=i=>{!i?.name||t.has(i.name)||(t.add(i.name),e.push(i))};for(let i of n.exports??[])r(i);for(let i of n.explicitExports??[])r({name:i});for(let i of n.modulePublic??[])r({name:i});return e}function ce(n,e,t){let r=new Date().toISOString();return{payload:{lang:n,fileRel:e,preDeleted:!1,exportRows:[],nodeRows:[],referenceRows:[],symbolMentionRows:[],importRows:[],importBindingRows:[],fileRow:[e,t?.mtime??null,t?.size??null,"failed",r],fts:null},fileSize:t?.size,mtime:t?.mtime}}function ue(n){let{lang:e,fileRel:t,content:r,meta:i,preDeleted:s,parsed:o,resolveNodeId:a,exportKind:c}=n,g=[];for(let l of o.nodes??[]){let x=l.rawKind??l.kind,S=l.rawKindSource??"cli",_=l.containerRawKind??l.containerKind??null,O=l.containerRawKindSource??(_?"cli":null),p=l.scopeChain??null,h=Array.isArray(p)?JSON.stringify(p):typeof p=="string"?p:null,v=`${t}#${l.start}-${l.end}:${G.getAbbrev(l.kind,e)}`,b=(e==="c"||e==="cpp"||e==="java"||e==="clojure")&&l.name?`${v}:${l.name}`:v,K=l.metadata&&Object.keys(l.metadata).length?JSON.stringify(l.metadata):null;g.push([b,l.name,l.kind,x,S,l.semanticKind??null,l.start,l.end,typeof l.isExported=="number"?l.isExported:0,l.containerKind??null,_,O,typeof l.paramCount=="number"?l.paramCount:null,l.qualifiedName??null,h,l.symbolKey??null,K])}let d=[],m=new Set;for(let l of ut(o)){if(!l.name||m.has(l.name))continue;m.add(l.name);let x=l.nodeId??(a?a(l.name):null);d.push([t,l.name,x??null,l.isReexport?1:0,l.reexportFrom??null,l.reexportName??null,l.exportKind??c??"cli",l.targetSymbolKey??null])}let y=[],P=[],C=new Map,w=new Map;for(let l of g){let x=l[0]!=null?String(l[0]):null,S=l[13]!=null?String(l[13]):null,_=l[15]!=null?String(l[15]):null;x&&(S&&!C.has(S)&&C.set(S,x),_&&!w.has(_)&&w.set(_,x))}if(re()&&e==="clojure"&&(o.references??[]).length>0){let l=Array.from(C.keys()).slice(0,10),x=Array.from(w.keys()).slice(0,10),S=(o.references??[]).slice(0,10).map(O=>O.containerQualifiedName),_={file:t,nodeCount:g.length,refCount:(o.references??[]).length,nodeQualifiedNames:l,nodeSymbolKeys:x,refContainers:S,qualifiedNameMapSize:C.size,symbolKeyMapSize:w.size};try{console.error("[CliPayload][CLOJURE-DEBUG] source_node_id lookup context",_)}catch{}}for(let l of o.references??[]){let x=l.targetNodeId??(a&&l.refName?a(l.refName):null),S=l.targetFile??(x?t:null),_=l.sourceNodeId??(l.containerQualifiedName?C.get(l.containerQualifiedName)??null:null)??(l.containerQualifiedName?w.get(l.containerQualifiedName)??null:null),O=ye({sourceFile:t,sourceStart:l.sourceStart,sourceEnd:l.sourceEnd,refKind:l.refKind,refName:l.refName,targetFile:S??null,targetStart:l.targetStart??null,targetEnd:l.targetEnd??null,targetNodeId:x??l.targetNodeId??null}),p=l.metadata&&Object.keys(l.metadata).length?JSON.stringify(l.metadata):null;y.push([O,t,_,l.refName??null,l.refKind,l.sourceStart,l.sourceEnd,x??l.targetNodeId??null,S??null,x||l.targetNodeId||l.targetFile?"resolved":"unresolved",l.receiverName??null,typeof l.arity=="number"?l.arity:null,l.containerQualifiedName??null,l.targetSymbolKey??null,l.confidence??null,p])}for(let l of o.symbolMentions??[]){let x=typeof l?.name=="string"?l.name.trim():"";if(!x)continue;let S=typeof l?.mentionKind=="string"&&l.mentionKind.trim().length>0?l.mentionKind.trim():"reference",_=typeof l?.count=="number"&&Number.isFinite(l.count)&&l.count>0?Math.floor(l.count):1;P.push([x,S,l.targetSymbolKey??null,l.containerQualifiedName??null,_])}if(re()&&e==="clojure"&&y.length>0){let l=y.reduce((S,_)=>S+(_?.[2]!=null?1:0),0),x=y.reduce((S,_)=>S+(_?.[12]!=null?1:0),0);try{console.error("[CliPayload] clojure source-node summary",{file:t,refs:y.length,sourceNodeCount:l,containerCount:x,sample:y.slice(0,5).map(S=>({sourceNodeId:S[2]==null?null:String(S[2]),refName:S[3],refKind:S[4],containerQualifiedName:S[12]}))})}catch{}}let A=[];for(let l of o.imports??[])A.push([t,l.module??null,l.isTypeOnly??0]);let R=[];for(let l of o.importBindings??[])R.push([t,l.module??null,l.kind,l.localName,l.importedName,l.isTypeOnly??0]);let u=new Date().toISOString(),N=[t,i?.mtime??null,i?.size??null,"completed",u];return{payload:{lang:e,fileRel:t,preDeleted:!!s,exportRows:d,nodeRows:g,referenceRows:y,symbolMentionRows:P,importRows:A,importBindingRows:R,fileRow:N,fts:typeof r=="string"?{blobOid:t,content:r}:null},fileSize:i?.size,mtime:i?.mtime}}var de=["ts","js","python","c","cpp","csharp","dart","java","clojure"];function Le(n){return typeof n=="string"&&de.includes(n)}pn();function dt(){let n=process.env.PANDO_ENABLED_LANGUAGES;if(n&&n.trim().length>0){let t=n.split(",").map(r=>r.trim()).filter(r=>r.length>0).filter(Le);if(t.length>0)return pt(t)}return[...de]}function pt(n){let e=new Set;for(let t of n)Le(t)&&e.add(t);return de.filter(t=>e.has(t))}function ft(n){let e=new Set(pt(n)),t={};for(let r of de){if(e.has(r)){t[r]={enabled:!0,source:"embedded"};continue}t[r]={enabled:!1,source:"none",reason:"disabled by language support config"}}return{byLanguage:t}}import ze from"path";import vn from"fs";import{Project as Sn,Node as q}from"ts-morph";import{Node as f,SyntaxKind as ie}from"ts-morph";import*as z from"typescript";import{SyntaxKind as pe}from"ts-morph";var Be={LINE_COMMENT:{kind:9001,name:"LineComment",triviaKind:pe.SingleLineCommentTrivia},BLOCK_COMMENT:{kind:9002,name:"BlockComment",triviaKind:pe.MultiLineCommentTrivia},JSDOC_COMMENT:{kind:9003,name:"JSDocComment",triviaKind:pe.MultiLineCommentTrivia}};function mt(n,e){return n===pe.SingleLineCommentTrivia?Be.LINE_COMMENT:n===pe.MultiLineCommentTrivia&&e.startsWith("/**")?Be.JSDOC_COMMENT:Be.BLOCK_COMMENT}import{Node as T}from"ts-morph";var gt={TS_MORPH:"ts-morph",PYTHON_AST:"python-ast",CLANG:"clang",ROSLYN:"roslyn",JAVA_AST:"java-ast",CLI:"cli",UNKNOWN:"unknown"},ht=(n,e)=>T.isFunctionDeclaration(n)||T.isFunctionExpression(n)||T.isArrowFunction(n)?{kind:"Function",semanticKind:"function"}:T.isGetAccessorDeclaration(n)||T.isSetAccessorDeclaration(n)?{kind:"Method",semanticKind:"property"}:T.isMethodDeclaration(n)||T.isMethodSignature(n)||T.isConstructorDeclaration(n)?{kind:"Method",semanticKind:"method"}:T.isClassDeclaration(n)||T.isClassExpression(n)?{kind:"Class",semanticKind:"class"}:T.isInterfaceDeclaration(n)?{kind:"Interface",semanticKind:"interface"}:T.isEnumDeclaration(n)?{kind:"Enum",semanticKind:"enum"}:T.isEnumMember(n)?{kind:"EnumMember",semanticKind:"enum"}:T.isTypeAliasDeclaration(n)?{kind:"TypeAlias",semanticKind:"type"}:T.isModuleDeclaration(n)?{kind:"Namespace",semanticKind:"namespace"}:T.isPropertyDeclaration(n)||T.isPropertySignature(n)?{kind:"Field",semanticKind:"property"}:T.isVariableDeclaration(n)?{kind:"Variable",semanticKind:"variable"}:{kind:e,semanticKind:null};function yt(n){try{let e=n.getKindName?.();if(typeof e=="string"&&e.trim())return e}catch{}return"Unknown"}function be(n){let e=yt(n),t=ht(n,e);return{kind:t.kind,semanticKind:t.semanticKind,rawKind:e,rawKindSource:gt.TS_MORPH}}function bt(n){let e=yt(n);return{kind:ht(n,e).kind,rawKind:e,rawKindSource:gt.TS_MORPH}}function xe(n,e){if(!n.kind||!n.kind.trim())throw new Error(`Invalid normalized kind: missing kind ${e?JSON.stringify(e):""}`);if(!n.rawKind||!n.rawKind.trim())throw new Error(`Invalid normalized kind: missing rawKind ${e?JSON.stringify(e):""}`);if(!n.rawKindSource||!String(n.rawKindSource).trim())throw new Error(`Invalid normalized kind: missing rawKindSource ${e?JSON.stringify(e):""}`)}function fn(n){if(n.kind==="local"){let r=n.isDefault?"default":n.name;return r?{name:r,priority:n.isDefault?4:3}:null}if(n.kind==="alias")return n.exported?{name:n.exported,priority:2}:null;let e=n.isNamespace??!1,t=n.alias||n.name||(e?"*":null);return t?{name:t,priority:e?0:1}:null}function mn(n){if(n.length<2)return n;let e=new Map;for(let t of n){let r=fn(t);if(!r)continue;let i=e.get(r.name);(!i||r.priority>i.priority)&&e.set(r.name,{record:t,priority:r.priority})}return Array.from(e.values()).map(t=>t.record)}function ve(n){try{if(n&&typeof n.getName=="function"){let e=n.getName();if(typeof e=="string"&&e.length>0)return e}}catch{}return null}function xt(n){let e;try{let r=n.getStart?.(!1);typeof r=="number"&&Number.isFinite(r)&&(e=r)}catch{}if(e===void 0)try{let r=n.getStart?.();typeof r=="number"&&Number.isFinite(r)&&(e=r)}catch{}if(e===void 0)try{let r=n.getFullStart?.();typeof r=="number"&&Number.isFinite(r)&&(e=r)}catch{}e===void 0&&(e=0);let t;try{let r=n.getEnd?.();typeof r=="number"&&Number.isFinite(r)&&(t=r)}catch{}if(t===void 0)try{let r=n.getStart?.();typeof r=="number"&&Number.isFinite(r)&&(t=r)}catch{}return t===void 0&&(t=e),t<e&&(t=e),{start:e,end:t}}function gn(n){try{if(f.isFunctionDeclaration(n)||f.isMethodDeclaration(n)||f.isConstructorDeclaration(n)||f.isFunctionExpression(n)||f.isArrowFunction(n)){let e=n.getParameters?.();if(Array.isArray(e))return e.length}}catch{}return null}function hn(n){try{return f.isIdentifier(n)?n.getSymbol():f.isPropertyAccessExpression(n)?n.getNameNode().getSymbol()??n.getSymbol():n.getSymbol?.()}catch{return}}function Se(n,e){try{return typeof n?.hasModifier=="function"&&n.hasModifier(e)}catch{return!1}}function vt(n){try{return n.getModuleSpecifierValue?.()??null}catch{try{return n.getModuleSpecifier?.()?.getLiteralText?.()??null}catch{return null}}}function yn(n,e,t){if(!f.isImportDeclaration(n))return;let i={moduleSpecifier:vt(n),isTypeOnly:n.isTypeOnly(),namedImports:[]};try{let s=n.getDefaultImport();if(s){let o=s.getText();i.defaultImport=o,t(o,s)}}catch{}try{let s=n.getNamespaceImport();if(s){let o=s.getText();i.namespaceImport=o,t(o,s)}}catch{}try{n.getNamedImports().forEach(s=>{try{let o=s.getName(),a=s.getAliasNode(),c=a?a.getText():void 0;o&&(i.namedImports.push({name:o,alias:c||void 0}),t(c||o,s.getNameNode()))}catch{}})}catch{}e.push(i)}function bn(n,e){if(f.isExportDeclaration(n)){let t=vt(n);if(t){if(n.getNamedExports().length>0)try{n.getNamedExports().forEach(r=>{try{let i=r.getName(),s=r.getAliasNode(),o=s?s.getText():void 0;e.push({kind:"reexport",moduleSpecifier:t,name:i||void 0,alias:o||void 0,isNamespace:!1})}catch{}})}catch{}else if(n.isNamespaceExport())try{let i=n.getNamespaceExport()?.getName();e.push({kind:"reexport",moduleSpecifier:t,name:i||"*",alias:i||void 0,isNamespace:!0})}catch{e.push({kind:"reexport",moduleSpecifier:t,name:"*",isNamespace:!0})}else e.push({kind:"reexport",moduleSpecifier:t,name:"*",isNamespace:!0});return}try{n.getNamedExports().forEach(r=>{try{let i=r.getName();if(!i)return;let s=r.getAliasNode(),o=s?s.getText():i;e.push({kind:"alias",local:i,exported:o})}catch{}})}catch{}return}if(f.isExportAssignment(n))try{let t=n.getExpression();if(t&&f.isIdentifier(t)){let r=t.getText();e.push({kind:"alias",local:r,exported:"default"})}}catch{}}function xn(n,e,t,r){if(!Se(n,ie.ExportKeyword))return;let i=Se(n,ie.DefaultKeyword);if(f.isVariableStatement(n)){try{let s=n.getDeclarationList().getDeclarations();for(let o of s){let a=ve(o)??o.getName?.()??null;if(a){t(a,o);let c=r(o);c&&e.push({kind:"local",name:a,isDefault:i,nodeId:c})}}}catch{}return}if(f.isFunctionDeclaration(n)||f.isClassDeclaration(n)||f.isInterfaceDeclaration(n)||f.isEnumDeclaration(n)||f.isTypeAliasDeclaration(n)||f.isModuleDeclaration(n)){let s=ve(n)||(i?"default":null),o=r(n);o&&e.push({kind:"local",name:s??"default",isDefault:i,nodeId:o})}}function St(n,e,t,r){let i=[],s=[],o=[],a=new Set,c=new Map,g=[],d=[],m=[{node:n,id:null,kind:"module",rawKind:"SourceFile",rawKindSource:"ts-morph",name:null,isExported:!1}],y=u=>{if(!u)return null;try{return e(u)}catch{return null}},P=(u,N)=>{if(u&&(a.has(u)||a.add(u),N&&!c.has(u))){let E=y(N);E&&c.set(u,E)}},C=u=>f.isFunctionDeclaration(u)||f.isFunctionExpression(u)||f.isArrowFunction(u)||f.isClassDeclaration(u)||f.isClassExpression(u)||f.isInterfaceDeclaration(u)||f.isEnumDeclaration(u)||f.isEnumMember(u)||f.isTypeAliasDeclaration(u)||f.isModuleDeclaration(u)||f.isMethodDeclaration(u)||f.isMethodSignature(u)||f.isPropertyDeclaration(u)||f.isPropertySignature(u)||f.isGetAccessorDeclaration(u)||f.isSetAccessorDeclaration(u)||f.isConstructorDeclaration(u)||f.isVariableDeclaration(u),w=u=>f.isSourceFile(u)||f.isFunctionDeclaration(u)||f.isFunctionExpression(u)||f.isArrowFunction(u)||f.isMethodDeclaration(u)||f.isConstructorDeclaration(u)||f.isClassDeclaration(u)||f.isClassExpression(u)||f.isModuleDeclaration(u),A=u=>{let N=ve(u);if(N)return N;if(f.isConstructorDeclaration(u))return"constructor";if(f.isArrowFunction(u)||f.isFunctionExpression(u)){let E=u.getParent();try{if(f.isVariableDeclaration(E))return E.getName();if(f.isPropertyAssignment(E)||f.isPropertyDeclaration(E)||f.isPropertySignature(E))return E.getName?.()??null;if(f.isShorthandPropertyAssignment(E))return E.getNameNode()?.getText()??null;if(f.isExportAssignment(E))return"default"}catch{}}if(f.isEnumMember(u))try{return u.getName()}catch{return null}if(f.isVariableDeclaration(u))try{return u.getName()}catch{return null}return null},R=u=>{let N=m[m.length-1],E=N?.id??null,l=N?.kind??"module",x=N?.name??null;if(f.isImportDeclaration(u))yn(u,g,P);else if(f.isImportEqualsDeclaration(u))try{let p=u.getModuleReference();if(p&&f.isExternalModuleReference(p)){let h=p.getExpression(),v;if(h&&f.isStringLiteral(h))v=h.getLiteralText();else if(h){let b=h.getText();v=typeof b=="string"?b.replace(/^['"]|['"]$/g,""):void 0}if(v){let K=u.getNameNode()?.getText(),j={moduleSpecifier:v,isTypeOnly:!1,namedImports:[]};K&&(j.defaultImport=K,P(K,u)),g.push(j)}}}catch{}(f.isExportDeclaration(u)||f.isExportAssignment(u))&&bn(u,d),xn(u,d,P,y);let S=C(u),_=S?A(u):null;if(S){let p=e(u);s.push({nodeId:p,node:u});let h=Se(u,ie.ExportKeyword)||N?.isExported||!1,v=S?u.getNameNode?.()?.getText?.()??null:null,b=_??(S?ve(u)??v:null);_?P(_,u):b&&P(b,u);let K=xt(u),j=gn(u),D=be(u);xe(D,{source:"ts-node-collector",file:n.getFilePath(),name:b??null}),i.push({nodeId:p,nodeName:b??null,containerId:E,containerKind:l,containerRawKind:N?.rawKind??null,containerRawKindSource:N?.rawKindSource??null,containerName:x,isExported:h,kind:D.kind,rawKind:D.rawKind,rawKindSource:D.rawKindSource,semanticKind:D.semanticKind??null,start:K.start,end:K.end,paramCount:j,metadata:null})}if(f.isCallExpression(u)||f.isNewExpression(u)){let p=u.getExpression(),h=null,v,b;try{if(b=hn(p),f.isIdentifier(p))h=p.getText();else if(f.isPropertyAccessExpression(p)){h=p.getName();let D=p.getExpression();f.isIdentifier(D)&&(v=D.getText())}}catch{}let K="";try{K=p.getText()}catch{}let j=xt(u);if(o.push({name:h,kind:f.isNewExpression(u)?"new":"call",containerId:E,containerKind:l,containerName:x,expression:K,objectName:v,symbol:b,start:j.start,end:j.end}),f.isCallExpression(u))try{if(f.isIdentifier(p)&&p.getText()==="require"){let I=u.getArguments()[0],F;if(I&&(f.isStringLiteral(I)||f.isNoSubstitutionTemplateLiteral(I)))try{F=I.getLiteralText()}catch{let M=I.getText();F=typeof M=="string"?M.replace(/^['"]|['"]$/g,""):void 0}if(F){let M={moduleSpecifier:F,isTypeOnly:!1,namedImports:[]},$=u.getParent();if($&&f.isVariableDeclaration($)){let V=$.getNameNode();try{if(f.isIdentifier(V)){let U=V.getText();U&&(M.defaultImport=U,P(U,$))}}catch{}}g.push(M)}}else if(p?.getKind?.()===ie.ImportKeyword){let I=u.getArguments()[0],F;if(I&&(f.isStringLiteral(I)||f.isNoSubstitutionTemplateLiteral(I)))try{F=I.getLiteralText()}catch{let M=I.getText();F=typeof M=="string"?M.replace(/^['"]|['"]$/g,""):void 0}F&&g.push({moduleSpecifier:F,isTypeOnly:!1,namedImports:[]})}}catch{}}if(f.isCallExpression(u)){let p=u.getExpression();try{if(f.isIdentifier(p)&&p.getText()==="require"){let h=u.getParent();if(!(h&&f.isExternalModuleReference(h))){let b=u.getArguments()[0],K;if(b&&(f.isStringLiteral(b)||f.isNoSubstitutionTemplateLiteral(b)))try{K=b.getLiteralText()}catch{K=b.getText().replace(/^['"]|['"]$/g,"")}if(K){let j={moduleSpecifier:K,isTypeOnly:!1,namedImports:[]};if(h&&f.isVariableDeclaration(h)){let D=h.getNameNode();try{if(f.isIdentifier(D)){let I=D.getText();I&&(j.defaultImport=I,P(I,h))}}catch{}}g.push(j)}}}else if(p?.getKind?.()===ie.ImportKeyword){let v=u.getArguments()[0],b;if(v&&(f.isStringLiteral(v)||f.isNoSubstitutionTemplateLiteral(v)))try{b=v.getLiteralText()}catch{b=v.getText().replace(/^['"]|['"]$/g,"")}b&&g.push({moduleSpecifier:b,isTypeOnly:!1,namedImports:[]})}}catch{}}let O=!1;if(w(u)){let p=y(u)??e(u),h=bt(u);m.push({node:u,id:p,kind:h.kind,rawKind:h.rawKind,rawKindSource:h.rawKindSource,name:_??x,isExported:Se(u,ie.ExportKeyword)||N?.isExported||!1}),O=!0}u.forEachChild(R),O&&m.pop()};if(n.forEachChild(R),r?.includeComments===!0||process.env.AST_INDEX_COMMENTS==="1")try{let u=n.getFullText(),N=z.createScanner(z.ScriptTarget.Latest,!1,z.LanguageVariant.Standard,u),E=new Set;for(let l=N.scan();l!==z.SyntaxKind.EndOfFileToken;l=N.scan()){if(l!==z.SyntaxKind.SingleLineCommentTrivia&&l!==z.SyntaxKind.MultiLineCommentTrivia)continue;let x=N.getTokenPos(),S=N.getTextPos(),_=`${x}-${S}`;if(E.has(_)||(E.add(_),t.has(_)))continue;t.add(_);let O=u.substring(x,S),p=mt(l,O),v=e({getKindName:()=>p.name,getKind:()=>p.kind,getPos:()=>x,getEnd:()=>S,getStart:()=>x,getFullStart:()=>x,getText:()=>O,getSourceFile:()=>n,getParent:()=>n,__isComment:!0,__commentPosition:"standalone",__attachedTo:null},"COM");i.push({nodeId:v,nodeName:O.substring(0,100),containerId:null,containerKind:"module",containerRawKind:"SourceFile",containerRawKindSource:"ts-morph",containerName:null,isExported:!1,kind:p.name,rawKind:p.name,rawKindSource:"ts-morph",semanticKind:null,start:x,end:S,paramCount:null,metadata:null})}}catch{}return{nodes:i,symbolCandidateNodes:s,references:o,declaredNames:a,localDeclarations:c,imports:g,exports:mn(d)}}function Ct(n){let e;try{let r=n.getStart?.(!1);typeof r=="number"&&Number.isFinite(r)&&(e=r)}catch{}if(e===void 0)try{let r=n.getStart?.();typeof r=="number"&&Number.isFinite(r)&&(e=r)}catch{}if(e===void 0)try{let r=n.getFullStart?.();typeof r=="number"&&Number.isFinite(r)&&(e=r)}catch{}e===void 0&&(e=0);let t;try{let r=n.getEnd?.();typeof r=="number"&&Number.isFinite(r)&&(t=r)}catch{}if(t===void 0)try{let r=n.getStart?.();typeof r=="number"&&Number.isFinite(r)&&(t=r)}catch{}return t===void 0&&(t=e),t<e&&(t=e),{start:e,end:t}}var Cn=100;function wn(n,e,t,r){let{start:i,end:s}=Ct(e),o=be(e);xe(o,{source:"ts-node-id",file:n,kind:o.kind});let a=r||G.getAbbrev(o.kind,t);return`${n}#${i}-${s}:${a}`}function Nn(n,e){return ze.relative(n,e).replace(/\\/g,"/")}function wt(n,e){if(!n)return null;let t=n;try{let d=n.getAliasedSymbol();d&&(t=d)}catch{}let r=[];try{r=t.getDeclarations()??[]}catch{r=[]}if(!r.length)return null;let s=r.slice().sort((d,m)=>{let y=d.getSourceFile().getFilePath(),P=m.getSourceFile().getFilePath();if(y!==P)return y.localeCompare(P);let C=d.getStart(!1),w=m.getStart(!1);return C!==w?C-w:d.getEnd()-m.getEnd()})[0],o=Nn(e,s.getSourceFile().getFilePath()),a=s.getStart(!1),c=s.getEnd(),g="";try{g=t.getEscapedName()}catch{try{g=t.getName()}catch{g=""}}return`${o}#${a}-${c}:${g}`}function Pn(n){try{return q.isVariableDeclaration(n)||q.isEnumMember(n)?n.getNameNode().getSymbol()??n.getSymbol():n.getSymbol()}catch{return}}function Rn(n,e){let t=n.getDescendantAtPos(e);if(!t)return;let r=t;if(!q.isCallExpression(r)&&!q.isNewExpression(r)&&(r=t.getFirstAncestor(s=>q.isCallExpression(s)||q.isNewExpression(s))??void 0),!r||!q.isCallExpression(r)&&!q.isNewExpression(r))return;let i=r.getExpression();try{return q.isIdentifier(i)?i.getSymbol():q.isPropertyAccessExpression(i)?i.getNameNode().getSymbol()??i.getSymbol():i.getSymbol()}catch{return}}async function En(n){let{sf:e,fileRel:t,content:r,preDeleted:i,meta:s,projectRoot:o,lang:a}=n,g=St(e,(p,h)=>wn(t,p,a,h),new Set,{includeComments:!1}),d=new Map;for(let{nodeId:p,node:h}of g.symbolCandidateNodes){let v=wt(Pn(h),o);v&&(d.has(p)||d.set(p,v))}let m=[],y=new Map,P=g.exports.filter(p=>p.kind!=="reexport"),C=g.exports.filter(p=>p.kind==="reexport");for(let p of P)if(p.kind==="local"){let h=p.isDefault?"default":p.name;if(!h||y.has(h))continue;let v=p.nodeId;m.push([t,h,v,0,null,null,p.isDefault?"default":"named"]),y.set(h,v)}else if(p.kind==="alias"){let h=p.exported;if(!h||y.has(h))continue;m.push([t,h,null,0,null,p.local,"alias"]),y.set(h,"alias")}for(let p of C){let h=p.moduleSpecifier;if(!h)continue;let v=h;if(p.isNamespace){let b=p.alias||"*";if(y.has(b))continue;m.push([t,b,null,1,v,p.name||b,"reexport_star"]),y.set(b,"reexport")}else{let b=p.alias||p.name;if(!b||y.has(b))continue;m.push([t,b,null,1,v,p.name||b,"reexport_named"]),y.set(b,"reexport")}}let w=[],A=typeof r=="string"?r:null;if(A==null)try{let p=e.getFullText();A=typeof p=="string"?p:null}catch{A=null}for(let p of g.nodes){let{nodeId:h,nodeName:v,containerKind:b,containerRawKind:K,containerRawKindSource:j,isExported:D,kind:I,rawKind:F,rawKindSource:M,semanticKind:$,start:V,end:U,paramCount:Me,metadata:Q}=p,Fe=Q&&Object.keys(Q).length?JSON.stringify(Q):null,un=d.get(h)??null;w.push([h,v??null,I,F??I,M??null,$??null,V,U,D?1:0,b??"module",K??b??"module",j??null,Me,null,null,un,Fe])}let R=[];for(let p of g.references){let{name:h,kind:v,containerId:b,containerName:K,expression:j,objectName:D,start:I,end:F}=p,M=null,$=null,V=wt(p.symbol??Rn(e,I),o),U=h?g.localDeclarations.get(h):void 0;U&&(M=U,$=t,V||(V=d.get(U)??null));let Me=ye({sourceFile:t,sourceStart:I,sourceEnd:F,refKind:v,refName:h,targetFile:$,targetNodeId:M}),Q={};j&&(Q.expression=j),D&&(Q.objectName=D),K&&(Q.containerName=K);let Fe=Object.keys(Q).length?JSON.stringify(Q):null;R.push([Me,t,b,h,v,I,F,M,$,M?"resolved":"unresolved",D??null,null,null,V,Fe])}let u=[],N=[];for(let p of g.imports){let h=p.moduleSpecifier??null;u.push([t,h,p.isTypeOnly?1:0]),p.defaultImport&&N.push([t,h,"default",p.defaultImport,"default",p.isTypeOnly?1:0]),p.namespaceImport&&N.push([t,h,"namespace",p.namespaceImport,"*",p.isTypeOnly?1:0]);for(let v of p.namedImports){let b=v.alias||v.name;N.push([t,h,"named",b,v.name,p.isTypeOnly?1:0])}}let E=ze.join(o,t),l=s?.size,x=s?.mtime;if(l===void 0||x===void 0)try{let p=vn.statSync(E);l=p.size,x=Math.floor(p.mtimeMs)}catch{}let S=new Date().toISOString(),_=[t,x??null,l??null,"completed",S],O=null;if(typeof A=="string")O={blobOid:t,content:A};else try{let p=e.getFullText?.();typeof p=="string"&&(O={blobOid:t,content:p})}catch(p){console.log(`[TypescriptIndexer] Failed to compute FTS payload for ${t}:`,p?.message??p)}return{payload:{lang:a,fileRel:t,preDeleted:i,exportRows:m,nodeRows:w,referenceRows:R,importRows:u,importBindingRows:N,fileRow:_,fts:O},fileSize:l,mtime:x}}var $e=class{constructor(e,t){this.project=null;this.filesProcessed=0;this.projectRoot=e,this.lang=t}getProject(){return this.project||(this.project=new Sn({useInMemoryFileSystem:!0,skipAddingFilesFromTsConfig:!0})),this.project}disposeProject(){if(this.project){try{let e=this.project.getLanguageService().compilerObject;typeof e?.dispose=="function"&&e.dispose()}catch{}this.project=null}}async process(e){let t=this.getProject(),r;try{let i=t.createSourceFile(ze.join(this.projectRoot,e.relPath),e.content,{overwrite:!0});r=await En({sf:i,fileRel:e.relPath,content:e.content,preDeleted:!!e.preDeleted,meta:e.meta,projectRoot:this.projectRoot,lang:e.lang})}catch(i){this.disposeProject(),this.filesProcessed=0;let s=i?.message||String(i);throw new Error(`TypeScript parser failed for ${e.relPath}: ${s}`)}return this.filesProcessed++,this.filesProcessed>=Cn&&(this.disposeProject(),this.filesProcessed=0),{payload:r.payload,fileSize:r.fileSize,mtime:r.mtime}}};function _n(n){return n==="ts"?[".ts",".tsx",".mts",".cts"]:n==="js"?[".js",".jsx",".mjs",".cjs"]:[]}function qe(n){return{id:n,extensions:_n(n),indexingMode:"worker",createIndexer:e=>new $e(e,n)}}import we from"fs";import H from"path";import{spawn as Kn,spawnSync as Et}from"child_process";import kn from"fs";var se=class{constructor(e=5e3){this.maxEntries=e;this.cache=new Map}get(e,t){let r=this.cache.get(e);if(!r)return null;let i=t?.mtime??null,s=t?.size??null;return i!=null&&s!=null&&r.mtime===i&&r.size===s?r.result:null}set(e,t,r){let i=t?.mtime??null,s=t?.size??null;this.cache.set(e,{mtime:i,size:s,result:r}),this.cache.size>this.maxEntries&&this.cache.clear()}};var Je=class{constructor(e,t,r,i){this.projectRoot=e;this.lang=t;this.parse=r;this.exportKind=i;this.cache=new se}async process(e){let t=e.meta?.mtime,r=e.meta?.size;if(t==null||r==null)try{let o=kn.statSync(e.absPath);t=Math.floor(o.mtimeMs),r=o.size}catch{}let i=this.cache.get(e.absPath,{mtime:t,size:r});if(i)return ue({lang:this.lang,fileRel:e.relPath,content:e.content,meta:{mtime:t,size:r},preDeleted:e.preDeleted,parsed:i,resolveNodeId:Nt(e.relPath,i,this.lang),exportKind:this.exportKind??"cli"});let s=null;try{s=await this.parse({absPath:e.absPath,relPath:e.relPath,content:e.content,meta:{mtime:t,size:r},projectRoot:this.projectRoot,lang:this.lang})}catch(o){try{console.log(`[CliContract:${this.lang}] parse threw for ${e.relPath}: ${o?.message||String(o)}`)}catch{}return ce(this.lang,e.relPath,{mtime:t,size:r})}return!s||s.error?ce(this.lang,e.relPath,{mtime:t,size:r}):(this.cache.set(e.absPath,{mtime:t,size:r},s),ue({lang:this.lang,fileRel:e.relPath,content:e.content,meta:{mtime:t,size:r},preDeleted:e.preDeleted,parsed:s,resolveNodeId:Nt(e.relPath,s,this.lang),exportKind:this.exportKind??"cli"}))}};function Nt(n,e,t){let r=new Map;for(let i of e.nodes??[]){if(!i.name||r.has(i.name))continue;let s=`${n}#${i.start}-${i.end}:${G.getAbbrev(i.kind,t)}`;r.set(i.name,s)}return i=>r.get(i)??null}function J(n){return{id:n.id,extensions:n.extensions,indexingMode:"worker",createIndexer:e=>new Je(e,n.id,n.parse,n.exportKind),resolveSpan:n.resolve?async(e,t,r)=>n.resolve({projectRoot:e,absPath:t,nodePath:r,lang:n.id}):void 0}}import An from"fs";import Ce from"path";var We=null;function In(n){for(let e of n)if(An.existsSync(e))return e;return null}function W(n){let e=We?.toolsRoot??process.env.PANDO_TOOLS_ROOT,t=We?.runtimeRoot??process.env.PANDO_RUNTIME_ROOT,r=We?.resourcesRoot??process.env.PANDO_RESOURCES_ROOT,i=[e?Ce.join(e,n):null,t?Ce.join(t,"tools",n):null,r?Ce.join(r,"tools",n):null,Ce.resolve(process.cwd(),"tools",n)].filter(s=>!!s);return In(i)}function B(...n){try{let e=n.map(t=>{if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ");process.stderr.write(e+`
|
|
2
|
-
`)}catch{}}var Ne=class{constructor(e,t){this.interpreter=e;this.scriptPath=t;this.buffer=Buffer.alloc(0);this.pending=new Map;this.seq=1;this.closed=!1;if(this.proc=Kn(this.interpreter,["-u",this.scriptPath],{stdio:["pipe","pipe","pipe"]}),!this.proc.stdout||!this.proc.stderr||!this.proc.stdin)throw new Error("python worker stdio unavailable");this.proc.stdout.on("data",r=>this.onData(r)),this.proc.stderr.on("data",r=>{B(`[PythonWorker] ${r.toString("utf8").trim()}`)}),this.proc.stdin.on("error",r=>this.handleError(r)),this.proc.on("error",r=>this.handleError(r)),this.proc.on("exit",r=>this.handleError(new Error(`python worker exited with code ${r}`))),this.ready=this.ping()}handleError(e){if(!this.closed){this.closed=!0;for(let[,t]of this.pending)t.timeout&&clearTimeout(t.timeout),t.summary&&B("[PythonCliAdapter] worker error",{interpreter:this.interpreter,error:e.message,...t.summary}),t.reject(e);this.pending.clear()}}onData(e){for(this.buffer=Buffer.concat([this.buffer,e]);this.buffer.length>=4;){let t=this.buffer.readUInt32BE(0);if(this.buffer.length<4+t)return;let r=this.buffer.slice(4,4+t);this.buffer=this.buffer.slice(4+t);let i=null;try{i=JSON.parse(r.toString("utf8"))}catch{continue}let s=this.pending.get(i.id);s&&(this.pending.delete(i.id),s.timeout&&clearTimeout(s.timeout),i.ok?s.resolve(i):s.reject(new Error(i.error||"python worker error")))}}sendMessage(e){if(this.closed)throw new Error("python worker is closed");let t=Buffer.from(JSON.stringify(e),"utf8"),r=Buffer.alloc(4);r.writeUInt32BE(t.length,0),this.proc.stdin.write(r),this.proc.stdin.write(t)}async requestRaw(e,t,r=1e4){let i=this.seq++,s={id:i,op:e,...t},o=Date.now(),a={op:e,id:i};return typeof t?.path=="string"&&(a.path=t.path),typeof t?.nodePath=="string"&&(a.nodePath=t.nodePath),typeof t?.content_b64=="string"&&(a.contentBytes=t.content_b64.length),new Promise((c,g)=>{let d=setTimeout(()=>{this.pending.delete(i),B("[PythonCliAdapter] worker timeout",{op:e,id:i,timeoutMs:r,pending:this.pending.size,interpreter:this.interpreter,...a}),g(new Error(`python worker timeout (${e})`))},r);this.pending.set(i,{resolve:c,reject:g,timeout:d,summary:a}),this.pending.size%200===0&&B("[PythonCliAdapter] worker pending",{op:e,pending:this.pending.size,interpreter:this.interpreter});try{this.sendMessage(s)}catch(m){clearTimeout(d),this.pending.delete(i),g(m)}})}async request(e,t,r=1e4){await this.ready;let i=Date.now(),s=await this.requestRaw(e,t,r),o=Date.now()-i;return o>2e3&&B("[PythonCliAdapter] worker slow",{op:e,ms:o,pending:this.pending.size,interpreter:this.interpreter,path:t?.path}),s}async ping(){await this.requestRaw("ping",{},5e3)}async parse(e){let t=Buffer.from(e.content,"utf8").toString("base64"),r=await this.request("parse",{path:e.path,content_b64:t,encoding:e.encoding});return r.nodes?r:null}async resolve(e){let t=Buffer.from(e.content,"utf8").toString("base64"),r=await this.request("resolve",{path:e.path,nodePath:e.nodePath,content_b64:t,encoding:e.encoding});return typeof r.start=="number"&&typeof r.end=="number"?r:null}close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pending)t.timeout&&clearTimeout(t.timeout),t.reject(new Error("python worker client closed"));this.pending.clear();let e=this.proc;try{e.stdin?.end()}catch{}try{e.kill()}catch{}}},Dn=`
|
|
3
|
-
import ast, json, sys, os
|
|
4
|
-
|
|
5
|
-
path = sys.argv[1]
|
|
6
|
-
with open(path, 'r', encoding='utf-8', errors='ignore') as f:
|
|
7
|
-
src = f.read()
|
|
8
|
-
|
|
9
|
-
# line start offsets
|
|
10
|
-
line_starts = [0]
|
|
11
|
-
for line in src.splitlines(True):
|
|
12
|
-
line_starts.append(line_starts[-1] + len(line))
|
|
13
|
-
|
|
14
|
-
def offset(lineno, col):
|
|
15
|
-
if lineno is None:
|
|
16
|
-
return 0
|
|
17
|
-
if lineno < 1:
|
|
18
|
-
lineno = 1
|
|
19
|
-
if lineno >= len(line_starts):
|
|
20
|
-
return line_starts[-1]
|
|
21
|
-
return line_starts[lineno - 1] + (col or 0)
|
|
22
|
-
|
|
23
|
-
def node_span(n):
|
|
24
|
-
start = offset(getattr(n, 'lineno', None), getattr(n, 'col_offset', 0))
|
|
25
|
-
end = offset(getattr(n, 'end_lineno', getattr(n, 'lineno', None)), getattr(n, 'end_col_offset', 0))
|
|
26
|
-
if end < start:
|
|
27
|
-
end = start
|
|
28
|
-
return start, end
|
|
29
|
-
|
|
30
|
-
nodes = []
|
|
31
|
-
imports = []
|
|
32
|
-
bindings = []
|
|
33
|
-
references = []
|
|
34
|
-
class_names = set()
|
|
35
|
-
module_public = set()
|
|
36
|
-
all_exports = None
|
|
37
|
-
|
|
38
|
-
module_name = os.path.splitext(os.path.basename(path))[0] if path else "__main__"
|
|
39
|
-
scope_stack = [module_name]
|
|
40
|
-
nodes.append({
|
|
41
|
-
'name': module_name,
|
|
42
|
-
'kind': 'Namespace',
|
|
43
|
-
'rawKind': 'Module',
|
|
44
|
-
'rawKindSource': 'python-ast',
|
|
45
|
-
'semanticKind': 'namespace',
|
|
46
|
-
'start': 0,
|
|
47
|
-
'end': len(src),
|
|
48
|
-
'isExported': 1,
|
|
49
|
-
'containerKind': None,
|
|
50
|
-
'containerRawKind': None,
|
|
51
|
-
'containerRawKindSource': None,
|
|
52
|
-
'paramCount': None,
|
|
53
|
-
'qualifiedName': module_name,
|
|
54
|
-
'scopeChain': [module_name],
|
|
55
|
-
'metadata': { 'path': path },
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
def decorator_names(node_list):
|
|
59
|
-
out = []
|
|
60
|
-
for d in node_list or []:
|
|
61
|
-
try:
|
|
62
|
-
if isinstance(d, ast.Name):
|
|
63
|
-
out.append(d.id)
|
|
64
|
-
elif isinstance(d, ast.Attribute):
|
|
65
|
-
out.append(d.attr)
|
|
66
|
-
elif hasattr(ast, 'Call') and isinstance(d, ast.Call):
|
|
67
|
-
if isinstance(d.func, ast.Name):
|
|
68
|
-
out.append(d.func.id)
|
|
69
|
-
elif isinstance(d.func, ast.Attribute):
|
|
70
|
-
out.append(d.func.attr)
|
|
71
|
-
except Exception:
|
|
72
|
-
pass
|
|
73
|
-
return out
|
|
74
|
-
|
|
75
|
-
def annotation_text(n):
|
|
76
|
-
try:
|
|
77
|
-
return ast.get_source_segment(src, n)
|
|
78
|
-
except Exception:
|
|
79
|
-
return None
|
|
80
|
-
|
|
81
|
-
def raw_kind(n):
|
|
82
|
-
try:
|
|
83
|
-
return n.__class__.__name__
|
|
84
|
-
except Exception:
|
|
85
|
-
return None
|
|
86
|
-
|
|
87
|
-
def base_name(txt):
|
|
88
|
-
try:
|
|
89
|
-
return txt.split('.')[-1]
|
|
90
|
-
except Exception:
|
|
91
|
-
return txt
|
|
92
|
-
|
|
93
|
-
ENUM_BASES = set(['Enum', 'IntEnum', 'StrEnum', 'Flag', 'IntFlag'])
|
|
94
|
-
META_BASES = set(['type', 'ABCMeta', 'EnumMeta'])
|
|
95
|
-
|
|
96
|
-
def is_enum_base(txt):
|
|
97
|
-
if not txt:
|
|
98
|
-
return False
|
|
99
|
-
name = base_name(txt)
|
|
100
|
-
return name in ENUM_BASES
|
|
101
|
-
|
|
102
|
-
def is_metaclass_base(txt):
|
|
103
|
-
if not txt:
|
|
104
|
-
return False
|
|
105
|
-
name = base_name(txt)
|
|
106
|
-
return name in META_BASES
|
|
107
|
-
|
|
108
|
-
class Visitor(ast.NodeVisitor):
|
|
109
|
-
def __init__(self):
|
|
110
|
-
self.class_name = None
|
|
111
|
-
self.class_is_enum = False
|
|
112
|
-
self.class_stack = []
|
|
113
|
-
self.func_name = None
|
|
114
|
-
self.func_stack = []
|
|
115
|
-
self.scope_stack = list(scope_stack)
|
|
116
|
-
|
|
117
|
-
def visit_ClassDef(self, n):
|
|
118
|
-
start, end = node_span(n)
|
|
119
|
-
name = n.name
|
|
120
|
-
class_names.add(name)
|
|
121
|
-
deco = decorator_names(getattr(n, 'decorator_list', None))
|
|
122
|
-
bases = []
|
|
123
|
-
is_enum = False
|
|
124
|
-
is_meta = False
|
|
125
|
-
meta_value = None
|
|
126
|
-
try:
|
|
127
|
-
for kw in getattr(n, 'keywords', []) or []:
|
|
128
|
-
if getattr(kw, 'arg', None) == 'metaclass':
|
|
129
|
-
meta_value = annotation_text(kw.value)
|
|
130
|
-
except Exception:
|
|
131
|
-
meta_value = None
|
|
132
|
-
try:
|
|
133
|
-
for b in getattr(n, 'bases', []) or []:
|
|
134
|
-
txt = annotation_text(b)
|
|
135
|
-
if txt:
|
|
136
|
-
bases.append(txt)
|
|
137
|
-
if is_enum_base(txt):
|
|
138
|
-
is_enum = True
|
|
139
|
-
if is_metaclass_base(txt):
|
|
140
|
-
is_meta = True
|
|
141
|
-
except Exception:
|
|
142
|
-
pass
|
|
143
|
-
is_exported = 0 if name.startswith('_') else 1
|
|
144
|
-
if is_exported:
|
|
145
|
-
module_public.add(name)
|
|
146
|
-
metadata = {
|
|
147
|
-
'decorators': deco,
|
|
148
|
-
'extends': bases if bases else None,
|
|
149
|
-
'visibility': 'private' if name.startswith('_') else 'public'
|
|
150
|
-
}
|
|
151
|
-
if meta_value:
|
|
152
|
-
metadata['metaclass'] = meta_value
|
|
153
|
-
if is_meta:
|
|
154
|
-
metadata['isMetaclass'] = True
|
|
155
|
-
if is_enum:
|
|
156
|
-
metadata['isEnum'] = True
|
|
157
|
-
scope_chain = self.scope_stack + [name]
|
|
158
|
-
nodes.append({
|
|
159
|
-
'name': name,
|
|
160
|
-
'kind': 'Enum' if is_enum else 'Class',
|
|
161
|
-
'rawKind': raw_kind(n),
|
|
162
|
-
'rawKindSource': 'python-ast',
|
|
163
|
-
'semanticKind': 'enum' if is_enum else 'class',
|
|
164
|
-
'start': start,
|
|
165
|
-
'end': end,
|
|
166
|
-
'isExported': is_exported,
|
|
167
|
-
'containerKind': None,
|
|
168
|
-
'containerRawKind': None,
|
|
169
|
-
'containerRawKindSource': None,
|
|
170
|
-
'paramCount': None,
|
|
171
|
-
'qualifiedName': '.'.join(scope_chain),
|
|
172
|
-
'scopeChain': scope_chain,
|
|
173
|
-
'metadata': metadata,
|
|
174
|
-
})
|
|
175
|
-
prev = self.class_name
|
|
176
|
-
prev_enum = self.class_is_enum
|
|
177
|
-
self.class_stack.append({ 'name': name, 'is_enum': is_enum })
|
|
178
|
-
self.class_name = name
|
|
179
|
-
self.class_is_enum = is_enum
|
|
180
|
-
self.scope_stack.append(name)
|
|
181
|
-
self.generic_visit(n)
|
|
182
|
-
self.scope_stack.pop()
|
|
183
|
-
self.class_stack.pop()
|
|
184
|
-
self.class_name = prev
|
|
185
|
-
self.class_is_enum = prev_enum
|
|
186
|
-
|
|
187
|
-
def visit_FunctionDef(self, n):
|
|
188
|
-
start, end = node_span(n)
|
|
189
|
-
name = n.name
|
|
190
|
-
param_count = len(getattr(n, 'args', {}).args) if hasattr(n, 'args') else None
|
|
191
|
-
is_async = isinstance(n, ast.AsyncFunctionDef)
|
|
192
|
-
deco = decorator_names(getattr(n, 'decorator_list', None))
|
|
193
|
-
ret = annotation_text(getattr(n, 'returns', None)) if hasattr(n, 'returns') else None
|
|
194
|
-
is_static = 'staticmethod' in deco
|
|
195
|
-
is_abstract = 'abstractmethod' in deco
|
|
196
|
-
is_readonly = 'property' in deco
|
|
197
|
-
visibility = 'private' if name.startswith('_') else 'public'
|
|
198
|
-
scope_chain = self.scope_stack + [name]
|
|
199
|
-
if self.class_name:
|
|
200
|
-
sem_kind = 'property' if is_readonly else 'method'
|
|
201
|
-
nodes.append({
|
|
202
|
-
'name': name,
|
|
203
|
-
'kind': 'Method',
|
|
204
|
-
'rawKind': raw_kind(n),
|
|
205
|
-
'rawKindSource': 'python-ast',
|
|
206
|
-
'semanticKind': sem_kind,
|
|
207
|
-
'start': start,
|
|
208
|
-
'end': end,
|
|
209
|
-
'isExported': 0,
|
|
210
|
-
'containerKind': 'Class',
|
|
211
|
-
'containerRawKind': 'ClassDef',
|
|
212
|
-
'containerRawKindSource': 'python-ast',
|
|
213
|
-
'paramCount': param_count,
|
|
214
|
-
'qualifiedName': '.'.join(scope_chain),
|
|
215
|
-
'scopeChain': scope_chain,
|
|
216
|
-
'metadata': { 'isAsync': is_async, 'containerName': self.class_name, 'decorators': deco, 'returnType': ret, 'isStatic': is_static, 'isAbstract': is_abstract, 'isReadonly': is_readonly, 'visibility': visibility },
|
|
217
|
-
})
|
|
218
|
-
else:
|
|
219
|
-
is_exported = 0 if name.startswith('_') else 1
|
|
220
|
-
if is_exported:
|
|
221
|
-
module_public.add(name)
|
|
222
|
-
nodes.append({
|
|
223
|
-
'name': name,
|
|
224
|
-
'kind': 'Function',
|
|
225
|
-
'rawKind': raw_kind(n),
|
|
226
|
-
'rawKindSource': 'python-ast',
|
|
227
|
-
'semanticKind': 'function',
|
|
228
|
-
'start': start,
|
|
229
|
-
'end': end,
|
|
230
|
-
'isExported': is_exported,
|
|
231
|
-
'containerKind': None,
|
|
232
|
-
'containerRawKind': None,
|
|
233
|
-
'containerRawKindSource': None,
|
|
234
|
-
'paramCount': param_count,
|
|
235
|
-
'qualifiedName': '.'.join(scope_chain),
|
|
236
|
-
'scopeChain': scope_chain,
|
|
237
|
-
'metadata': { 'isAsync': is_async, 'decorators': deco, 'returnType': ret, 'isAbstract': is_abstract, 'visibility': visibility },
|
|
238
|
-
})
|
|
239
|
-
prev = self.func_name
|
|
240
|
-
self.func_name = name
|
|
241
|
-
self.func_stack.append(name)
|
|
242
|
-
self.scope_stack.append(name)
|
|
243
|
-
self.generic_visit(n)
|
|
244
|
-
self.scope_stack.pop()
|
|
245
|
-
self.func_stack.pop()
|
|
246
|
-
self.func_name = prev
|
|
247
|
-
|
|
248
|
-
def visit_AsyncFunctionDef(self, n):
|
|
249
|
-
self.visit_FunctionDef(n)
|
|
250
|
-
|
|
251
|
-
def visit_Import(self, n):
|
|
252
|
-
for alias in n.names:
|
|
253
|
-
module = alias.name
|
|
254
|
-
imports.append({ 'module': module, 'isTypeOnly': 0 })
|
|
255
|
-
local = alias.asname or alias.name
|
|
256
|
-
if local and not local.startswith('_'):
|
|
257
|
-
module_public.add(local)
|
|
258
|
-
bindings.append({
|
|
259
|
-
'module': module,
|
|
260
|
-
'localName': local,
|
|
261
|
-
'importedName': alias.name,
|
|
262
|
-
'kind': 'named',
|
|
263
|
-
'isTypeOnly': 0,
|
|
264
|
-
})
|
|
265
|
-
|
|
266
|
-
def visit_ImportFrom(self, n):
|
|
267
|
-
module = n.module
|
|
268
|
-
imports.append({ 'module': module, 'isTypeOnly': 0 })
|
|
269
|
-
for alias in n.names:
|
|
270
|
-
if alias.name == '*':
|
|
271
|
-
bindings.append({
|
|
272
|
-
'module': module,
|
|
273
|
-
'localName': alias.asname or '*',
|
|
274
|
-
'importedName': '*',
|
|
275
|
-
'kind': 'namespace',
|
|
276
|
-
'isTypeOnly': 0,
|
|
277
|
-
})
|
|
278
|
-
else:
|
|
279
|
-
bindings.append({
|
|
280
|
-
'module': module,
|
|
281
|
-
'localName': alias.asname or alias.name,
|
|
282
|
-
'importedName': alias.name,
|
|
283
|
-
'kind': 'named',
|
|
284
|
-
'isTypeOnly': 0,
|
|
285
|
-
})
|
|
286
|
-
local_name = alias.asname or alias.name
|
|
287
|
-
if local_name and not local_name.startswith('_'):
|
|
288
|
-
module_public.add(local_name)
|
|
289
|
-
|
|
290
|
-
def visit_Assign(self, n):
|
|
291
|
-
# module-level or class-level names
|
|
292
|
-
global all_exports
|
|
293
|
-
targets = getattr(n, 'targets', [])
|
|
294
|
-
for t in targets:
|
|
295
|
-
if isinstance(t, ast.Name):
|
|
296
|
-
start, end = node_span(t)
|
|
297
|
-
name = t.id
|
|
298
|
-
is_exported = 0 if name.startswith('_') else 1
|
|
299
|
-
scope_chain = self.scope_stack + [name]
|
|
300
|
-
if self.class_name:
|
|
301
|
-
if self.class_is_enum:
|
|
302
|
-
nodes.append({
|
|
303
|
-
'name': name,
|
|
304
|
-
'kind': 'EnumMember',
|
|
305
|
-
'rawKind': raw_kind(t),
|
|
306
|
-
'rawKindSource': 'python-ast',
|
|
307
|
-
'semanticKind': 'enum',
|
|
308
|
-
'start': start,
|
|
309
|
-
'end': end,
|
|
310
|
-
'isExported': 0,
|
|
311
|
-
'containerKind': 'Enum',
|
|
312
|
-
'containerRawKind': 'ClassDef',
|
|
313
|
-
'containerRawKindSource': 'python-ast',
|
|
314
|
-
'paramCount': None,
|
|
315
|
-
'qualifiedName': '.'.join(scope_chain),
|
|
316
|
-
'scopeChain': scope_chain,
|
|
317
|
-
'metadata': { 'containerName': self.class_name, 'visibility': 'private' if name.startswith('_') else 'public' },
|
|
318
|
-
})
|
|
319
|
-
continue
|
|
320
|
-
nodes.append({
|
|
321
|
-
'name': name,
|
|
322
|
-
'kind': 'Field',
|
|
323
|
-
'rawKind': raw_kind(t),
|
|
324
|
-
'rawKindSource': 'python-ast',
|
|
325
|
-
'semanticKind': 'field',
|
|
326
|
-
'start': start,
|
|
327
|
-
'end': end,
|
|
328
|
-
'isExported': 0,
|
|
329
|
-
'containerKind': 'Class',
|
|
330
|
-
'containerRawKind': 'ClassDef',
|
|
331
|
-
'containerRawKindSource': 'python-ast',
|
|
332
|
-
'paramCount': None,
|
|
333
|
-
'qualifiedName': '.'.join(scope_chain),
|
|
334
|
-
'scopeChain': scope_chain,
|
|
335
|
-
'metadata': { 'containerName': self.class_name, 'visibility': 'private' if name.startswith('_') else 'public' },
|
|
336
|
-
})
|
|
337
|
-
else:
|
|
338
|
-
if is_exported:
|
|
339
|
-
module_public.add(name)
|
|
340
|
-
nodes.append({
|
|
341
|
-
'name': name,
|
|
342
|
-
'kind': 'Variable',
|
|
343
|
-
'rawKind': raw_kind(t),
|
|
344
|
-
'rawKindSource': 'python-ast',
|
|
345
|
-
'semanticKind': 'variable',
|
|
346
|
-
'start': start,
|
|
347
|
-
'end': end,
|
|
348
|
-
'isExported': is_exported,
|
|
349
|
-
'containerKind': None,
|
|
350
|
-
'containerRawKind': None,
|
|
351
|
-
'containerRawKindSource': None,
|
|
352
|
-
'paramCount': None,
|
|
353
|
-
'qualifiedName': '.'.join(scope_chain),
|
|
354
|
-
'scopeChain': scope_chain,
|
|
355
|
-
'metadata': { 'visibility': 'private' if name.startswith('_') else 'public' },
|
|
356
|
-
})
|
|
357
|
-
if (not self.class_name) and name == '__all__':
|
|
358
|
-
try:
|
|
359
|
-
if isinstance(n.value, (ast.List, ast.Tuple)):
|
|
360
|
-
all_list = []
|
|
361
|
-
for elt in n.value.elts:
|
|
362
|
-
if isinstance(elt, ast.Str):
|
|
363
|
-
all_list.append(elt.s)
|
|
364
|
-
elif hasattr(ast, 'Constant') and isinstance(elt, ast.Constant) and isinstance(elt.value, str):
|
|
365
|
-
all_list.append(elt.value)
|
|
366
|
-
if all_list:
|
|
367
|
-
all_exports = all_list
|
|
368
|
-
except Exception:
|
|
369
|
-
pass
|
|
370
|
-
self.generic_visit(n)
|
|
371
|
-
|
|
372
|
-
def visit_Call(self, n):
|
|
373
|
-
try:
|
|
374
|
-
func = n.func
|
|
375
|
-
call_name = None
|
|
376
|
-
object_name = None
|
|
377
|
-
expr_text = None
|
|
378
|
-
if isinstance(func, ast.Name):
|
|
379
|
-
call_name = func.id
|
|
380
|
-
elif isinstance(func, ast.Attribute):
|
|
381
|
-
call_name = func.attr
|
|
382
|
-
if isinstance(func.value, ast.Name):
|
|
383
|
-
object_name = func.value.id
|
|
384
|
-
try:
|
|
385
|
-
expr_text = ast.get_source_segment(src, func)
|
|
386
|
-
except Exception:
|
|
387
|
-
expr_text = None
|
|
388
|
-
start, end = node_span(n)
|
|
389
|
-
kind = 'new' if call_name in class_names else 'call'
|
|
390
|
-
container_name = self.class_name or self.func_name
|
|
391
|
-
container_kind = 'Class' if self.class_name else ('Function' if self.func_name else None)
|
|
392
|
-
try:
|
|
393
|
-
arity = len(getattr(n, 'args', []) or []) + len(getattr(n, 'keywords', []) or [])
|
|
394
|
-
except Exception:
|
|
395
|
-
arity = 0
|
|
396
|
-
container_qualified_name = '.'.join(self.scope_stack) if self.scope_stack else None
|
|
397
|
-
references.append({
|
|
398
|
-
'name': call_name,
|
|
399
|
-
'kind': kind,
|
|
400
|
-
'start': start,
|
|
401
|
-
'end': end,
|
|
402
|
-
'expression': expr_text,
|
|
403
|
-
'objectName': object_name,
|
|
404
|
-
'containerName': container_name,
|
|
405
|
-
'containerKind': container_kind,
|
|
406
|
-
'receiverName': object_name,
|
|
407
|
-
'arity': arity,
|
|
408
|
-
'containerQualifiedName': container_qualified_name,
|
|
409
|
-
})
|
|
410
|
-
except Exception:
|
|
411
|
-
pass
|
|
412
|
-
self.generic_visit(n)
|
|
413
|
-
|
|
414
|
-
try:
|
|
415
|
-
tree = ast.parse(src, filename=path)
|
|
416
|
-
Visitor().visit(tree)
|
|
417
|
-
out = { 'nodes': nodes, 'imports': imports, 'importBindings': bindings, 'references': references, 'modulePublic': sorted(list(module_public)), 'explicitExports': all_exports }
|
|
418
|
-
print(json.dumps(out))
|
|
419
|
-
except Exception as e:
|
|
420
|
-
print(json.dumps({ 'error': str(e) }))
|
|
421
|
-
sys.exit(2)
|
|
422
|
-
`,Tn=`
|
|
423
|
-
import ast, json, sys
|
|
424
|
-
|
|
425
|
-
path = sys.argv[1]
|
|
426
|
-
node_path = sys.argv[2]
|
|
427
|
-
with open(path, 'r', encoding='utf-8', errors='ignore') as f:
|
|
428
|
-
src = f.read()
|
|
429
|
-
|
|
430
|
-
# line start offsets
|
|
431
|
-
line_starts = [0]
|
|
432
|
-
for line in src.splitlines(True):
|
|
433
|
-
line_starts.append(line_starts[-1] + len(line))
|
|
434
|
-
|
|
435
|
-
def offset(lineno, col):
|
|
436
|
-
if lineno is None:
|
|
437
|
-
return 0
|
|
438
|
-
if lineno < 1:
|
|
439
|
-
lineno = 1
|
|
440
|
-
if lineno >= len(line_starts):
|
|
441
|
-
return line_starts[-1]
|
|
442
|
-
return line_starts[lineno - 1] + (col or 0)
|
|
443
|
-
|
|
444
|
-
def node_span(n):
|
|
445
|
-
start = offset(getattr(n, 'lineno', None), getattr(n, 'col_offset', 0))
|
|
446
|
-
end = offset(getattr(n, 'end_lineno', getattr(n, 'lineno', None)), getattr(n, 'end_col_offset', 0))
|
|
447
|
-
if end < start:
|
|
448
|
-
end = start
|
|
449
|
-
return start, end
|
|
450
|
-
|
|
451
|
-
def parse_range(node_path):
|
|
452
|
-
clean = node_path
|
|
453
|
-
if clean.startswith('SyntaxError:') or clean.startswith('CompileError:'):
|
|
454
|
-
clean = clean.split(':', 1)[1]
|
|
455
|
-
if '#' in clean:
|
|
456
|
-
clean = clean.split('#', 1)[1]
|
|
457
|
-
if ':' in clean:
|
|
458
|
-
clean = clean.rsplit(':', 1)[0]
|
|
459
|
-
if '-' not in clean:
|
|
460
|
-
return None
|
|
461
|
-
parts = clean.split('-', 1)
|
|
462
|
-
try:
|
|
463
|
-
return int(parts[0]), int(parts[1])
|
|
464
|
-
except Exception:
|
|
465
|
-
return None
|
|
466
|
-
|
|
467
|
-
target = parse_range(node_path)
|
|
468
|
-
if target is None:
|
|
469
|
-
print(json.dumps({ 'error': 'invalid nodePath' }))
|
|
470
|
-
sys.exit(2)
|
|
471
|
-
|
|
472
|
-
target_start, target_end = target
|
|
473
|
-
resolved = None
|
|
474
|
-
|
|
475
|
-
try:
|
|
476
|
-
tree = ast.parse(src, filename=path)
|
|
477
|
-
for n in ast.walk(tree):
|
|
478
|
-
s, e = node_span(n)
|
|
479
|
-
if s == target_start and e == target_end:
|
|
480
|
-
body_start = None
|
|
481
|
-
body_end = None
|
|
482
|
-
if hasattr(n, 'body') and isinstance(n.body, list) and len(n.body) > 0:
|
|
483
|
-
try:
|
|
484
|
-
bs, _ = node_span(n.body[0])
|
|
485
|
-
_, be = node_span(n.body[-1])
|
|
486
|
-
body_start = bs
|
|
487
|
-
body_end = be
|
|
488
|
-
except Exception:
|
|
489
|
-
body_start = None
|
|
490
|
-
body_end = None
|
|
491
|
-
try:
|
|
492
|
-
text = src[s:e]
|
|
493
|
-
except Exception:
|
|
494
|
-
text = None
|
|
495
|
-
resolved = { 'start': s, 'end': e, 'bodyStart': body_start, 'bodyEnd': body_end, 'text': text }
|
|
496
|
-
break
|
|
497
|
-
if not resolved:
|
|
498
|
-
print(json.dumps({ 'error': 'node not found' }))
|
|
499
|
-
sys.exit(2)
|
|
500
|
-
print(json.dumps(resolved))
|
|
501
|
-
except Exception as e:
|
|
502
|
-
print(json.dumps({ 'error': str(e) }))
|
|
503
|
-
sys.exit(2)
|
|
504
|
-
`;function _t(n){let e=H.resolve(n,"tools/python-indexer/pando_python_worker.py");if(we.existsSync(e))return e;let t=W("python-indexer/pando_python_worker.py");if(t)return t;let r=H.resolve(__dirname,"../../../../../tools/python-indexer/pando_python_worker.py");return we.existsSync(r)?r:null}var ae=new Map;function oe(n){try{return we.readFileSync(n,"utf8")}catch{return null}}function fe(n){if(!n)return null;let e=n.match(/(\d+)\.(\d+)/);return e?{major:Number(e[1]),minor:Number(e[2])}:null}function On(n){let e=oe(H.join(n,"pyproject.toml"));if(e){let a=e.match(/requires-python\s*=\s*"([^"]+)"/i),c=fe(a?.[1]??null);if(c)return c}let t=oe(H.join(n,"setup.cfg"));if(t){let a=t.match(/python_requires\s*=\s*([\w\d\.<>~=\s]+)/i),c=fe(a?.[1]??null);if(c)return c}let r=oe(H.join(n,"setup.py"));if(r){let a=r.match(/python_requires\s*=\s*['\"]([^'\"]+)['\"]/i),c=fe(a?.[1]??null);if(c)return c}let i=oe(H.join(n,"tox.ini"));if(i){let a=i.match(/envlist\s*=\s*([^\n]+)/i);if(a&&a[1]){let c=a[1].split(/[,\s]+/).filter(Boolean);for(let g of c){let d=g.match(/py(\d)(\d)/i);if(d)return{major:Number(d[1]),minor:Number(d[2])}}}}let s=oe(H.join(n,".python-version"));if(s){let a=fe(s.trim());if(a)return a}let o=oe(H.join(n,"runtime.txt"));if(o){let a=o.match(/python-(\d+\.\d+)/i),c=fe(a?.[1]??null);if(c)return c}return null}function Pe(n){return On(n)?.major===2?["python2","python","python3"]:["python3","python","python2"]}async function jn(n,e,t){let r=_t(n);if(!r)return null;let i=Pe(n);for(let s of i){let o=`${s}::${r}`,a=ae.get(o);if(!a)try{a=new Ne(s,r),ae.set(o,a)}catch{continue}try{let c=await a.parse({path:e,content:t,encoding:"utf-8"});if(c)return c}catch{B("[PythonCliAdapter] worker parse error",{file:e,interpreter:s}),ae.delete(o)}}return null}async function Mn(n,e,t,r){let i=_t(n);if(!i)return null;let s=Pe(n);for(let o of s){let a=`${o}::${i}`,c=ae.get(a);if(!c)try{c=new Ne(o,i),ae.set(a,c)}catch{continue}try{let g=await c.resolve({path:e,nodePath:r,content:t,encoding:"utf-8"});if(g)return g}catch{B("[PythonCliAdapter] worker resolve error",{file:e,interpreter:o,nodePath:r}),ae.delete(a)}}return null}function Pt(n,e){let t=Et(n,["-c",Dn,e],{encoding:"utf8"});if(t.error||typeof t.stdout!="string")return null;try{let r=JSON.parse(t.stdout.trim()||"{}");return r&&r.error?null:r}catch{return null}}function Rt(n,e,t){let r=Et(n,["-c",Tn,e,t],{encoding:"utf8"});if(r.error||typeof r.stdout!="string")return null;try{let i=JSON.parse(r.stdout.trim()||"{}");return i&&i.error||typeof i.start!="number"||typeof i.end!="number"?null:i}catch{return null}}async function Fn(n){let e=Date.now(),t=!1,r=null;try{r=await jn(n.projectRoot,n.absPath,n.content),t=!!r}catch{}if(!r){let o=Pe(n.projectRoot),a=null;for(let c of o)if(r=Pt(c,n.absPath),r){a=c;break}if(!r&&o.length>1){for(let c of o.slice().reverse())if(r=Pt(c,n.absPath),r){a=c;break}}if(!r){B(`[PythonCliAdapter] parse failed for ${n.relPath} (interpreters tried: ${o.join(", ")})`);let c=Date.now()-e;return c>2e3&&B("[PythonCliAdapter] parse slow (failed)",{file:n.relPath,ms:c}),null}a&&B(`[PythonCliAdapter] parse ok for ${n.relPath} via ${a}`)}let i=[];for(let o of r.references||[]){let a={};o.expression&&(a.expression=o.expression),o.objectName&&(a.objectName=o.objectName),o.containerName&&(a.containerName=o.containerName),o.containerKind&&(a.containerKind=o.containerKind),i.push({sourceStart:o.start,sourceEnd:o.end,refKind:o.kind,refName:o.name,receiverName:o.receiverName??o.objectName??null,arity:typeof o.arity=="number"?o.arity:null,containerQualifiedName:o.containerQualifiedName??null,targetSymbolKey:o.targetSymbolKey??null,metadata:Object.keys(a).length?a:null})}let s=Date.now()-e;return s>2e3&&B("[PythonCliAdapter] parse slow",{file:n.relPath,ms:s,usedWorker:t}),{nodes:r.nodes,imports:r.imports,importBindings:r.importBindings,references:i,modulePublic:r.modulePublic??void 0,explicitExports:r.explicitExports??void 0}}function kt(){return J({id:"python",extensions:[".py",".pyw",".pyi"],exportKind:"named",parse:({absPath:n,relPath:e,projectRoot:t,content:r})=>Fn({absPath:n,relPath:e,projectRoot:t,content:r}),resolve:async({absPath:n,nodePath:e,projectRoot:t})=>{try{let i=we.readFileSync(n,"utf8"),s=await Mn(t,n,i,e);if(s)return s}catch{}let r=Pe(t);for(let i of r){let s=Rt(i,n,e);if(s)return s}for(let i of r.slice().reverse()){let s=Rt(i,n,e);if(s)return s}return null}})}import At from"fs";import It from"path";import{spawn as Ln,spawnSync as qi}from"child_process";var Bn=256e3,$n=32;function Y(...n){try{let e=n.map(t=>{if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ");process.stderr.write(e+`
|
|
505
|
-
`)}catch{}}var Xe=class{constructor(e){this.cmd=e;this.proc=null;this.buffer="";this.pending=new Map;this.seq=1;this.closed=!1;this.ensureProcess()}ensureProcess(){if(!(this.proc&&!this.closed)){if(this.closed=!1,this.proc=Ln(this.cmd,["--server"],{stdio:["pipe","pipe","pipe"]}),!this.proc.stdout||!this.proc.stderr||!this.proc.stdin)throw this.closed=!0,new Error("csharp indexer stdio unavailable");this.proc.stdout.on("data",e=>this.onData(e)),this.proc.stderr.on("data",e=>{Y(`[CSharpIndexer] ${e.toString("utf8").trim()}`)}),this.proc.stdin.on("error",e=>this.handleExit(e)),this.proc.on("error",e=>this.handleExit(e)),this.proc.on("exit",e=>this.handleExit(new Error(`csharp indexer exited with code ${e}`)))}}handleExit(e){if(!this.closed){this.closed=!0;for(let[,t]of this.pending)t.reject(e);this.pending.clear()}}onData(e){for(this.buffer+=e.toString("utf8");;){let t=this.buffer.indexOf(`
|
|
506
|
-
`);if(t<0)break;let r=this.buffer.slice(0,t).trim();if(this.buffer=this.buffer.slice(t+1),!r)continue;let i=null;try{i=JSON.parse(r)}catch{continue}let s=this.pending.get(i.id);s&&(this.pending.delete(i.id),i.ok?s.resolve(i):s.reject(new Error(i.error||"csharp server error")))}}async request(e,t=1){this.ensureProcess();let r=this.seq++;return new Promise((i,s)=>{let o={id:r,...e};this.pending.set(r,{resolve:i,reject:s});try{this.proc.stdin.write(`${JSON.stringify(o)}
|
|
507
|
-
`)}catch(a){if(this.pending.delete(r),t>0){try{this.handleExit(a)}catch{}return this.request(e,t-1).then(i,s)}s(a)}})}async parseBatch(e){let t=await this.request({op:"parse",files:e});return"results"in t?t.results.map(r=>r.ok&&r.result?r.result:null):"result"in t?[t.result]:e.map(()=>null)}async resolve(e){let t=await this.request({op:"resolve",...e});return"result"in t&&t.result&&typeof t.result.start=="number"?t.result:null}async resolveReferences(e){let t=await this.request({op:"resolve-references",...e});return"result"in t&&t.result?t.result:null}close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pending)t.reject(new Error("csharp indexer client closed"));this.pending.clear();let e=this.proc;if(this.proc=null,!!e){try{e.stdin?.end()}catch{}try{e.kill()}catch{}}}},Ue=class{constructor(e){this.client=e;this.queue=[];this.scheduled=!1}enqueue(e){return new Promise((t,r)=>{this.queue.push({input:e,resolve:t,reject:r,startedAt:Date.now()}),this.scheduled||(this.scheduled=!0,setImmediate(()=>this.flush()))})}async flush(){for(this.scheduled=!1;this.queue.length;){let e=[],t=0;for(;this.queue.length&&e.length<$n;){let r=this.queue[0];if(e.length>0&&t+r.input.size>Bn)break;e.push(this.queue.shift()),t+=r.input.size}try{let r=await this.client.parseBatch(e.map(i=>({file:i.input.file,root:i.input.root,lang:i.input.lang})));for(let i=0;i<e.length;i+=1){let s=e[i],o=r[i]??null,a=Date.now()-s.startedAt;a>2e3&&Y(`[${new Date().toISOString()}] [CSharpCliAdapter] parse slow`,{file:s.input.file,ms:a,path:"custom",ok:!!o}),o||Y(`[${new Date().toISOString()}] [CSharpCliAdapter] parse failed`,{file:s.input.file,ms:a,path:"custom"}),s.resolve(o)}}catch(r){for(let i of e)i.reject(r)}}}},Kt=new Map,Dt=new Map;function zn(n){let e=process.platform==="win32"?".cmd":"",t=W(`csharp-indexer/bin/pando-csharp-indexer${e}`);if(t)return t;if(n){let i=It.resolve(n,"tools/csharp-indexer/bin/pando-csharp-indexer"+e);if(At.existsSync(i))return i}let r=It.resolve(__dirname,"../../../../../tools/csharp-indexer/bin/pando-csharp-indexer"+e);return At.existsSync(r)?r:null}function Tt(n){let e=process.env.PANDO_CSHARP_INDEXER_CMD||zn(n);if(!e)return null;let t=Kt.get(e);t||(t=new Xe(e),Kt.set(e,t));let r=Dt.get(e);return r||(r=new Ue(t),Dt.set(e,r)),{client:t,batcher:r}}async function qn(n,e,t){let r=Tt(e);if(!r)return null;try{return await r.batcher.enqueue({file:n,root:e,lang:"csharp",size:t})}catch(i){return Y(`[${new Date().toISOString()}] [CSharpCliAdapter] parse error`,{file:n,error:i?.message||i,path:"custom"}),null}}async function Jn(n,e,t){let r=await qn(n,e,t);return r||null}function Ot(){return J({id:"csharp",extensions:[".cs",".csx",".cshtml",".razor"],parse:({absPath:n,projectRoot:e,content:t,meta:r})=>{let i=r?.size??Buffer.byteLength(t,"utf8");return Jn(n,e,i)},resolve:({absPath:n,nodePath:e,projectRoot:t})=>{let r=Date.now(),i=Tt(t);return i?i.client.resolve({file:n,root:t,lang:"csharp",nodePath:e}).then(s=>{let o=Date.now()-r;return o>2e3&&Y(`[${new Date().toISOString()}] [CSharpCliAdapter] resolve slow`,{file:n,ms:o}),s||Y(`[${new Date().toISOString()}] [CSharpCliAdapter] resolve failed`,{file:n,ms:o,nodePath:e}),s}).catch(s=>{let o=Date.now()-r;return Y(`[${new Date().toISOString()}] [CSharpCliAdapter] resolve error`,{file:n,ms:o,nodePath:e,error:s?.message||s}),null}):null}})}import{spawnSync as Hn}from"child_process";import Yn from"path";import X from"fs";import k from"path";var Re=new Map,Wn=["include","src","lib","libs","third_party","third-party","deps","vendor"];function Mt(n){let e=[],t="",r=null,i=!1;for(let s=0;s<n.length;s+=1){let o=n[s];if(i){t+=o,i=!1;continue}if(o==="\\"){i=!0;continue}if(r){o===r?r=null:t+=o;continue}if(o==='"'||o==="'"){r=o;continue}if(o===" "||o===`
|
|
508
|
-
`||o===" "||o==="\r"){t&&(e.push(t),t="");continue}t+=o}return t&&e.push(t),e}function Xn(n,e){let t=[];for(let r=0;r<n.length;r+=1){let i=n[r];if(i!=="-c"){if(i==="-o"){r+=1;continue}i!==e&&((i.endsWith(".c")||i.endsWith(".cc")||i.endsWith(".cpp")||i.endsWith(".cxx")||i.endsWith(".c++"))&&k.isAbsolute(i)||t.push(i))}}return t}function Ft(n,e){return k.isAbsolute(n)?k.resolve(n):e?k.resolve(e,n):k.resolve(n)}function Un(n){try{let e=X.readFileSync(n,"utf8"),t=JSON.parse(e),r=new Map;for(let i of t){let s=i.directory?k.resolve(i.directory):void 0,o=i.file?Ft(i.file,s):null;if(!o)continue;let a=s??k.dirname(o),c=Array.isArray(i.arguments)?i.arguments:i.command?Mt(i.command):[];if(c.length===0)continue;let g=Xn(c.slice(1),o);r.set(o,{args:g,cwd:a})}return r}catch{return null}}function Qn(n){try{let e=X.readFileSync(n,"utf8");return Mt(e.replace(/\r/g,`
|
|
509
|
-
`))}catch{return null}}function Lt(n){let e=k.join(n,"compile_commands.json");if(X.existsSync(e))return e;let t=["build","out","build-debug","build-release","cmake-build-debug","cmake-build-release"];for(let a of t){let c=k.join(n,a,"compile_commands.json");if(X.existsSync(c))return c}let r=t.map(a=>k.join(n,a)).filter(a=>X.existsSync(a));r.push(n);let i=10,s=new Set,o=(a,c)=>{if(c>i)return null;let g=k.resolve(a);if(s.has(g))return null;s.add(g);try{let d=X.readdirSync(a,{withFileTypes:!0});for(let m of d)if(m.isFile()&&m.name==="compile_commands.json")return k.join(a,m.name);for(let m of d){if(!m.isDirectory()||m.name==="node_modules"||m.name.startsWith("."))continue;let y=o(k.join(a,m.name),c+1);if(y)return y}}catch{}return null};for(let a of r){let c=o(a,0);if(c)return c}return null}function Vn(n,e){let t=k.resolve(n),r=k.resolve(e);for(;;){let i=Lt(t);if(i)return i;if(t===r)break;let s=k.dirname(t);if(s===t)break;t=s}return null}function Bt(n){let e=k.join(n,"compile_flags.txt");if(X.existsSync(e))return e;let t=["build","out","build-debug","build-release","cmake-build-debug","cmake-build-release"];for(let r of t){let i=k.join(n,r,"compile_flags.txt");if(X.existsSync(i))return i}return null}function Gn(n,e){let t=k.resolve(n),r=k.resolve(e);for(;;){let i=Bt(t);if(i)return i;if(t===r)break;let s=k.dirname(t);if(s===t)break;t=s}return null}function Ee(n){if(n)try{return X.statSync(n).mtimeMs}catch{return}}function jt(n,e){let t=e?`${k.resolve(n)}::${k.resolve(e)}`:k.resolve(n),r=Re.get(t);if(r){let m=Ee(r.commandsPath);if(r.commandsPath&&m&&r.commandsMtime&&m!==r.commandsMtime)Re.delete(t);else if(r.flagsPath){let y=Ee(r.flagsPath);y&&r.flagsMtime&&y!==r.flagsMtime&&Re.delete(t)}else return r}let i=e?Vn(e,n):Lt(n),s=i?Un(i)??void 0:void 0,o=Ee(i),a=s?null:e?Gn(e,n):Bt(n),c=a?Qn(a)??void 0:void 0,g=Ee(a),d={commands:s,flags:c,commandsPath:i,commandsMtime:o,flagsPath:a,flagsMtime:g};return Re.set(t,d),d}function Qe(n,e,t){let r=k.dirname(e),i=jt(n);!i.commands&&!i.flags&&(i=jt(n,r));let s=Ft(e);if(i.commands){let o=i.commands.get(s);if(o)return{args:o.args,cwd:o.cwd,source:"compile_commands"}}return i.flags?{args:i.flags,cwd:n,source:"compile_flags"}:Ve(n,t)}function Ve(n,e){let t=["-std="+(e==="cpp"?"c++20":"c17")];t.push("-I",n);for(let r of Wn){let i=k.join(n,r);X.existsSync(i)&&t.push("-I",i)}return t.push("-ferror-limit=0"),{args:t,cwd:n,source:"fallback"}}function qt(n){let e=[0];for(let t=0;t<n.length;t+=1)n.charCodeAt(t)===10&&e.push(t+1);return e}function $t(n,e,t){if(!e||e<1)return 0;let r=Math.min(e-1,n.length-1),i=n[r]??0,s=Math.max((t??1)-1,0);return i+s}function le(n){return n?Yn.resolve(n):null}function zt(n,e,t){let r=Math.max(0,Math.min(t-1,n.length-1)),i=n[r]??0,s=r+1<n.length?n[r+1]:e;return Math.max(0,s-i)}function Z(n,e,t){let r=n.range?.begin??n.loc,i=n.range?.end??n.loc;if(!r?.line||r.line<1||r.line>e.length||r.col==null||r.col<1||i?.line&&(i.line<1||i.line>e.length)||i?.col!=null&&i.col<1)return null;let s=zt(e,t,r.line);if((r.col??1)-1>s)return null;if(i?.line){let c=zt(e,t,i.line);if((i.col??r.col??1)-1>c)return null}let o=$t(e,r.line,r.col),a=$t(e,i?.line??r.line,i?.col??r.col);return{start:o,end:Math.max(a,o)}}function Ae(n){let e=n.range?.begin?.file||n.loc?.file||n.range?.end?.file||null;if(e)return le(e);let t=n.range?.begin?.includedFrom?.file||n.range?.end?.includedFrom?.file||null;return le(t)}function Zn(n){let e=n.access;return typeof e=="string"?e:null}function er(n,e){let t={};e.containerName&&(t.containerName=e.containerName);let r=Zn(n);r&&(t.visibility=r);let i=n.storageClass;i&&(t.storageClass=i);let s=n.isInline;typeof s=="boolean"&&(t.isInline=s);let o=n.isConstexpr;typeof o=="boolean"&&(t.isConstexpr=o);let a=n.isVirtual;typeof a=="boolean"&&(t.isVirtual=a);let c=n.isStatic;typeof c=="boolean"&&(t.isStatic=c);let g=n.type;return typeof g=="string"&&(t.type=g),t}function Ge(n,e,t){switch(n){case"FunctionDecl":return{kind:"Function",semanticKind:"function"};case"CXXMethodDecl":case"CXXConstructorDecl":case"CXXDestructorDecl":case"CXXConversionDecl":return{kind:"Method",semanticKind:"method"};case"FunctionTemplateDecl":case"ClassTemplateDecl":case"TypeAliasTemplateDecl":return{kind:"Template",semanticKind:"template"};case"ConceptDecl":return{kind:"Concept",semanticKind:"type"};case"TemplateTypeParmDecl":case"NonTypeTemplateParmDecl":case"TemplateTemplateParmDecl":return{kind:"TemplateParameter",semanticKind:"template"};case"NamespaceDecl":return{kind:"Namespace",semanticKind:"namespace"};case"NamespaceAliasDecl":return{kind:"NamespaceAlias",semanticKind:"namespace"};case"RecordDecl":return e==="struct"?{kind:"Struct",semanticKind:"struct"}:e==="union"?{kind:"Union",semanticKind:"union"}:{kind:"Class",semanticKind:"class"};case"EnumDecl":return{kind:"Enum",semanticKind:"enum"};case"EnumConstantDecl":return{kind:"EnumMember",semanticKind:"enum"};case"FieldDecl":return{kind:"Field",semanticKind:"field"};case"VarDecl":return{kind:t?"Field":"Variable",semanticKind:t?"field":"variable"};case"TypedefDecl":case"TypeAliasDecl":case"UsingDecl":case"UsingDirectiveDecl":case"UsingEnumDecl":return{kind:"TypeAlias",semanticKind:"type"};case"ParmVarDecl":return{kind:"Param",semanticKind:"variable"};case"MacroDefinition":return{kind:"Macro",semanticKind:"macro"};default:return null}}function tr(n,e,t,r){let i=[],s=le(e),o=(a,c)=>{let g=Ae(a),m=g&&(!s||g===s)?Ge(a.kind,a.tagUsed,c.containerKind):null,y=a.name;if(m&&y){m.kind==="Method"&&typeof y=="string"&&y.startsWith("operator")&&(m={kind:"Operator",semanticKind:"method"});let C=Z(a,t,r);if(C){let w=er(a,c);(m.kind==="Template"||m.kind==="TemplateParameter")&&(w.isTemplate=!0),m.kind==="Operator"&&(w.isOperator=!0),i.push({name:y,kind:m.kind,rawKind:a.kind??null,rawKindSource:"clang",semanticKind:m.semanticKind??null,start:C.start,end:C.end,isExported:c.containerKind?0:1,containerKind:c.containerKind??null,containerRawKind:c.containerRawKind??null,containerRawKindSource:c.containerRawKind?"clang":null,paramCount:null,metadata:Object.keys(w).length?w:null})}}let P=c;if(a.kind==="RecordDecl"&&a.name){let C=Ge(a.kind,a.tagUsed,c.containerKind);C&&(P={containerKind:C.kind,containerName:a.name,containerRawKind:a.kind??null})}a.kind==="EnumDecl"&&a.name&&(P={containerKind:"Enum",containerName:a.name,containerRawKind:a.kind??null}),a.kind==="NamespaceDecl"&&a.name&&(P={containerKind:"Namespace",containerName:a.name,containerRawKind:a.kind??null});for(let C of a.inner??[])o(C,P)};return o(n,{}),{nodes:i}}function He(n,e,t){let r=Hn(n,e,{encoding:"utf8",cwd:t});if(r.error)return null;let i=(r.stdout||"").trim();if(!i)return null;try{return JSON.parse(i)}catch{return null}}function Jt(n){let e=`PANDO_${n.toUpperCase()}_INDEXER_CMD`;return process.env[e]||(n==="cpp"?"clang++":"clang")}function me(n){let e=n?.referencedDecl?.name||n.name;if(e)return e;for(let t of n.inner??[]){let r=me(t);if(r)return r}return null}function nr(n,e){let t=[],r=le(e),i=s=>{let o=Ae(s);if(o&&(!r||o===r)&&s.kind==="InclusionDirective"){let g=s.spelling||s.includeName||null||s.file||s.filename||s.includedFile||s.headerName||null;g&&t.push({module:String(g),isTypeOnly:0})}for(let c of s.inner??[])i(c)};return i(n),{imports:t}}function ke(n){if(n.kind==="MemberExpr"||n.kind==="ImplicitCastExpr")for(let e of n.inner??[]){if(e.kind==="DeclRefExpr"||e.kind==="MemberExpr")return e?.referencedDecl?.name||e.name||null;if(e.kind==="CXXThisExpr")return null;if(e.kind==="ImplicitCastExpr")return ke(e)}if(n.kind==="CallExpr"||n.kind==="CXXMemberCallExpr"){for(let e of n.inner??[])if(e.kind==="MemberExpr")return ke(e)}return null}function rr(n){return!n.inner||n.inner.length===0?null:n.kind==="CallExpr"?Math.max(0,n.inner.length-1):n.kind==="CXXConstructExpr"||n.kind==="CXXNewExpr"?n.inner.length:null}function ir(n){if(n.kind!=="CallExpr")return null;let e=n.inner?.[0];return e&&e.kind==="MemberExpr"?ke(e):null}function _e(n,e){return n.containerQualifiedName?`${n.containerQualifiedName}::${e}`:e}function sr(n,e,t,r){let i=[],s=le(e),o=r.length,a=(d,m,y)=>{let P=Ae(d),C=P&&(!s||P===s);if(C&&(d.kind==="CallExpr"||d.kind==="CXXConstructExpr"||d.kind==="CXXNewExpr")){let R=Z(d,t,o);if(R){let u=me(d),N=d.kind==="CallExpr"?"call":"new",E=r.slice(R.start,R.end),l=ir(d),x=rr(d);i.push({sourceStart:R.start,sourceEnd:R.end,refKind:N,refName:u,receiverName:l??void 0,arity:typeof x=="number"?x:void 0,containerQualifiedName:m.containerQualifiedName??void 0,metadata:E?{expression:E,containerName:m.containerName,containerKind:m.containerKind}:null})}}if(C&&d.kind==="TypeRef"){let R=Z(d,t,o);if(R){let u=me(d);i.push({sourceStart:R.start,sourceEnd:R.end,refKind:"type",refName:u,containerQualifiedName:m.containerQualifiedName??void 0,metadata:{containerName:m.containerName,containerKind:m.containerKind}})}}if(C&&(d.kind==="DeclRefExpr"||d.kind==="MemberExpr")&&!(y.includes("CallExpr")||y.includes("CXXConstructExpr")||y.includes("CXXNewExpr"))){let u=Z(d,t,o);if(u){let N=me(d),E=d.kind==="MemberExpr"?ke(d):void 0;i.push({sourceStart:u.start,sourceEnd:u.end,refKind:"reference",refName:N,receiverName:E??void 0,containerQualifiedName:m.containerQualifiedName??void 0,metadata:{containerName:m.containerName,containerKind:m.containerKind}})}}if(C&&(d.kind==="MacroExpansion"||d.kind==="MacroInstantiation")){let R=Z(d,t,o);if(R){let u=me(d);i.push({sourceStart:R.start,sourceEnd:R.end,refKind:"macro",refName:u,containerQualifiedName:m.containerQualifiedName??void 0,metadata:{containerName:m.containerName,containerKind:m.containerKind}})}}let w=m;if(d.kind==="RecordDecl"&&d.name){let R=Ge(d.kind,d.tagUsed,m.containerKind);R&&(w={containerKind:R.kind,containerName:d.name,containerQualifiedName:_e(m,d.name)})}d.kind==="EnumDecl"&&d.name&&(w={containerKind:"Enum",containerName:d.name,containerQualifiedName:_e(m,d.name)}),d.kind==="NamespaceDecl"&&d.name&&(w={containerKind:"Namespace",containerName:d.name,containerQualifiedName:_e(m,d.name)}),(d.kind==="FunctionDecl"||d.kind==="CXXMethodDecl"||d.kind==="CXXConstructorDecl"||d.kind==="CXXDestructorDecl")&&d.name&&(w={...w,containerQualifiedName:_e(m,d.name)});let A=y.slice();d.kind&&A.push(d.kind);for(let R of d.inner??[])a(R,w,A)};a(n,{},[]);let c=new Set,g=[];for(let d of i){let m=`${d.sourceStart}:${d.sourceEnd}:${d.refKind}:${d.refName??""}:${d.targetNodeId??""}:${d.targetFile??""}`;c.has(m)||(c.add(m),g.push(d))}return{references:g}}function or(n){if(!n)return null;let e=n;(e.startsWith("SyntaxError:")||e.startsWith("CompileError:"))&&(e=e.substring(e.indexOf(":")+1)),e.includes("#")&&(e=e.split("#")[1]);let t=e.lastIndexOf(":"),r=t>=0?e.slice(0,t):e,[i,s]=r.split("-"),o=Number(i),a=Number(s);return!Number.isFinite(o)||!Number.isFinite(a)||a<o?null:{start:o,end:a}}function ar(n,e,t,r,i){let s=or(t);if(!s)return null;let o=Jt(n),a=Qe(i,e,n),c=[...a.args,"-Xclang","-ast-dump=json","-Xclang","-detailed-preprocessing-record","-fsyntax-only","-fno-color-diagnostics","-fno-diagnostics-color",...a.source==="fallback"?["-x",n==="cpp"?"c++":"c"]:[],e],g=He(o,c,a.cwd);if(!g||g.kind!=="TranslationUnitDecl")return null;let d=qt(r),m=r.length,y=le(e),P=null,C=A=>{if(P)return;let R=Ae(A),N=R&&(!y||R===y)?Z(A,d,m):null;if(N&&N.start===s.start&&N.end===s.end){let E=null,l=null;for(let x of A.inner??[])if(x.kind==="CompoundStmt"){let S=Z(x,d,m);if(S){E=S.start,l=S.end;break}}P={start:N.start,end:N.end,bodyStart:E,bodyEnd:l};return}for(let E of A.inner??[])C(E)};if(C(g),!P)return null;let w=P;return{start:w.start,end:w.end,bodyStart:w.bodyStart??null,bodyEnd:w.bodyEnd??null,text:r.slice(w.start,w.end)}}function Ye(n){return J({id:n,extensions:[],parse:({absPath:e,relPath:t,content:r,projectRoot:i})=>{let s=Jt(n),o=Qe(i,e,n),a=C=>[...C.args,"-Xclang","-ast-dump=json","-Xclang","-detailed-preprocessing-record","-fsyntax-only","-fno-color-diagnostics","-fno-diagnostics-color",...C.source==="fallback"?["-x",n==="cpp"?"c++":"c"]:[],e],c=He(s,a(o),o.cwd);if(!c&&o.source!=="fallback"){let C=Ve(i,n);c=He(s,a(C),C.cwd)}if(!c||c.kind!=="TranslationUnitDecl")return null;let g=qt(r??""),d=(r??"").length,{nodes:m}=tr(c,e,g,d),{imports:y}=nr(c,e),{references:P}=sr(c,e,g,r??"");return{nodes:m,imports:y,importBindings:[],references:P}},resolve:({absPath:e,nodePath:t,projectRoot:r})=>{try{let i=dn("fs").readFileSync(e,"utf8");return ar(n,e,t,i,r)}catch{return null}}})}import Ze from"fs";import et from"path";import{spawn as lr,spawnSync as ss}from"child_process";var cr=256e3,ur=32;function ee(...n){try{let e=n.map(t=>{if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ");process.stderr.write(e+`
|
|
510
|
-
`)}catch{}}var tt=class{constructor(e){this.cmd=e;this.proc=null;this.buffer="";this.pending=new Map;this.seq=1;this.closed=!1;this.ensureProcess()}ensureProcess(){if(!(this.proc&&!this.closed)){if(this.closed=!1,this.proc=lr(this.cmd,["--server"],{stdio:["pipe","pipe","pipe"]}),!this.proc.stdout||!this.proc.stderr||!this.proc.stdin)throw this.closed=!0,new Error("dart indexer stdio unavailable");this.proc.stdout.on("data",e=>this.onData(e)),this.proc.stderr.on("data",e=>{ee(`[DartIndexer] ${e.toString("utf8").trim()}`)}),this.proc.stdin.on("error",e=>this.handleExit(e)),this.proc.on("error",e=>this.handleExit(e)),this.proc.on("exit",e=>this.handleExit(new Error(`dart indexer exited with code ${e}`)))}}handleExit(e){if(!this.closed){this.closed=!0;for(let[,t]of this.pending)t.reject(e);this.pending.clear()}}onData(e){for(this.buffer+=e.toString("utf8");;){let t=this.buffer.indexOf(`
|
|
511
|
-
`);if(t<0)break;let r=this.buffer.slice(0,t).trim();if(this.buffer=this.buffer.slice(t+1),!r)continue;let i=null;try{i=JSON.parse(r)}catch{continue}let s=this.pending.get(i.id);s&&(this.pending.delete(i.id),i.ok?s.resolve(i):s.reject(new Error(i.error||"dart server error")))}}async request(e,t=1){this.ensureProcess();let r=this.seq++;return new Promise((i,s)=>{let o={id:r,...e};this.pending.set(r,{resolve:i,reject:s});try{this.proc.stdin.write(`${JSON.stringify(o)}
|
|
512
|
-
`)}catch(a){if(this.pending.delete(r),t>0){try{this.handleExit(a)}catch{}return this.request(e,t-1).then(i,s)}s(a)}})}async parseBatch(e){let t=await this.request({op:"parse",files:e});return"results"in t&&Array.isArray(t.results)?t.results.map(r=>r.ok&&r.result?r.result:null):"result"in t&&t.result?[t.result]:e.map(()=>null)}async resolve(e){let t=await this.request({op:"resolve",...e});return"result"in t&&t.result&&typeof t.result.start=="number"?t.result:null}close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pending)t.reject(new Error("dart indexer client closed"));this.pending.clear();let e=this.proc;if(this.proc=null,!!e){try{e.stdin?.end()}catch{}try{e.kill()}catch{}}}},nt=class{constructor(e){this.client=e;this.queue=[];this.scheduled=!1}enqueue(e){return new Promise((t,r)=>{this.queue.push({input:e,resolve:t,reject:r,startedAt:Date.now()}),this.scheduled||(this.scheduled=!0,setImmediate(()=>this.flush()))})}async flush(){for(this.scheduled=!1;this.queue.length;){let e=[],t=0;for(;this.queue.length&&e.length<ur;){let r=this.queue[0];if(e.length>0&&t+r.input.size>cr)break;e.push(this.queue.shift()),t+=r.input.size}try{let r=await this.client.parseBatch(e.map(i=>({file:i.input.file,root:i.input.root,lang:i.input.lang})));for(let i=0;i<e.length;i+=1){let s=e[i],o=r[i]??null,a=Date.now()-s.startedAt;a>2e3&&ee(`[${new Date().toISOString()}] [DartCliAdapter] parse slow`,{file:s.input.file,ms:a,ok:!!o}),o||ee(`[${new Date().toISOString()}] [DartCliAdapter] parse failed`,{file:s.input.file,ms:a}),s.resolve(o)}}catch(r){for(let i of e)i.reject(r)}}}},Wt=new Map,Xt=new Map;function dr(n){let e=process.platform==="win32"?".cmd":"",t=W(`dart-indexer/bin/pando-dart-indexer${e}`);if(t)return t;if(n){let s=et.resolve(n,"tools/dart-indexer/bin/pando-dart-indexer"+e);if(Ze.existsSync(s))return s}let r=process.env.PANDO_EXTENSION_ROOT;if(r){let s=et.resolve(r,"tools/dart-indexer/bin/pando-dart-indexer"+e);if(Ze.existsSync(s))return s}let i=et.resolve(process.cwd(),"tools/dart-indexer/bin/pando-dart-indexer"+e);return Ze.existsSync(i)?i:null}function Ut(n){let e=process.env.PANDO_DART_INDEXER_CMD||dr(n);if(!e)return null;let t=Wt.get(e);t||(t=new tt(e),Wt.set(e,t));let r=Xt.get(e);return r||(r=new nt(t),Xt.set(e,r)),{client:t,batcher:r}}async function pr(n,e,t){let r=Ut(e);if(!r)return null;try{return await r.batcher.enqueue({file:n,root:e,lang:"dart",size:t})}catch(i){return ee(`[${new Date().toISOString()}] [DartCliAdapter] parse error`,{file:n,error:i?.message||i}),null}}function Qt(){return J({id:"dart",extensions:[".dart"],parse:async({absPath:n,projectRoot:e,content:t,meta:r})=>{let i=r?.size??Buffer.byteLength(t,"utf8");return pr(n,e,i)},resolve:({absPath:n,nodePath:e,projectRoot:t})=>{let r=Date.now(),i=Ut(t);return i?i.client.resolve({file:n,root:t,lang:"dart",nodePath:e}).then(s=>{let o=Date.now()-r;return o>2e3&&ee(`[${new Date().toISOString()}] [DartCliAdapter] resolve slow`,{file:n,ms:o}),s||ee(`[${new Date().toISOString()}] [DartCliAdapter] resolve failed`,{file:n,ms:o,nodePath:e}),s}).catch(s=>{let o=Date.now()-r;return ee(`[${new Date().toISOString()}] [DartCliAdapter] resolve error`,{file:n,ms:o,nodePath:e,error:s?.message||s}),null}):null},exportKind:"dart"})}import rt from"fs";import ge from"path";import{spawn as fr,spawnSync as ps}from"child_process";var mr=256e3,gr=32;function ne(...n){try{let e=n.map(t=>{if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ");process.stderr.write(e+`
|
|
513
|
-
`)}catch{}}var it=class{constructor(e){this.cmd=e;this.proc=null;this.buffer="";this.pending=new Map;this.seq=1;this.closed=!1;this.ensureProcess()}ensureProcess(){if(!(this.proc&&!this.closed)){if(this.closed=!1,this.proc=fr(this.cmd,["--server"],{stdio:["pipe","pipe","pipe"]}),!this.proc.stdout||!this.proc.stderr||!this.proc.stdin)throw this.closed=!0,new Error("java indexer stdio unavailable");this.proc.stdout.on("data",e=>this.onData(e)),this.proc.stderr.on("data",e=>{ne(`[JavaCliAdapter] ${e.toString("utf8").trim()}`)}),this.proc.stdin.on("error",e=>this.handleExit(e)),this.proc.on("error",e=>this.handleExit(e)),this.proc.on("exit",e=>this.handleExit(new Error(`java indexer exited with code ${e}`)))}}handleExit(e){if(!this.closed){this.closed=!0;for(let[,t]of this.pending)clearTimeout(t.timer),t.reject(e);this.pending.clear()}}onData(e){for(this.buffer+=e.toString("utf8");;){let t=this.buffer.indexOf(`
|
|
514
|
-
`);if(t<0)break;let r=this.buffer.slice(0,t).trim();if(this.buffer=this.buffer.slice(t+1),!r)continue;let i=null;try{i=JSON.parse(r)}catch{continue}let s=this.pending.get(i.id);s&&(clearTimeout(s.timer),this.pending.delete(i.id),i.ok?s.resolve(i):s.reject(new Error(i.error||"java server error")))}}async request(e,t=1){this.ensureProcess();let r=this.seq++;return new Promise((i,s)=>{let o={id:r,...e},a=setTimeout(()=>{this.pending.delete(r),s(new Error("java indexer request timed out after 30s"))},3e4);this.pending.set(r,{resolve:i,reject:s,timer:a});try{this.proc.stdin.write(`${JSON.stringify(o)}
|
|
515
|
-
`)}catch(c){if(clearTimeout(a),this.pending.delete(r),t>0){try{this.handleExit(c)}catch{}return this.request(e,t-1).then(i,s)}s(c)}})}async parseBatch(e){let t=await this.request({op:"parse",files:e});return"results"in t?t.results.map(r=>r.ok&&r.result?r.result:null):"result"in t?[t.result]:e.map(()=>null)}async resolve(e){let t=await this.request({op:"resolve",...e});return"result"in t&&t.result&&typeof t.result.start=="number"?t.result:null}close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pending)clearTimeout(t.timer),t.reject(new Error("java indexer client closed"));this.pending.clear();let e=this.proc;if(this.proc=null,!!e){try{e.stdin?.end()}catch{}try{e.kill()}catch{}}}},st=class{constructor(e){this.client=e;this.queue=[];this.scheduled=!1}enqueue(e){return new Promise((t,r)=>{this.queue.push({input:e,resolve:t,reject:r,startedAt:Date.now()}),this.scheduled||(this.scheduled=!0,setImmediate(()=>this.flush()))})}async flush(){for(this.scheduled=!1;this.queue.length;){let e=[],t=0;for(;this.queue.length&&e.length<gr;){let r=this.queue[0];if(e.length>0&&t+r.input.size>mr)break;e.push(this.queue.shift()),t+=r.input.size}try{let r=await this.client.parseBatch(e.map(i=>({file:i.input.file,root:i.input.root,lang:i.input.lang})));for(let i=0;i<e.length;i+=1){let s=e[i],o=r[i]??null,a=Date.now()-s.startedAt;a>2e3&&ne(`[${new Date().toISOString()}] [JavaCliAdapter] parse slow`,{file:s.input.file,ms:a,path:"custom",ok:!!o}),o||ne(`[${new Date().toISOString()}] [JavaCliAdapter] parse failed`,{file:s.input.file,ms:a,path:"custom"}),s.resolve(o)}}catch(r){for(let i of e)i.reject(r)}}}},Vt=new Map,Gt=new Map;function hr(){return typeof __dirname=="string"?__dirname:process.cwd()}var te,yr;function br(n){if(te!==void 0&&yr===n)return te;let e=process.platform==="win32"?".cmd":"",t="tools/java-indexer/bin/pando-java-indexer"+e,r=W(`java-indexer/bin/pando-java-indexer${e}`);if(r)return te=r,r;if(n){let s=ge.resolve(n,t);if(rt.existsSync(s))return te=s,s}let i=hr();for(let s=0;s<8;s++){let o=ge.join(i,t);if(rt.existsSync(o))return te=o,o;let a=ge.dirname(i);if(a===i)break;i=a}i=process.cwd();for(let s=0;s<8;s++){let o=ge.join(i,t);if(rt.existsSync(o))return te=o,o;let a=ge.dirname(i);if(a===i)break;i=a}return te=null,null}function Ht(n){let e=process.env.PANDO_JAVA_INDEXER_CMD||br(n);if(!e)return null;let t=Vt.get(e);t||(t=new it(e),Vt.set(e,t));let r=Gt.get(e);return r||(r=new st(t),Gt.set(e,r)),{client:t,batcher:r}}async function xr(n,e,t){let r=Ht(e);if(!r)return null;try{return await r.batcher.enqueue({file:n,root:e,lang:"java",size:t})}catch(i){return ne(`[${new Date().toISOString()}] [JavaCliAdapter] parse error`,{file:n,error:i?.message||i,path:"custom"}),null}}async function vr(n,e,t){let r=await xr(n,e,t);return r||null}function Yt(){return J({id:"java",extensions:[".java"],exportKind:"named",parse:({absPath:n,projectRoot:e,content:t,meta:r})=>{let i=r?.size??Buffer.byteLength(t,"utf8");return vr(n,e,i)},resolve:({absPath:n,nodePath:e,projectRoot:t})=>{let r=Date.now(),i=Ht(t);return i?i.client.resolve({file:n,root:t,lang:"java",nodePath:e}).then(s=>{let o=Date.now()-r;return o>2e3&&ne(`[${new Date().toISOString()}] [JavaCliAdapter] resolve slow`,{file:n,ms:o}),s||ne(`[${new Date().toISOString()}] [JavaCliAdapter] resolve failed`,{file:n,ms:o,nodePath:e}),s}).catch(s=>{let o=Date.now()-r;return ne(`[${new Date().toISOString()}] [JavaCliAdapter] resolve error`,{file:n,ms:o,nodePath:e,error:s?.message||s}),null}):null}})}import kr from"fs";import Rr from"os";import{spawn as Sr}from"child_process";import ot from"fs";import at from"path";function Zt(n,e){let t=process.platform==="win32"?".cmd":"",r=n==="clojure-editor"?"pando-clojure-editor":"pando-clojure-indexer",i=W(`${n}/bin/${r}${t}`);if(i)return i;if(e){let a=at.resolve(e,`tools/${n}/bin/${r}${t}`);if(ot.existsSync(a))return a}let s=process.env.PANDO_EXTENSION_ROOT;if(s){let a=at.resolve(s,`tools/${n}/bin/${r}${t}`);if(ot.existsSync(a))return a}let o=at.resolve(process.cwd(),`tools/${n}/bin/${r}${t}`);return ot.existsSync(o)?o:null}var Ke=3e4,Cr=Math.max(Ke,Number(process.env.PANDO_CLOJURE_PARSE_TIMEOUT_MS||`${300*1e3}`)),wr=Math.max(Ke,Number(process.env.PANDO_CLOJURE_CHANGE_SIGNATURE_TIMEOUT_MS||`${300*1e3}`)),en="__PANDO_CLOJURE_INDEX__";function Nr(...n){if(!re())return;let e=n.map(t=>{if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ");L("ClojureIndexer",e)}function he(n,e){re()&&L("ClojureIndex",n,e)}function Pr(n,e=0){let t=Math.max(1,n.length),r=Math.ceil(Math.max(0,e)/(32*1024))*500,i=15e3+t*2500+r;return Math.max(Ke,Math.min(Cr,i))}var Ie=class{constructor(e,t){this.cmd=e;this.projectRoot=t;this.proc=null;this.buffer="";this.stderrBuffer="";this.pending=new Map;this.seq=1;this.closed=!1;this.ensureProcess()}ensureProcess(){if(!(this.proc&&!this.closed)){if(this.closed=!1,he("node.server.spawn",{projectRoot:this.projectRoot,cmd:this.cmd}),this.proc=Sr(this.cmd,["--server"],{cwd:this.projectRoot,stdio:["pipe","pipe","pipe"],env:{...process.env,PANDO_PROJECT_ROOT:this.projectRoot}}),!this.proc.stdout||!this.proc.stderr||!this.proc.stdin)throw this.closed=!0,new Error("clojure indexer stdio unavailable");this.proc.stdout.on("data",e=>this.onData(e)),this.proc.stderr.on("data",e=>this.onStderr(e)),this.proc.on("error",e=>this.handleExit(e)),this.proc.on("exit",e=>this.handleExit(new Error(`clojure indexer exited with code ${e}`)))}}handleExit(e){if(!this.closed){he("node.server.exit",{projectRoot:this.projectRoot,error:e?.message||String(e),pendingRequestCount:this.pending.size}),this.closed=!0;for(let[,t]of this.pending)clearTimeout(t.timer),t.reject(e);this.pending.clear(),this.proc=null}}onData(e){for(this.buffer+=e.toString("utf8");;){let t=this.buffer.indexOf(`
|
|
516
|
-
`);if(t<0)break;let r=this.buffer.slice(0,t).trim();if(this.buffer=this.buffer.slice(t+1),!r)continue;let i=null;try{i=JSON.parse(r)}catch{continue}let s=this.pending.get(i.id);s&&(clearTimeout(s.timer),this.pending.delete(i.id),i.ok?s.resolve(i):s.reject(new Error(i.error||"clojure server error")))}}onStderr(e){for(this.stderrBuffer+=e.toString("utf8");;){let t=this.stderrBuffer.indexOf(`
|
|
517
|
-
`);if(t<0)break;let r=this.stderrBuffer.slice(0,t).trim();if(this.stderrBuffer=this.stderrBuffer.slice(t+1),!!r){if(r.startsWith(en)){let i=r.slice(en.length);try{let s=JSON.parse(i);he(s.event||"jvm.trace",s)}catch(s){L("ClojureIndexer","stderr trace parse failed",{error:s?.message||String(s),line:r})}continue}Nr(r)}}}close(){if(this.closed)return;this.closed=!0;for(let[,t]of this.pending)clearTimeout(t.timer),t.reject(new Error("clojure indexer client closed"));this.pending.clear();let e=this.proc;if(this.proc=null,!!e){try{e.stdin?.end()}catch{}try{e.kill()}catch{}}}async request(e,t){this.ensureProcess();let r=this.seq++,i=t?.retry??1,s=t?.timeoutMs??Ke,o=Date.now();return new Promise((a,c)=>{let g={id:r,...e},d=setTimeout(()=>{this.pending.delete(r),c(new Error(`clojure indexer request timed out after ${s}ms`))},s);this.pending.set(r,{resolve:m=>{he("node.client.request.complete",{projectRoot:this.projectRoot,id:r,op:e.op,durationMs:Date.now()-o}),a(m)},reject:c,timer:d});try{he("node.client.request.start",{projectRoot:this.projectRoot,id:r,op:e.op,timeoutMs:s}),this.proc.stdin.write(`${JSON.stringify(g)}
|
|
518
|
-
`)}catch(m){if(clearTimeout(d),this.pending.delete(r),i>0){try{this.handleExit(m)}catch{}return this.request(e,{retry:i-1,timeoutMs:s}).then(a,c)}c(m)}})}async parseBatch(e,t){let r=Pr(e,t?.batchBytes??0),i=await this.request({op:"parse",files:e,analysisMode:t.purpose==="query"?"full":"index",traceBatchId:t?.batchId,traceBatchBytes:t?.batchBytes},{timeoutMs:r});return"results"in i?i.results.map(s=>s.ok&&s.result?s.result:null):[]}async resolve(e){let t=await this.request({op:"resolve",...e});if("result"in t){let r=t.result;if(r&&typeof r.start=="number"&&typeof r.end=="number")return r}return null}async changeSignature(e){let t=await this.request({op:"change-signature",...e},{timeoutMs:wr});return"result"in t&&t.result||null}},tn=new Map;function nn(n){return process.env.PANDO_CLOJURE_INDEXER_CMD||Zt("clojure-indexer",n)}function rn(n){let e=nn(n);return e?new Ie(e,n):null}function sn(n){let e=nn(n);if(!e)return null;let t=`${e}::${n}`,r=tn.get(t);return r||(r=new Ie(e,n),tn.set(t,r)),r}function Er(){let n=Number(process.env.PANDO_CLOJURE_ANALYZER_POOL_SIZE||"");if(Number.isFinite(n)&&n>=1)return Math.max(1,Math.floor(n));let e=Math.max(1,Rr.cpus()?.length||4);return Math.max(3,Math.min(8,Math.ceil(e/2)))}var _r=Er();function De(n,e){L("ClojureIndex",n,e)}function Te(n,e){L("IndexTiming",n,e)}var Oe=class{constructor(e,t,r=_r){this.projectRoot=e;this.purpose=t;this.clients=[];this.idleClients=[];this.queue=[];this.inFlight=new Set;this.drainWaiters=[];this.batchSeq=1;this.closed=!1;let i=Math.max(1,r);for(let s=0;s<i;s+=1){let o=rn(e);if(!o)break;this.clients.push(o),this.idleClients.push(o)}if(!this.clients.length)throw new Error("clojure indexer command unavailable");De("node.pool.init",{projectRoot:e,purpose:t,configuredPoolSize:i,actualClientCount:this.clients.length})}submit(e,t){return this.closed?Promise.reject(new Error("clojure analyzer pool is closed")):new Promise((r,i)=>{this.queue.push({batchId:this.batchSeq++,batchKey:e,files:t,enqueuedAt:Date.now(),resolve:r,reject:i}),this.pump()})}async flush(){for(;this.queue.length||this.inFlight.size;)await new Promise(e=>this.drainWaiters.push(e))}async close(){if(!this.closed){await this.flush(),this.closed=!0;for(let e of this.clients)try{e.close()}catch{}this.clients.length=0,this.idleClients.length=0}}pump(){for(;!this.closed&&this.queue.length&&this.idleClients.length;){let e=this.queue.shift(),t=this.idleClients.shift(),r=this.runJob(t,e).finally(()=>{this.inFlight.delete(r),this.closed||this.idleClients.push(t),this.pump(),this.notifyIfIdle()});this.inFlight.add(r)}this.notifyIfIdle()}async runJob(e,t){let r=t.files.reduce((o,a)=>o+Math.max(0,a.size||0),0),i=Date.now(),s=Math.max(0,i-t.enqueuedAt);De("node.pool-batch.start",{batchId:t.batchId,batchKey:t.batchKey,purpose:this.purpose,fileCount:t.files.length,batchBytes:r,queueWaitMs:s,queuedBatchCount:this.queue.length,inFlightCount:this.inFlight.size});try{let o=await this.parseFiles(e,t.files,t.batchId,r);Te("clojure-pool.job.complete",{projectRoot:this.projectRoot,batchId:t.batchId,batchKey:t.batchKey,purpose:this.purpose,fileCount:t.files.length,batchBytes:r,queueWaitMs:s,durationMs:Date.now()-i}),De("node.pool-batch.complete",{batchId:t.batchId,batchKey:t.batchKey,purpose:this.purpose,fileCount:t.files.length,batchBytes:r,durationMs:Date.now()-i,successCount:Array.from(o.values()).filter(a=>!("error"in a)).length,errorCount:Array.from(o.values()).filter(a=>"error"in a).length}),t.resolve(o)}catch(o){let a=o instanceof Error?o:new Error(String(o));De("node.pool-batch.error",{batchId:t.batchId,batchKey:t.batchKey,fileCount:t.files.length,batchBytes:r,durationMs:Date.now()-i,error:a.message}),t.reject(a)}}async parseFiles(e,t,r,i){let s=Date.now();try{let o=await e.parseBatch(t.map(c=>({file:c.absPath,root:this.projectRoot,lang:c.lang})),{batchId:r,batchBytes:i,purpose:this.purpose});Te("clojure-parse-batch.complete",{projectRoot:this.projectRoot,batchId:r,fileCount:t.length,batchBytes:i,purpose:this.purpose,durationMs:Date.now()-s,split:!1});let a=new Map;for(let c=0;c<t.length;c+=1){let g=t[c],d=o[c]??null;d?a.set(g.fileKey,d):(L("IndexingAudit","clojure analysis returned no result",{projectRoot:this.projectRoot,batchId:r,file:g.absPath}),a.set(g.fileKey,{error:`clojure analysis returned no result for ${g.absPath}`}))}return a}catch(o){if(t.length>1){let g=Date.now(),d=Math.ceil(t.length/2),m=t.slice(0,d),y=t.slice(d),P=await this.parseFiles(e,m,r,m.reduce((w,A)=>w+Math.max(0,A.size||0),0)),C=await this.parseFiles(e,y,r,y.reduce((w,A)=>w+Math.max(0,A.size||0),0));return Te("clojure-parse-batch.split",{projectRoot:this.projectRoot,batchId:r,fileCount:t.length,batchBytes:i,purpose:this.purpose,durationMs:Date.now()-g,leftCount:m.length,rightCount:y.length,error:o instanceof Error?o.message:String(o)}),new Map([...P,...C])}let a=o instanceof Error?o:new Error(String(o));Te("clojure-parse-batch.error",{projectRoot:this.projectRoot,batchId:r,fileCount:t.length,batchBytes:i,purpose:this.purpose,durationMs:Date.now()-s,error:a.message});let c=new Map;for(let g of t)L("IndexingAudit","clojure analysis request failed",{projectRoot:this.projectRoot,batchId:r,file:g.absPath,error:a.message}),c.set(g.fileKey,{error:a.message});return c}}notifyIfIdle(){if(this.queue.length||this.inFlight.size)return;let e=this.drainWaiters.splice(0,this.drainWaiters.length);for(let t of e)try{t()}catch{}}};function Ar(n,e){if(typeof e?.size=="number"&&typeof e?.mtime=="number")return{size:e.size,mtime:e.mtime};try{let t=kr.statSync(n);return{size:typeof e?.size=="number"?e.size:t.size,mtime:typeof e?.mtime=="number"?e.mtime:Math.floor(t.mtimeMs)}}catch{return{size:e?.size,mtime:e?.mtime}}}function Ir(n,e){let t=new Map;for(let r of e.nodes??[]){if(!r.name||r.containerKind||t.has(r.name))continue;let i=`${n}#${r.start}-${r.end}:${G.getAbbrev(r.kind,"clojure")}:${r.name}`;t.set(r.name,i)}return r=>t.get(r)??null}function Kr(n){let e=n?.error;return typeof e=="string"&&e.trim().length>0?e.trim():null}var je=class{constructor(e,t){this.projectRoot=e;this.purpose=t;this.cache=new se;this.pool=new Oe(e,t)}prepare(e){let t=Ar(e.absPath,e.meta),r=this.cache.get(e.absPath,t);return{fileKey:e.relPath,absPath:e.absPath,relPath:e.relPath,meta:t,preDeleted:e.preDeleted,lang:e.lang,cachedParsed:r??void 0}}batchKey(e){return`${this.projectRoot}::clojure::${this.purpose}`}async analyzeBatch(e){let t=new Map,r=e.filter(s=>!s.cachedParsed);for(let s of e)s.cachedParsed&&t.set(s.fileKey,s.cachedParsed);if(!r.length)return t;let i=await this.pool.submit(this.batchKey(r[0]),r.map(s=>({fileKey:s.fileKey,absPath:s.absPath,lang:s.lang,size:s.meta?.size??0})));for(let s of r){let o=i.get(s.fileKey)??{error:`missing clojure analysis result for ${s.relPath}`};"error"in o||this.cache.set(s.absPath,s.meta??{},o),t.set(s.fileKey,o)}return t}buildProcessedFile(e,t,r){let i=Kr(r);return i?(L("IndexingAudit","clojure batch analysis failed",{projectRoot:this.projectRoot,relPath:e.relPath,error:i}),ce("clojure",e.relPath,t.meta)):ue({lang:"clojure",fileRel:e.relPath,content:e.content,meta:t.meta,preDeleted:e.preDeleted,parsed:r,resolveNodeId:Ir(e.relPath,r),exportKind:"cli"})}async flush(){await this.pool.flush()}async close(){await this.pool.close()}};function Dr(){return{maxFilesPerBatch:Math.max(1,Number(process.env.PANDO_CLOJURE_BATCH_MAX_FILES||"24")),maxBatchBytes:Math.max(1,Number(process.env.PANDO_CLOJURE_BATCH_MAX_BYTES||`${4*1024*1024}`)),maxWaitMs:Math.max(1,Number(process.env.PANDO_CLOJURE_BATCH_MAX_WAIT_MS||"10")),maxPendingFiles:Math.max(1,Number(process.env.PANDO_CLOJURE_BATCH_MAX_PENDING_FILES||"512")),maxPendingBytes:Math.max(1,Number(process.env.PANDO_CLOJURE_BATCH_MAX_PENDING_BYTES||`${16*1024*1024}`))}}function Tr(...n){let e=n.map(t=>{if(typeof t=="string")return t;try{return JSON.stringify(t)}catch{return String(t)}}).join(" ");L("ClojureCliAdapter",e)}function on(){return{id:"clojure",extensions:[".clj",".cljc",".cljs"],indexingMode:"batch",createBatchIndexer:(n,e)=>new je(n,e),getBatchSchedulerOptions:Dr,resolveSpan:(n,e,t)=>{let r=sn(n);return r?r.resolve({file:e,root:n,lang:"clojure",nodePath:t}).catch(i=>(Tr(`[${new Date().toISOString()}] [ClojureCliAdapter] resolve error`,{file:e,nodePath:t,error:i?.message||i}),null)):null}}}function eo(n){return n.indexingMode==="worker"&&typeof n.createIndexer=="function"}var lt={ts:qe("ts"),js:qe("js"),python:kt(),c:{...Ye("c"),extensions:[".c",".h",".i",".inc"]},cpp:{...Ye("cpp"),extensions:[".cc",".cpp",".cxx",".c++",".cp",".ccm",".cppm",".cxxm",".ixx",".hpp",".hh",".hxx",".h++",".ii",".inl",".ipp",".tcc",".tpp",".txx"]},csharp:Ot(),dart:Qt(),java:Yt(),clojure:on()},an=new Map;for(let n of Object.values(lt))for(let e of n.extensions)an.set(e,n.id);function Or(){return ft(dt())}function to(n){let e=n.toLowerCase().match(/\.[a-z0-9+]+$/);return e?an.get(e[0])??null:null}function no(n){return lt[n]}function ro(n){let e=n??Or(),t=new Set;for(let[i,s]of Object.entries(e.byLanguage))s.enabled&&t.add(i);let r=new Set;for(let i of Object.values(lt))if(t.has(i.id))for(let s of i.extensions)r.add(s);return r}import jr from"fs";import ln from"path";import{promises as Mr}from"fs";import co from"ignore";function cn(n,e){let t=n.split(/\r?\n/).map(s=>s.trim()).filter(Boolean);if(!t.length)return[];let r=e?`${e}/`:"";return t.map(s=>s.startsWith("\\#")||s.startsWith("\\!")?s.slice(1):s).filter(s=>!s.startsWith("#")).map(s=>{let o=s.startsWith("!"),a=o?s.slice(1):s;if(!a)return s;if((a.endsWith("/")?a.slice(0,-1):a).includes("/")){if(!r&&a.startsWith("/"))return o?`!${a}`:a;let m=a.startsWith("/")?a.slice(1):a,y=r?`${r}${m}`:m;return o?`!${y}`:y}let d=r?`${r}**/${a}`:a;return o?`!${d}`:d})}function uo(n,e){let t=ln.join(n,".gitignore");try{let r=jr.readFileSync(t,"utf8");return cn(r,e)}catch{return[]}}async function po(n,e){let t=ln.join(n,".gitignore");try{let r=await Mr.readFile(t,"utf8");return cn(r,e)}catch{return[]}}function Fr(n,e="Operation cancelled"){let t=typeof n=="string"&&n.trim()?n.trim():n instanceof Error&&n.message.trim()?n.message.trim():e,r=new Error(t);return r.name="AbortError",r.code="ABORT_ERR",r}function mo(n,e){if(n?.aborted)throw Fr(n.reason,e)}export{ce as a,eo as b,Or as c,to as d,no as e,ro as f,mo as g,uo as h,po as i};
|