Reader records source line/column on list forms
The reader stamps 1-based :line/:column metadata on every list form (plus :file when load-jolt-file is reading a file), and jolt.host/form-position reads it back so the analyzer's :pos scaffold finally gets real data. A left-to-right cursor counts newlines over the delta between successive forms, so it stays O(n). Vector/map/set literals are untouched (their metadata is a runtime value the analyzer would have to wrap in with-meta); empty () can't carry meta. ^meta now merges onto the position keys instead of clobbering them. Re-mint is byte-identical (the backend doesn't emit :pos), so this is a pure scaffold for the error-location work that follows.
This commit is contained in:
parent
bdf436e242
commit
824fb347a3
4 changed files with 85 additions and 16 deletions
|
|
@ -119,8 +119,22 @@
|
|||
(define (hc-inst-source x) (jolt-get x hc-kw-form))
|
||||
(define (hc-uuid-source x) (jolt-get x hc-kw-form))
|
||||
|
||||
;; The Chez reader does not record source offsets yet.
|
||||
(define (hc-form-position x) jolt-nil)
|
||||
;; Source position for a list form: the reader stamps :line/:column (+ :file when
|
||||
;; compiling a file) into the form's metadata. Return a clean {:line :column
|
||||
;; :file?} map, or nil for a synthetic/macro-built form that carries none.
|
||||
(define hc-kw-line (keyword #f "line"))
|
||||
(define hc-kw-column (keyword #f "column"))
|
||||
(define hc-kw-file (keyword #f "file"))
|
||||
(define (hc-form-position x)
|
||||
(let ((m (jolt-meta x)))
|
||||
(if (and (pmap? m) (not (jolt-nil? (jolt-get m hc-kw-line))))
|
||||
(let ((line (jolt-get m hc-kw-line))
|
||||
(col (jolt-get m hc-kw-column))
|
||||
(file (jolt-get m hc-kw-file)))
|
||||
(if (jolt-nil? file)
|
||||
(jolt-hash-map hc-kw-line line hc-kw-column col)
|
||||
(jolt-hash-map hc-kw-line line hc-kw-column col hc-kw-file file)))
|
||||
jolt-nil)))
|
||||
|
||||
;; --- special forms ----------------------------------------------------------
|
||||
;; Mirrors host_iface special-names + interop-head? — forms the analyzer marks
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue