cloudwego / cloudwego/abcoder

`parse python` panics in `LSPClient.Locate` (`slice bounds out of range`) when following imports into `.venv`

Aperta
#186 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub
Lingua principale
Go
Stelle
390
Fork
57
Merge medio
2g 21h
PR unite (30g)
1

Descrizione

# `parse python` panics in `LSPClient.Locate` (`slice bounds out of range [13:6]`) when following imports into `.venv`

**Repo:** cloudwego/abcoder
**Labels:** bug, language/python, crash

## Summary

When parsing a Python project whose source imports modules from a `.venv/` containing Python 3.12 syntax that the bundled `jedi 0.19.1` / `parso 0.8.4` cannot fully parse, abcoder hard-crashes:

```
panic: runtime error: slice bounds out of range [13:6]

goroutine 1 [running]:
github.com/cloudwego/abcoder/lang/lsp.(*LSPClient).Locate(...)
/tmp/abcoder-build/lang/lsp/lsp_methods.go:316 +0x430
github.com/cloudwego/abcoder/lang/collect.(*Collector).getSymbolByLocation(...)
/tmp/abcoder-build/lang/collect/collect.go:2114 +0xe58
github.com/cloudwego/abcoder/lang/collect.(*Collector).getSymbolByTokenWithLimit(...)
github.com/cloudwego/abcoder/lang/collect.(*Collector).getDepsWithLimit(...)
github.com/cloudwego/abcoder/lang/collect.(*Collector).processSymbol(...)
/tmp/abcoder-build/lang/collect/collect.go:2245 +0x328
github.com/cloudwego/abcoder/lang/collect.(*Collector).Collect(...)
/tmp/abcoder-build/lang/collect/collect.go:206 +0x3c0
```

The panic is preceded by hundreds of warnings like:

```
[ERROR] collect.go:2306: get type symbol for token {file:///.../.venv/lib/python3.12/site-packages/redis/_parsers/socket.py:115:24-115:32 function [] readline} failed: definition of token ... not found
```

…and pylsp stderr noise from the `pylsp_semantic_tokens` hook:

```
WARNING - pylsp.config.config - Failed to load hook pylsp_semantic_tokens:
'Newline' object has no attribute 'children'
AttributeError in jedi/inference/syntax_tree.py:460 (infer_or_test)
```

`jedi`/`parso` returns a malformed range (start `13` > end `6`), and `lang/lsp/lsp_methods.go:316` slices a string with that range without bounds-checking → panic.

## Reproduction

```bash
# Project: any Python 3.12 project with a populated .venv that contains
# files using PEP 701 f-strings or other 3.12-only syntax (e.g. attrs, redis).
abcoder parse python . -o /tmp/ast.json
# …jedi follows imports into .venv/...redis/_parsers/socket.py
# panic: runtime error: slice bounds out of range [13:6]
```

## Expected

- `LSPClient.Locate` should validate the `Range` it receives (`Start <= End`, both within document bounds) and return an error instead of panicking.
- Higher up, `Collector.getSymbolByLocation` should swallow such errors as a "skip this token" rather than propagating a panic.
- Optionally: `parse python` should default to excluding common virtualenv directories (`.venv`, `venv`, `env`) since they're never the parse target — they're only ever followed transitively, which is what triggers the bad ranges.

## Workaround

Pass `--exclude .venv` (and any other vendored Python trees):

```bash
abcoder parse python . -o /tmp/ast.json --exclude .venv
```

## Root cause notes (for triage)

The malformed range originates from jedi's syntax-tree inference on certain 3.12 constructs that parso 0.8.4 represents incorrectly (e.g. `Newline` nodes appearing where parso normally yields `simple_stmt` children). Bumping `parso` to ≥0.8.5 in the bundled pylsp fork's deps may eliminate the source — but the Go side should still bounds-check defensively.

## Environment

- abcoder `v0.0.0-20260427034146-9d8ecc5873be+dirty`
- macOS 25.3.0 (arm64)
- jedi 0.19.1, parso 0.8.4 (in miniconda Python 3.10)
- Project: Python 3.12 with `.venv` containing `attrs`, `redis`, `pydantic`, etc.

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Inizia con lang/lsp/lsp_methods.go:316 e lang/collect/collect.go:2114, quindi riproduci il problema con `abcoder parse python . -o /tmp/ast.json` in un progetto Python 3.12 contenente un .venv popolato. Verifica che gli intervalli malformati non causino più un panic e che il token interessato venga ignorato o segnalato come errore; confronta il comportamento con `--exclude .venv`.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
go, python
Ambito
devtools, tooling
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
55/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.