basilisp-lang / basilisp

A Clojure-compatible(-ish) Lisp dialect targeting Python 3.8+
https://basilisp.readthedocs.io
Eclipse Public License 1.0
198 stars 4 forks source link

Exceptions raised from within the reader in certain circumstances do not have line/col information #854

Closed chrisrink10 closed 5 months ago

chrisrink10 commented 5 months ago

Exceptions raised reading reader conditionals do not always have access to the ReaderContext object, which means they cannot annotate exceptions with diagnostic line and column information.

#?(:blah)

produces

Traceback (most recent call last):
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 429, in _compile_feature_vec
    for k, v in partition(
        ^^^^
ValueError: not enough values to unpack (expected 2, got 1)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/Users/christopher/Projects/basilisp/src/basilisp/prompt.py", line 94, in _
    list(
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 1680, in read_str
    yield from read(
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 1651, in read
    expr = _read_next(ctx)
           ^^^^^^^^^^^^^^^
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 1573, in _read_next
    return _read_reader_macro(ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 1487, in _read_reader_macro
    return _read_reader_conditional(ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 1413, in _read_reader_conditional
    reader_cond = _read_reader_conditional_preserving(ctx)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 1397, in _read_reader_conditional_preserving
    return ReaderConditional(feature_list, is_splicing=is_splicing)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 420, in __init__
    self._feature_vec = self._compile_feature_vec(form)
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/christopher/Projects/basilisp/src/basilisp/lang/reader.py", line 443, in _compile_feature_vec
    raise SyntaxError(
basilisp.lang.reader.SyntaxError: Reader conditionals must contain an even number of forms