Skip to content
This repository has been archived by the owner on Apr 3, 2022. It is now read-only.

Commit

Permalink
reading objects uses source logging reader, improved source / line / col
Browse files Browse the repository at this point in the history
meta data for interns and meta objects
  • Loading branch information
rksm committed Mar 21, 2015
1 parent e321244 commit b41ea3d
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 17 deletions.
25 changes: 14 additions & 11 deletions src/rksm/cloxp_source_reader/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
(if (or (> start-line end-line) (and (= start-line end-line) (> start-column end-column)))
(line-column-access-for-string e s)
(let [start (nth lines (dec start-line))
start (.substring start (dec start-column) (count start))
start (.substring start (dec start-column))
end (if (= start-line end-line)
start
(nth lines (min (dec (count lines)) (dec end-line))))
Expand Down Expand Up @@ -65,7 +65,8 @@
:column} map. Note: this is more that the typical reader gives us."
[source & [{:keys [cljx?] :or {cljx? true} :as opts}]]
; FIXME this is hacked...
(let [tfm-source (if cljx? (cljx.core/transform source cljx.rules/clj-rules) source)
(let [source (if-not (.endsWith source "\n") (str source "\n") source)
tfm-source (if cljx? (cljx.core/transform source cljx.rules/clj-rules) source)
get-src-fn (line-column-access source)
rdr (trt/indexing-push-back-reader
(trt/source-logging-push-back-reader
Expand All @@ -74,15 +75,17 @@
(let [start-line (trt/get-line-number rdr)
start-column (trt/get-column-number rdr)]
(if-let [o (tr/read rdr false nil)]
(let [raw-str (purge-string! rdr)
(let [; get the string from the reader:
raw-str (purge-string! rdr)
lines (s/split-lines raw-str)
; trim surrounding whitespace and offset line / column accordingly
no-ws-lines (take-while #(re-find #"^\s*(;.*)?$" %) lines)
src-lines (drop (count no-ws-lines) lines)
first-line-ws-match (re-matches #"^(\s*)(.*)" (first src-lines))
src-lines (assoc (vec src-lines) 0 (nth first-line-ws-match 2))
[_ leading-ws first-line-content] (re-matches #"^(\s*)(.*)" (first src-lines))
src-lines (assoc (vec src-lines) 0 first-line-content)
src (s/join "\n" src-lines)
line (+ (count no-ws-lines) start-line)
column (+ start-column (count (second first-line-ws-match)))
line (+ start-line (count no-ws-lines))
column (+ start-column (count leading-ws))
meta (meta o)
def? (def? o)
name (if def? (name-of-def o))]
Expand Down Expand Up @@ -124,11 +127,11 @@
(->> objs
(filter (fn [{c2 :column, l2 :line}] (and (= c c2) (= l l2))))
first))]
; (assoc meta-entity :source source)
(assoc meta-entity :source
; (assoc meta-entity :source source)
(assoc meta-entity :source
(get-src-fn
{:line line :column column}
{:line end-line :column end-column}))))
{:line line :column column}
{:line end-line :column end-column}))))
interns))))

(defn add-source-to-interns
Expand Down
8 changes: 4 additions & 4 deletions test/rksm/cloxp_source_reader/cljx_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@
sources (map :source meta-data)
expected '("(defn x-to-string\n [x]\n (let [buf #+clj (StringBuilder.) #+cljs (gstring/StringBuffer.)]\n (.append buf \"x is: \")\n (.append buf (str x))))\n"
"(def x 23)\n"
"(def y #+clj 24 #+cljx 25)")]
"(def y #+clj 24 #+cljx 25)\n")]
(is (= expected sources))))

(deftest read-objs-cljx
(let [result (src-rdr/read-objs "(def y #+clj 24 #+cljx 25)")
expected '({:name y,
:form (def y 24),
:source "(def y #+clj 24 #+cljx 25)",
:source "(def y #+clj 24 #+cljx 25)\n",
:line 1,
:column 1,
:end-line 1,
:end-column 27})]
:end-line 2,
:end-column 1})]
(is (= expected result))))

; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Expand Down
4 changes: 2 additions & 2 deletions test/rksm/cloxp_source_reader/test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,14 @@
(src-rdr/add-source-to-interns-with-reader source entities)))))

(testing "more meta entities than source"
(is (= [{:source "(def x 23)" :column 1,:line 1}]
(is (= [{:source "(def x 23)\n" :column 1,:line 1}]
(let [entities [{:column 1,:line 1} {:column 1,:line 6}]
source (java.io.StringReader. "(def x 23)")]
(src-rdr/add-source-to-interns-with-reader source entities)))))

(testing "not entities in source"
"this might be kind of unexpected but the reader des not care bout lines"
(is (= [{:source "(def y 24)" :column 1,:line 3}]
(is (= [{:source "(def y 24)\n" :column 1,:line 3}]
(let [entities [{:column 1,:line 3} {:column 1,:line 6}]
source (java.io.StringReader. "(def x 23)\n\n(def y 24)")]
(src-rdr/add-source-to-interns-with-reader source entities)))))))
Expand Down

0 comments on commit b41ea3d

Please sign in to comment.