@wrongstack/tools 0.310.1 → 0.313.1
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/dist/_shell-pick.d.ts +5 -10
- package/dist/audit.js +10 -4055
- package/dist/bash.js +9 -2332
- package/dist/batch-tool-use.js +2 -187
- package/dist/browser/index.js +25 -1339
- package/dist/builtin.js +69 -33985
- package/dist/chunk-2CTB3UK5.js +197 -0
- package/dist/chunk-2ME7ZWDD.js +1272 -0
- package/dist/chunk-2TFQDEPU.js +113 -0
- package/dist/chunk-2ZCJNKFE.js +315 -0
- package/dist/chunk-3PVYQFRQ.js +472 -0
- package/dist/chunk-3QMQBO5Z.js +89 -0
- package/dist/chunk-42AKKX7O.js +385 -0
- package/dist/chunk-42SKEETB.js +113 -0
- package/dist/chunk-4BHUSMNL.js +104 -0
- package/dist/chunk-4I4LWFOO.js +431 -0
- package/dist/chunk-553IQUMO.js +478 -0
- package/dist/chunk-55KF77OK.js +1944 -0
- package/dist/chunk-6HLZK37X.js +359 -0
- package/dist/chunk-6RNIFLG4.js +305 -0
- package/dist/chunk-A6BRWIXN.js +317 -0
- package/dist/chunk-AHHDWNXC.js +200 -0
- package/dist/chunk-B2CIOKWP.js +899 -0
- package/dist/chunk-BTSFTGIL.js +7 -0
- package/dist/chunk-D33S4RQG.js +222 -0
- package/dist/chunk-DIJKHSUO.js +134 -0
- package/dist/chunk-DPL47QGS.js +3515 -0
- package/dist/chunk-EMRGN4KM.js +170 -0
- package/dist/chunk-FGOABE4Z.js +955 -0
- package/dist/chunk-FW65TP4G.js +520 -0
- package/dist/chunk-GOIZNNOA.js +221 -0
- package/dist/chunk-H5MJUAA6.js +295 -0
- package/dist/chunk-H5OHH6F4.js +223 -0
- package/dist/chunk-HC5RM4WY.js +199 -0
- package/dist/chunk-HEQFMLZ7.js +190 -0
- package/dist/chunk-HFXSNKCV.js +196 -0
- package/dist/chunk-HXSBQ2SE.js +1723 -0
- package/dist/chunk-ILESNGNM.js +163 -0
- package/dist/chunk-INF5CGAO.js +137 -0
- package/dist/chunk-IWDFZ6XR.js +337 -0
- package/dist/chunk-IXMNTNW5.js +238 -0
- package/dist/chunk-J4SRJKBW.js +428 -0
- package/dist/chunk-J5SKD6LN.js +235 -0
- package/dist/chunk-JRJJX3L5.js +424 -0
- package/dist/chunk-KXNDHMUB.js +366 -0
- package/dist/chunk-LIJQMYYX.js +59 -0
- package/dist/chunk-MAN26PZ5.js +260 -0
- package/dist/chunk-MKRQMLZA.js +474 -0
- package/dist/chunk-NBDZMMG2.js +169 -0
- package/dist/chunk-NHA6BEIH.js +101 -0
- package/dist/chunk-OA6YJIWL.js +4412 -0
- package/dist/chunk-OZC255IC.js +2830 -0
- package/dist/chunk-PUR6WU2B.js +154 -0
- package/dist/chunk-Q5JPPCZC.js +12 -0
- package/dist/chunk-QBV725YG.js +128 -0
- package/dist/chunk-QHVW4AAM.js +892 -0
- package/dist/chunk-QNJ7AQ4B.js +1000 -0
- package/dist/chunk-RGISBZBD.js +231 -0
- package/dist/chunk-RJZQWEMS.js +84 -0
- package/dist/chunk-RP2ZA47V.js +15 -0
- package/dist/chunk-RXISBFR5.js +315 -0
- package/dist/chunk-S5CCLZL3.js +99 -0
- package/dist/chunk-TVTCSBJF.js +122 -0
- package/dist/chunk-U4D5S3VQ.js +21 -0
- package/dist/chunk-U4VAATKP.js +193 -0
- package/dist/chunk-UKU2ZX4C.js +203 -0
- package/dist/chunk-UNSKG6DC.js +159 -0
- package/dist/chunk-URFKEIHM.js +1091 -0
- package/dist/chunk-UTV7YAW7.js +178 -0
- package/dist/chunk-V43EQ6VR.js +68 -0
- package/dist/chunk-VB3MJGCV.js +610 -0
- package/dist/chunk-WHIIIREL.js +223 -0
- package/dist/chunk-XMIFYKUT.js +1371 -0
- package/dist/chunk-YF2RSV34.js +54 -0
- package/dist/chunk-Z6DAKQ3U.js +1 -0
- package/dist/chunk-ZIGAZFWE.js +522 -0
- package/dist/circuit-breaker.js +3 -191
- package/dist/codebase-index/index.js +84 -13688
- package/dist/codebase-index/parser-worker-script.js +8 -3995
- package/dist/codebase-index/project-server.js +60 -8548
- package/dist/codebase-index/worker.js +20 -8416
- package/dist/design.js +2 -299
- package/dist/diff.js +4 -256
- package/dist/document.js +4 -222
- package/dist/e2e.js +5 -476
- package/dist/edit.js +14 -10200
- package/dist/exec.js +16 -3131
- package/dist/fetch.js +8 -398
- package/dist/format.js +10 -3750
- package/dist/generic-parser-VUXDIAOZ.js +13 -0
- package/dist/git.js +4 -380
- package/dist/glob.js +6 -280
- package/dist/go-parser-6CA77WZ4.js +469 -0
- package/dist/grep.js +7 -604
- package/dist/index.js +318 -35423
- package/dist/install.js +10 -4091
- package/dist/json-parser-7YMDJSBJ.js +213 -0
- package/dist/json.js +4 -665
- package/dist/kanban.js +3 -2096
- package/dist/languages/index.js +23 -4664
- package/dist/legacy-bridge-7UKZT46G.js +18 -0
- package/dist/lint.js +10 -3706
- package/dist/logs.js +4 -287
- package/dist/memory.js +6 -215
- package/dist/mode.js +3 -99
- package/dist/outdated.js +4 -5170
- package/dist/pack.js +65 -33933
- package/dist/parser-dispatch-VPOFDO2U.js +14 -0
- package/dist/patch.js +13 -9935
- package/dist/plan.js +5 -3286
- package/dist/process-registry.js +8 -651
- package/dist/ps-slash.js +12 -1439
- package/dist/py-parser-GPM5VYRG.js +16 -0
- package/dist/read.js +13 -9816
- package/dist/replace.js +15 -10014
- package/dist/rs-parser-WVQ4KYCX.js +81 -0
- package/dist/scaffold.js +4 -253
- package/dist/search.js +5 -585
- package/dist/session-kanban.js +30 -972
- package/dist/skill.js +2 -215
- package/dist/task.js +5 -3410
- package/dist/test.js +10 -3773
- package/dist/todo.js +4 -2891
- package/dist/tool-help.js +3 -123
- package/dist/tool-search.js +3 -79
- package/dist/tool-tier.js +68 -34020
- package/dist/tool-use.js +2 -93
- package/dist/tree-sitter-parser-YCILHGZD.js +17 -0
- package/dist/tree.js +4 -288
- package/dist/ts-parser-YH4ZMWMH.js +232 -0
- package/dist/typecheck.js +10 -3753
- package/dist/win32.js +6 -60
- package/dist/write.js +14 -9882
- package/dist/yaml-parser-GFAOKV53.js +157 -0
- package/package.json +5 -5
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import {
|
|
2
|
+
parseParserOutput,
|
|
3
|
+
withSpawnGate
|
|
4
|
+
} from "./chunk-42SKEETB.js";
|
|
5
|
+
import {
|
|
6
|
+
detectLang
|
|
7
|
+
} from "./chunk-ILESNGNM.js";
|
|
8
|
+
import {
|
|
9
|
+
resolveWin32Command
|
|
10
|
+
} from "./chunk-V43EQ6VR.js";
|
|
11
|
+
|
|
12
|
+
// src/codebase-index/go-parser.ts
|
|
13
|
+
import { spawn } from "node:child_process";
|
|
14
|
+
import * as os from "node:os";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
import * as fs from "node:fs/promises";
|
|
17
|
+
async function parseSymbols(opts) {
|
|
18
|
+
const { file, content, lang } = opts;
|
|
19
|
+
try {
|
|
20
|
+
const parsed = await withSpawnGate(() => syncGoParse(file, content, lang));
|
|
21
|
+
if (parsed.symbols.length > 0) {
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
const fallback = fallbackParse(file, content, lang);
|
|
25
|
+
return parsed.refs?.length ? { ...fallback, refs: parsed.refs } : fallback;
|
|
26
|
+
} catch {
|
|
27
|
+
return fallbackParse(file, content, lang);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function fallbackParse(filePath, content, lang) {
|
|
31
|
+
if (!/^\s*package\s+[A-Za-z_]\w*/m.test(content) || hasUnbalancedDelimiters(content)) {
|
|
32
|
+
return { file: filePath, lang, symbols: [], mtimeMs: Date.now() };
|
|
33
|
+
}
|
|
34
|
+
const symbols = [];
|
|
35
|
+
const packageName = content.match(/^\s*package\s+([A-Za-z_]\w*)/m)?.[1] ?? "";
|
|
36
|
+
const lines = content.split(/\r?\n/);
|
|
37
|
+
for (const [idx, line] of lines.entries()) {
|
|
38
|
+
const trimmed = line.trimStart();
|
|
39
|
+
const col = line.length - trimmed.length + 1;
|
|
40
|
+
const fn = /^func\s+(?:\([^)]*\)\s*)?([A-Za-z_]\w*)\s*\(/.exec(trimmed);
|
|
41
|
+
if (fn?.[1]) {
|
|
42
|
+
addFallbackSymbol(symbols, {
|
|
43
|
+
filePath,
|
|
44
|
+
lang,
|
|
45
|
+
kind: trimmed.startsWith("func (") ? "method" : "function",
|
|
46
|
+
name: fn[1],
|
|
47
|
+
line: idx + 1,
|
|
48
|
+
col,
|
|
49
|
+
signature: trimmed,
|
|
50
|
+
scope: packageName ? `${packageName}.${fn[1]}` : fn[1]
|
|
51
|
+
});
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const typeDecl = /^type\s+([A-Za-z_]\w*)\b/.exec(trimmed);
|
|
55
|
+
if (typeDecl?.[1]) {
|
|
56
|
+
addFallbackSymbol(symbols, {
|
|
57
|
+
filePath,
|
|
58
|
+
lang,
|
|
59
|
+
kind: "type",
|
|
60
|
+
name: typeDecl[1],
|
|
61
|
+
line: idx + 1,
|
|
62
|
+
col,
|
|
63
|
+
signature: trimmed,
|
|
64
|
+
scope: packageName
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const valueDecl = /^(const|var)\s+([A-Za-z_]\w*)\b/.exec(trimmed);
|
|
69
|
+
if (valueDecl?.[1] && valueDecl[2]) {
|
|
70
|
+
addFallbackSymbol(symbols, {
|
|
71
|
+
filePath,
|
|
72
|
+
lang,
|
|
73
|
+
kind: valueDecl[1],
|
|
74
|
+
name: valueDecl[2],
|
|
75
|
+
line: idx + 1,
|
|
76
|
+
col,
|
|
77
|
+
signature: trimmed,
|
|
78
|
+
scope: packageName
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return { file: filePath, lang, symbols, mtimeMs: Date.now() };
|
|
83
|
+
}
|
|
84
|
+
function addFallbackSymbol(symbols, opts) {
|
|
85
|
+
symbols.push({
|
|
86
|
+
id: 0,
|
|
87
|
+
lang: opts.lang,
|
|
88
|
+
kind: opts.kind,
|
|
89
|
+
name: opts.name,
|
|
90
|
+
file: opts.filePath,
|
|
91
|
+
line: opts.line,
|
|
92
|
+
col: opts.col,
|
|
93
|
+
signature: opts.signature,
|
|
94
|
+
docComment: "",
|
|
95
|
+
scope: opts.scope,
|
|
96
|
+
text: `${opts.name} ${opts.signature}`.trim()
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function hasUnbalancedDelimiters(content) {
|
|
100
|
+
const pairs = { "(": ")", "[": "]", "{": "}" };
|
|
101
|
+
const closers = new Set(Object.values(pairs));
|
|
102
|
+
const stack = [];
|
|
103
|
+
for (const ch of content) {
|
|
104
|
+
if (pairs[ch]) {
|
|
105
|
+
stack.push(pairs[ch]);
|
|
106
|
+
} else if (closers.has(ch) && stack.pop() !== ch) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return stack.length > 0;
|
|
111
|
+
}
|
|
112
|
+
var GO_PARSE_SCRIPT = `
|
|
113
|
+
package main
|
|
114
|
+
|
|
115
|
+
import (
|
|
116
|
+
"encoding/json"
|
|
117
|
+
"fmt"
|
|
118
|
+
"go/ast"
|
|
119
|
+
"go/parser"
|
|
120
|
+
"go/token"
|
|
121
|
+
"io"
|
|
122
|
+
"os"
|
|
123
|
+
"strconv"
|
|
124
|
+
"strings"
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
type Sym struct {
|
|
128
|
+
Name string \`json:"name"\`
|
|
129
|
+
Kind string \`json:"kind"\`
|
|
130
|
+
Line int \`json:"line"\`
|
|
131
|
+
Col int \`json:"col"\`
|
|
132
|
+
Signature string \`json:"signature"\`
|
|
133
|
+
Scope string \`json:"scope"\`
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Ref is a cross-reference emitted alongside the symbols, so one \`go run\`
|
|
137
|
+
// yields both. Module is the import path for CallType "import", else empty.
|
|
138
|
+
type Ref struct {
|
|
139
|
+
ToName string \`json:"toName"\`
|
|
140
|
+
CallType string \`json:"callType"\`
|
|
141
|
+
Line int \`json:"line"\`
|
|
142
|
+
Module string \`json:"module"\`
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
type Result struct {
|
|
146
|
+
Symbols []Sym \`json:"symbols"\`
|
|
147
|
+
Refs []Ref \`json:"refs"\`
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
func emptyResult() string {
|
|
151
|
+
return "{\\"symbols\\":[],\\"refs\\":[]}"
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
func main() {
|
|
155
|
+
src, err := io.ReadAll(os.Stdin)
|
|
156
|
+
if err != nil {
|
|
157
|
+
fmt.Print(emptyResult())
|
|
158
|
+
return
|
|
159
|
+
}
|
|
160
|
+
fset := token.NewFileSet()
|
|
161
|
+
node, err := parser.ParseFile(fset, "src.go", src, 0)
|
|
162
|
+
if err != nil {
|
|
163
|
+
fmt.Print(emptyResult())
|
|
164
|
+
return
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
var syms []Sym
|
|
168
|
+
|
|
169
|
+
// Package-level scope
|
|
170
|
+
pkgScope := node.Name.Name
|
|
171
|
+
|
|
172
|
+
// Collect all top-level declarations
|
|
173
|
+
for _, decl := range node.Decls {
|
|
174
|
+
switch d := decl.(type) {
|
|
175
|
+
case *ast.FuncDecl:
|
|
176
|
+
name := d.Name.Name
|
|
177
|
+
kind := "function"
|
|
178
|
+
scope := pkgScope
|
|
179
|
+
if d.Recv != nil && len(d.Recv.List) > 0 {
|
|
180
|
+
scope = pkgScope + "." + recvTypeName(d.Recv.List[0].Type) + "." + name
|
|
181
|
+
kind = "method"
|
|
182
|
+
} else {
|
|
183
|
+
scope = pkgScope + "." + name
|
|
184
|
+
}
|
|
185
|
+
pos := fset.Position(d.Pos())
|
|
186
|
+
sig := formatFuncSig(d)
|
|
187
|
+
syms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: scope})
|
|
188
|
+
|
|
189
|
+
case *ast.GenDecl:
|
|
190
|
+
for _, spec := range d.Specs {
|
|
191
|
+
switch s := spec.(type) {
|
|
192
|
+
case *ast.TypeSpec:
|
|
193
|
+
name := s.Name.Name
|
|
194
|
+
pos := fset.Position(s.Pos())
|
|
195
|
+
sig := "type " + name
|
|
196
|
+
if s.TypeParams != nil {
|
|
197
|
+
sig += formatTypeParams(s.TypeParams)
|
|
198
|
+
}
|
|
199
|
+
if st, ok := s.Type.(*ast.StructType); ok {
|
|
200
|
+
sig += " = struct { " + formatFields(st.Fields.List) + " }"
|
|
201
|
+
} else if it, ok := s.Type.(*ast.InterfaceType); ok {
|
|
202
|
+
sig += " = interface { " + formatMethods(it.Methods.List) + " }"
|
|
203
|
+
} else {
|
|
204
|
+
sig += " = " + formatType(s.Type)
|
|
205
|
+
}
|
|
206
|
+
syms = append(syms, Sym{Name: name, Kind: "type", Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})
|
|
207
|
+
|
|
208
|
+
case *ast.ValueSpec:
|
|
209
|
+
for _, n := range s.Names {
|
|
210
|
+
name := n.Name
|
|
211
|
+
pos := fset.Position(n.Pos())
|
|
212
|
+
kind := "var"
|
|
213
|
+
if d.Tok == token.CONST {
|
|
214
|
+
kind = "const"
|
|
215
|
+
}
|
|
216
|
+
sig := kind + " " + name
|
|
217
|
+
if s.Type != nil {
|
|
218
|
+
sig += " " + formatType(s.Type)
|
|
219
|
+
}
|
|
220
|
+
syms = append(syms, Sym{Name: name, Kind: kind, Line: pos.Line, Col: pos.Column, Signature: sig, Scope: pkgScope})
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
refs := []Ref{}
|
|
228
|
+
ast.Inspect(node, func(n ast.Node) bool {
|
|
229
|
+
switch expr := n.(type) {
|
|
230
|
+
case *ast.CallExpr:
|
|
231
|
+
line := fset.Position(expr.Pos()).Line
|
|
232
|
+
switch fun := expr.Fun.(type) {
|
|
233
|
+
case *ast.Ident:
|
|
234
|
+
refs = append(refs, Ref{ToName: fun.Name, CallType: "call", Line: line})
|
|
235
|
+
case *ast.SelectorExpr:
|
|
236
|
+
// Record the selected name (\`Join\` of \`filepath.Join\`): it is the
|
|
237
|
+
// declared symbol name, so it resolves the same way the TypeScript
|
|
238
|
+
// and Python extractors' call refs do.
|
|
239
|
+
refs = append(refs, Ref{ToName: fun.Sel.Name, CallType: "call", Line: line})
|
|
240
|
+
}
|
|
241
|
+
case *ast.ImportSpec:
|
|
242
|
+
if expr.Path != nil {
|
|
243
|
+
if importPath, uerr := strconv.Unquote(expr.Path.Value); uerr == nil {
|
|
244
|
+
line := fset.Position(expr.Pos()).Line
|
|
245
|
+
// A Go import names a package, not a symbol; the package's
|
|
246
|
+
// last path segment is the name it is referenced by.
|
|
247
|
+
name := importPath
|
|
248
|
+
if idx := strings.LastIndex(importPath, "/"); idx >= 0 {
|
|
249
|
+
name = importPath[idx+1:]
|
|
250
|
+
}
|
|
251
|
+
refs = append(refs, Ref{ToName: name, CallType: "import", Line: line, Module: importPath})
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return true
|
|
256
|
+
})
|
|
257
|
+
|
|
258
|
+
if syms == nil {
|
|
259
|
+
syms = []Sym{}
|
|
260
|
+
}
|
|
261
|
+
data, err := json.Marshal(Result{Symbols: syms, Refs: refs})
|
|
262
|
+
if err != nil {
|
|
263
|
+
fmt.Print(emptyResult())
|
|
264
|
+
return
|
|
265
|
+
}
|
|
266
|
+
fmt.Print(string(data))
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
func recvTypeName(t ast.Expr) string {
|
|
270
|
+
switch v := t.(type) {
|
|
271
|
+
case *ast.Ident:
|
|
272
|
+
return v.Name
|
|
273
|
+
case *ast.StarExpr:
|
|
274
|
+
return recvTypeName(v.X)
|
|
275
|
+
default:
|
|
276
|
+
return "?"
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
func formatFuncSig(d *ast.FuncDecl) string {
|
|
281
|
+
scope := ""
|
|
282
|
+
if d.Recv != nil && len(d.Recv.List) > 0 {
|
|
283
|
+
scope = "(" + formatFieldList(d.Recv.List) + ") "
|
|
284
|
+
}
|
|
285
|
+
scope += formatFuncType(d.Type)
|
|
286
|
+
return "func " + scope
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
func formatFuncType(f *ast.FuncType) string {
|
|
290
|
+
params := formatFieldList(f.Params.List)
|
|
291
|
+
results := ""
|
|
292
|
+
if f.Results != nil {
|
|
293
|
+
results = " -> " + formatFieldList(f.Results.List)
|
|
294
|
+
}
|
|
295
|
+
return params + results
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
func formatFieldList(fields []*ast.Field) string {
|
|
299
|
+
if len(fields) == 0 {
|
|
300
|
+
return "()"
|
|
301
|
+
}
|
|
302
|
+
names := make([]string, 0, len(fields))
|
|
303
|
+
for _, f := range fields {
|
|
304
|
+
name := ""
|
|
305
|
+
if len(f.Names) > 0 {
|
|
306
|
+
name = f.Names[0].Name
|
|
307
|
+
}
|
|
308
|
+
t := formatType(f.Type)
|
|
309
|
+
if name != "" {
|
|
310
|
+
names = append(names, name+" "+t)
|
|
311
|
+
} else {
|
|
312
|
+
names = append(names, t)
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return "(" + strings.Join(names, ", ") + ")"
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
func formatFields(fields []*ast.Field) string {
|
|
319
|
+
lines := make([]string, 0)
|
|
320
|
+
for _, f := range fields {
|
|
321
|
+
name := ""
|
|
322
|
+
if len(f.Names) > 0 {
|
|
323
|
+
name = f.Names[0].Name
|
|
324
|
+
}
|
|
325
|
+
t := formatType(f.Type)
|
|
326
|
+
if name != "" {
|
|
327
|
+
lines = append(lines, name+" "+t)
|
|
328
|
+
} else {
|
|
329
|
+
lines = append(lines, t)
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return strings.Join(lines, "; ")
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
func formatMethods(fields []*ast.Field) string {
|
|
336
|
+
return formatFields(fields)
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
func formatTypeParams(tp *ast.FieldList) string {
|
|
340
|
+
if tp == nil || len(tp.List) == 0 {
|
|
341
|
+
return ""
|
|
342
|
+
}
|
|
343
|
+
params := make([]string, len(tp.List))
|
|
344
|
+
for i, p := range tp.List {
|
|
345
|
+
if len(p.Names) > 0 {
|
|
346
|
+
params[i] = p.Names[0].Name
|
|
347
|
+
} else {
|
|
348
|
+
params[i] = "T"
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return "[" + strings.Join(params, ", ") + "]"
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
func formatType(t ast.Expr) string {
|
|
355
|
+
if t == nil {
|
|
356
|
+
return "?"
|
|
357
|
+
}
|
|
358
|
+
switch v := t.(type) {
|
|
359
|
+
case *ast.Ident:
|
|
360
|
+
return v.Name
|
|
361
|
+
case *ast.SelectorExpr:
|
|
362
|
+
return formatType(v.X) + "." + v.Sel.Name
|
|
363
|
+
case *ast.StarExpr:
|
|
364
|
+
return "*" + formatType(v.X)
|
|
365
|
+
case *ast.ArrayType:
|
|
366
|
+
if v.Len == nil {
|
|
367
|
+
return "[]" + formatType(v.Elt)
|
|
368
|
+
}
|
|
369
|
+
return "[...]" + formatType(v.Elt)
|
|
370
|
+
case *ast.MapType:
|
|
371
|
+
return "map[" + formatType(v.Key) + "]" + formatType(v.Value)
|
|
372
|
+
case *ast.InterfaceType:
|
|
373
|
+
return "interface{}"
|
|
374
|
+
case *ast.StructType:
|
|
375
|
+
return "struct{}"
|
|
376
|
+
case *ast.FuncType:
|
|
377
|
+
return formatFuncType(v)
|
|
378
|
+
case *ast.ChanType:
|
|
379
|
+
return "chan " + formatType(v.Value)
|
|
380
|
+
case *ast.BasicLit:
|
|
381
|
+
return v.Value
|
|
382
|
+
case *ast.IndexExpr:
|
|
383
|
+
// Generic instantiation with one type arg, e.g. Logger[int].
|
|
384
|
+
return formatType(v.X) + "[" + formatType(v.Index) + "]"
|
|
385
|
+
case *ast.IndexListExpr:
|
|
386
|
+
// Generic instantiation with multiple type args, e.g. Map[K, V].
|
|
387
|
+
args := make([]string, len(v.Indices))
|
|
388
|
+
for i, idx := range v.Indices {
|
|
389
|
+
args[i] = formatType(idx)
|
|
390
|
+
}
|
|
391
|
+
return formatType(v.X) + "[" + strings.Join(args, ", ") + "]"
|
|
392
|
+
default:
|
|
393
|
+
return "?"
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
`;
|
|
397
|
+
var _cachedGoScriptPath = null;
|
|
398
|
+
async function syncGoParse(filePath, content, lang) {
|
|
399
|
+
try {
|
|
400
|
+
let scriptPath = _cachedGoScriptPath;
|
|
401
|
+
if (!scriptPath) {
|
|
402
|
+
const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "ws-go-parse-"));
|
|
403
|
+
scriptPath = path.join(tmpDir, "parse.go");
|
|
404
|
+
await fs.writeFile(scriptPath, GO_PARSE_SCRIPT, "utf8");
|
|
405
|
+
_cachedGoScriptPath = scriptPath;
|
|
406
|
+
}
|
|
407
|
+
const goBinary = resolveWin32Command("go");
|
|
408
|
+
const goResult = await new Promise(
|
|
409
|
+
(resolve, reject) => {
|
|
410
|
+
let settled = false;
|
|
411
|
+
const proc = spawn(goBinary, ["run", scriptPath], {
|
|
412
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
413
|
+
windowsHide: true
|
|
414
|
+
});
|
|
415
|
+
proc.on("error", (err) => {
|
|
416
|
+
if (settled) return;
|
|
417
|
+
settled = true;
|
|
418
|
+
reject(err);
|
|
419
|
+
});
|
|
420
|
+
let stdout2 = "";
|
|
421
|
+
proc.stdout?.on("data", (chunk) => {
|
|
422
|
+
stdout2 += chunk.toString();
|
|
423
|
+
});
|
|
424
|
+
proc.stderr?.resume();
|
|
425
|
+
proc.stdin?.write(content);
|
|
426
|
+
proc.stdin?.end();
|
|
427
|
+
const timer = setTimeout(() => {
|
|
428
|
+
if (settled) return;
|
|
429
|
+
settled = true;
|
|
430
|
+
proc.kill("SIGKILL");
|
|
431
|
+
reject(new Error("timeout"));
|
|
432
|
+
}, 15e3);
|
|
433
|
+
timer.unref?.();
|
|
434
|
+
proc.on("close", (code2) => {
|
|
435
|
+
if (settled) return;
|
|
436
|
+
settled = true;
|
|
437
|
+
clearTimeout(timer);
|
|
438
|
+
resolve({ code: code2, stdout: stdout2 });
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
);
|
|
442
|
+
const { code, stdout } = goResult;
|
|
443
|
+
if (code !== 0 || !stdout.trim()) {
|
|
444
|
+
return { file: filePath, lang, symbols: [], mtimeMs: Date.now() };
|
|
445
|
+
}
|
|
446
|
+
const { symbols: rawSymbols, refs } = parseParserOutput(stdout, lang);
|
|
447
|
+
const symbols = rawSymbols.map((s) => ({
|
|
448
|
+
id: 0,
|
|
449
|
+
lang,
|
|
450
|
+
kind: s.kind,
|
|
451
|
+
name: s.name,
|
|
452
|
+
file: filePath,
|
|
453
|
+
line: s.line,
|
|
454
|
+
col: s.col,
|
|
455
|
+
signature: s.signature ?? "",
|
|
456
|
+
docComment: "",
|
|
457
|
+
scope: s.scope ?? "",
|
|
458
|
+
text: `${s.name} ${s.signature ?? ""}`.trim()
|
|
459
|
+
}));
|
|
460
|
+
return { file: filePath, lang, symbols, refs, mtimeMs: Date.now() };
|
|
461
|
+
} catch {
|
|
462
|
+
return { file: filePath, lang, symbols: [], mtimeMs: Date.now() };
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
export {
|
|
466
|
+
detectLang,
|
|
467
|
+
parseSymbols
|
|
468
|
+
};
|
|
469
|
+
//# sourceMappingURL=go-parser-6CA77WZ4.js.map
|