Repository navigation
Invalid ranges returned from tree_house::injections_query::intersect_ranges #35
Description
So, I started using Helix earlier this week, and have been enjoying its performance, the editing model, and the fact that all of it is written in Rust. So much so that when I hit this problem, I took a bit of time to get the experimental debugging support working and started debugging Helix with itself.
I have a small Rust codebase that I wrote over a decade ago, and then mostly was unable to find time to develop since then. Nowadays, I worry that anyone who reads it might form the impression that this is the kind of code I'd write in Rust today, given half a chance, so I was going to spend a bit of time using Helix to make some improvements to it.
So I opened src/lib.rs, and noticed that there was no syntax highlighting. I was worried that maybe this was something I was doing wrong, so I started digging. Here's short summary of my investigation, and where the problem is coming from:
- In Helix's log, an event like this is emitted on each attempt to load the file:
helix_view::document [WARN] Error building syntax for 'src/lib.rs': invalid ranges. - With some trial and error, I found I could re-trigger the same log output efficiently by running
:config-reload - I then tried to find a more minimal reproducer. After removing enough code from the file, it would parse successfully, but by the time this happened, there were less than 200 lines left, and I narrowed it down to a comment, which felt like it wasn't useful to investigate further, for now, because there was nothing obviously noteworthy about the particular syntax element that was causing the problem to manifest.
- The same revision of the same tree-sitter parser works fine in Neovim, and the parser doesn't get updated very often, so I felt it was safe to assume that's not the problem.
- I was using the tip of Helix's main branch, so I tried building and running the last release tag, and the problem was still happening, so I could rule out any recent changes.
- I'm sure I could have gone back further and found a revision that didn't have this problem, but I'd noticed the tree-sitter related changes in the changelog and concluded that was probably not a useful data point. Reverting to the old implementation was clearly not going to be a useful workaround, either for me, or the upstream project.
- I started looking around in the source tree for where this error comes from, and saw that it's raised in
highlighter/src/parse.rs. - This is the point where I set up debugging. I could also have cloned tree-house, redirected the Helix build to use the local clone, and done some print-based debugging, but I was curious about how usable Helix's debugging feature currently is, having lived without in-editor debugging for a long time.
- In the debugger, I could see that there were three ranges listed, and the second one had a
start_bytethat was higher thanend_byte. - I looked around at where these ranges are constructed, reviewed all references, and saw that there's only one place that could be related, in
highlighter/src/injections_query.rs. - I spent a bit more time in the debugger, and found that this line, and the associated code path, is pushing an invalid range in.
- I couldn't get conditional breakpoints working while debugging, so I can't say that's the only source of invalid ranges from that function. It would be more efficient to use debug assertions to catch those as part of a fix for this, so it didn't make sense to keep using a debugger to investigate.
If anyone is planning to work on a fix, please comment here first, to prevent duplication of effort. Otherwise I'm probably going to work on it later today.
Activity
Merge pull request #36 from sruggier/pr/fix-parse-error
the-mikedavis commentedon May 30, 2026
Fixed by #36