MCPcopy Create free account
hub / github.com/claude-code-best/claude-code / tryParseBraceLikeCat

Function tryParseBraceLikeCat

src/utils/bash/bashParser.ts:2264–2333  ·  view source on GitHub ↗
(P: ParseState)

Source from the content-addressed store, hash-verified

2262}
2263
2264function tryParseBraceLikeCat(P: ParseState): TsNode[] | null {
2265 // {a,b,c} or {} → split into word fragments like tree-sitter does
2266 if (peek(P.L) !== '{') return null
2267 const oStart = P.L.b
2268 advance(P.L)
2269 const oEnd = P.L.b
2270 const inner: TsNode[] = [mk(P, 'word', oStart, oEnd, [])]
2271 while (P.L.i < P.L.len) {
2272 const bc = peek(P.L)
2273 // SECURITY: stop at command terminators so `{foo;rm x` splits correctly.
2274 if (
2275 bc === '}' ||
2276 bc === '\n' ||
2277 bc === ';' ||
2278 bc === '|' ||
2279 bc === '&' ||
2280 bc === ' ' ||
2281 bc === '\t' ||
2282 bc === '<' ||
2283 bc === '>' ||
2284 bc === '(' ||
2285 bc === ')'
2286 ) {
2287 break
2288 }
2289 // `[` and `]` are single-char words: {o[k]} → { o [ k ] }
2290 if (bc === '[' || bc === ']') {
2291 const bStart = P.L.b
2292 advance(P.L)
2293 inner.push(mk(P, 'word', bStart, P.L.b, []))
2294 continue
2295 }
2296 const midStart = P.L.b
2297 while (P.L.i < P.L.len) {
2298 const mc = peek(P.L)
2299 if (
2300 mc === '}' ||
2301 mc === '\n' ||
2302 mc === ';' ||
2303 mc === '|' ||
2304 mc === '&' ||
2305 mc === ' ' ||
2306 mc === '\t' ||
2307 mc === '<' ||
2308 mc === '>' ||
2309 mc === '(' ||
2310 mc === ')' ||
2311 mc === '[' ||
2312 mc === ']'
2313 ) {
2314 break
2315 }
2316 advance(P.L)
2317 }
2318 const midEnd = P.L.b
2319 if (midEnd > midStart) {
2320 const midText = sliceBytes(P, midStart, midEnd)
2321 const midType = /^-?\d+$/.test(midText) ? 'number' : 'word'

Callers 1

parseWordFunction · 0.85

Calls 5

advanceFunction · 0.85
sliceBytesFunction · 0.85
peekFunction · 0.70
mkFunction · 0.70
pushMethod · 0.45

Tested by

no test coverage detected