Summary
Coverage analysis reveals 87% coverage on src/parable.py (917 of 7285 lines never hit). Most uncovered code is rare edge cases or defensive fallbacks, but some is provably unreachable.
Command
uv run --with coverage coverage run tests/bin/run-tests.py
uv run --with coverage coverage report --show-missing src/parable.py
Truly Dead Code
| Lines |
Code |
Why Impossible |
| 398-400 |
ContextStack.get_current() |
Method defined but never called |
| 402-404 |
ContextStack.push() |
Method defined but never called |
| 406-410 |
ContextStack.pop() |
Method defined but never called |
| 7858-7859 |
self.pos = start; return None, "" in _parse_arithmetic_expansion |
Loop exits when depth==0 OR at_end(). If depth!=0, must be at_end() → raises MatchedPairError. The return path requires depth!=0 AND NOT at_end(), which is impossible. |
Likely Dead (defensive code for impossible internal states)
| Lines |
Code |
Notes |
| 962-966 |
Param expansion fallback |
Called after seeing ${ — should always succeed or raise |
| 1005-1009 |
Command sub fallback |
Called after seeing $( |
| 1021-1025 |
Deprecated arith fallback |
Called after seeing $[ |
| 1045-1050 |
Process sub fallback |
Called after seeing <( or >( |
Just Untested (rare but valid bash)
- 756-783: POSIX
[=x=] equivalence classes and [.x.] collating symbols
- 3406-3440: Bash 5.1+
${ cmd; } brace command substitution
- 7502-7622: Heredocs inside backtick command substitutions
- Arithmetic
to_sexp() methods: Nodes created but serialization not tested
Recommendation
- Delete
ContextStack.get_current(), push(), pop() — unused
- Delete lines 7858-7859 — unreachable
- Consider removing defensive fallbacks (962-966, 1005-1009, etc.) or converting to assertions
- Add tests for
${ cmd; } syntax and POSIX bracket expressions if supporting them
Summary
Coverage analysis reveals 87% coverage on
src/parable.py(917 of 7285 lines never hit). Most uncovered code is rare edge cases or defensive fallbacks, but some is provably unreachable.Command
Truly Dead Code
ContextStack.get_current()ContextStack.push()ContextStack.pop()self.pos = start; return None, ""in_parse_arithmetic_expansiondepth==0ORat_end(). Ifdepth!=0, must beat_end()→ raisesMatchedPairError. The return path requiresdepth!=0 AND NOT at_end(), which is impossible.Likely Dead (defensive code for impossible internal states)
${— should always succeed or raise$($[<(or>(Just Untested (rare but valid bash)
[=x=]equivalence classes and[.x.]collating symbols${ cmd; }brace command substitutionto_sexp()methods: Nodes created but serialization not testedRecommendation
ContextStack.get_current(),push(),pop()— unused${ cmd; }syntax and POSIX bracket expressions if supporting them