|
189 | 189 | (defn parse-first-matching-condition [ctx #?(:cljs ^not-native reader :default reader)]
|
190 | 190 | (let [features (:features ctx)]
|
191 | 191 | (loop [match non-match]
|
192 |
| - (skip-whitespace ctx reader) |
193 |
| - (let [end? (= \) (r/peek-char reader))] |
194 |
| - (if end? |
195 |
| - (do (r/read-char reader) ;; ignore closing \) |
196 |
| - match) |
197 |
| - (let [k (parse-next ctx reader) |
198 |
| - match? (and (non-match? match) |
| 192 | + (let [k (parse-next ctx reader)] |
| 193 | + (if (identical? k ::expected-delimiter) |
| 194 | + match |
| 195 | + (let [next-is-match? (and (non-match? match) |
199 | 196 | (or (contains? features k)
|
200 | 197 | (kw-identical? k :default)))]
|
201 |
| - (if match? (recur (parse-next ctx reader)) |
202 |
| - (do |
203 |
| - (parse-next (assoc ctx ::suppress true) |
204 |
| - reader) |
205 |
| - (recur match))))))))) |
| 198 | + (if next-is-match? |
| 199 | + (let [match (parse-next ctx reader) |
| 200 | + ctx (assoc ctx ::suppress true)] |
| 201 | + (loop [] |
| 202 | + (let [next-val (parse-next ctx reader)] |
| 203 | + (when-not (identical? ::expected-delimiter |
| 204 | + next-val) |
| 205 | + (if (identical? ::eof next-val) |
| 206 | + (let [delimiter (::expected-delimiter ctx) |
| 207 | + {:keys [:row :col :char]} (::opened-delimiter ctx)] |
| 208 | + (throw-reader ctx |
| 209 | + reader |
| 210 | + (str "EOF while reading, expected " delimiter " to match " char " at [" row "," col "]") |
| 211 | + {:edamame/expected-delimiter (str delimiter) |
| 212 | + :edamame/opened-delimiter (str char)})) |
| 213 | + (recur))))) |
| 214 | + match) |
| 215 | + (do |
| 216 | + ;; skip over next val and try next key |
| 217 | + (parse-next (assoc ctx ::suppress true) |
| 218 | + reader) |
| 219 | + (recur match))))))))) |
206 | 220 |
|
207 | 221 | (defn parse-reader-conditional [ctx #?(:cljs ^not-native reader :default reader)]
|
208 | 222 | (skip-whitespace ctx reader)
|
|
216 | 230 | (parse-next ctx reader)
|
217 | 231 | assoc :edamame/read-cond-splicing splice?))
|
218 | 232 | :else
|
219 |
| - (do |
220 |
| - (r/read-char reader) ;; skip \( |
221 |
| - (let [match (parse-first-matching-condition ctx reader)] |
222 |
| - (cond (non-match? match) reader |
223 |
| - splice? (vary-meta match |
224 |
| - #(assoc % ::cond-splice true)) |
225 |
| - :else match)))))) |
| 233 | + (let [row (r/get-line-number reader) |
| 234 | + col (r/get-column-number reader) |
| 235 | + opened (r/read-char reader) |
| 236 | + ctx (assoc ctx |
| 237 | + ::expected-delimiter \) |
| 238 | + ::opened-delimiter {:char opened :row row :col col}) |
| 239 | + match (parse-first-matching-condition ctx reader)] |
| 240 | + (cond (non-match? match) reader |
| 241 | + splice? (vary-meta match |
| 242 | + #(assoc % ::cond-splice true)) |
| 243 | + :else match))))) |
226 | 244 |
|
227 | 245 | (defn get-auto-resolve
|
228 | 246 | ([ctx reader next-val]
|
|
0 commit comments