Location is not always populated in parse exceptions #294
Open
Description
Version
1.1.47
Platform
All
Symptom
The :row
and :col
map entries are not always populated in parsing exceptions data.
Exhibit 1
Case where :row
and :col
are absent for exception data:
(require '[rewrite-clj.parser :as p])
(try
(p/parse-string-all "goodsym badsym/ oksym")
(catch Throwable e
{:msg (ex-message e)
:data (ex-data e)}))
;; => {:msg "Invalid symbol: badsym/.",
;; :data {:type :reader-exception, :ex-kind :reader-error}}
Exhibit 2
Case where position is available in exception data, but notice :line
instead of :row
.
(try
(p/parse-string-all ":goodkw :badkw: :okkw")
(catch Throwable e
{:msg (ex-message e)
:data (ex-data e)}))
;; => {:msg "[line 1, col 16] Invalid keyword: badkw:.",
;; :data
;; {:type :reader-exception, :ex-kind :reader-error, :file nil, :line 1, :col 16}}
Expected behavior
Here's a case that works as expected:
(try
(p/parse-string-all "#:{:a 1}")
(catch Throwable e
{:msg (ex-message e)
:data (ex-data e)}))
;; => {:msg "namespaced map expects a namespace [at line 1, column 3]",
;; :data {:msg "namespaced map expects a namespace", :row 1, :col 3}}
Diagnosis
For default token handling, we delegate to clojure.tools.reader's read-string
in these cases, row/col info is not available.
In the case of the keyword, we internalized and used clojure.tools.reader read-keyword
and it throws using clojure.tools.reader throw mechanisms.
Action
I'll take a peek.
Metadata
Assignees
Labels
No labels
Type
Projects
Status
In Progress