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

Commit

Permalink
updated intern source reader to support cljx
Browse files Browse the repository at this point in the history
  • Loading branch information
rksm committed Mar 18, 2015
1 parent 6c2250d commit 187432f
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 21 deletions.
64 changes: 47 additions & 17 deletions src/rksm/cloxp_source_reader/core.clj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,35 @@
(:import (java.io LineNumberReader InputStreamReader PushbackReader)
(clojure.lang RT)))

; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; string helper

(defn- line-column-access
[string]
(let [lines (s/split-lines string)]
(fn line-column-access-for-string
[{start-line :line start-column :column :as s} {end-line :line end-column :column :as e}]
(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))
end (if (= start-line end-line)
start (nth lines (min (dec (count lines)) (dec end-line))))
end (.substring end 0 (dec end-column))
inbetween (->> lines (drop start-line) (take (dec (- end-line start-line))))]
(s/join "\n"
(if (= start-line end-line)
[end]
(concat [start] inbetween [end]))))))))

(comment
(def s "hello\nworld\n\nfoo\nbar\n\n")
((line-column-access s) {:line 3 :column 1} {:line 2 :column 3})
((line-column-access s) {:line 2 :column 3} {:line 3 :column 1})
((line-column-access s) {:line 1 :column 1} {:line 3 :column 1}))

; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

(defn name-of-def
[form]
(first (drop 1 (filter symbol? form))))
Expand Down Expand Up @@ -69,21 +98,29 @@
(defn add-source-to-interns-with-reader
"interns are supposed to be meta-data-like maps, at least including :line for
the entity to be read"
[rdr interns & [opts]]
{:pre [every? #((or (contains? (:line %))
[rdr interns & [{:keys [cljx?] :as opts}]]
{:pre [every? #((or (contains? (:line %))
(contains? (:name %)))) interns]}
(let [objs (read-objs (slurp rdr))
(let [file-source (slurp rdr)
clj-source (if cljx?
(cljx.core/transform file-source cljx.rules/clj-rules)
file-source)
objs (doall (read-objs clj-source))
obj-map (apply sorted-map (mapcat (juxt :name identity) objs))]
(sort-by
:line
(keep (fn [{n :name l :line c :column, :as meta-entity}]
(if-let [{s :source}
(if-let [{:keys [line column end-line end-column source]}
(if n
(get obj-map n)
(->> objs
(filter (fn [{c2 :column, l2 :line}] (and (= c c2) (= l l2))))
first))]
(assoc meta-entity :source s)))
; (assoc meta-entity :source source)
(assoc meta-entity :source
((line-column-access file-source)
{:line line :column column}
{:line end-line :column end-column}))))
interns))))

(defn add-source-to-interns
Expand All @@ -95,19 +132,12 @@
system! (and the system meta data will clash with the actual file contents)"
[ns interns & [{:keys [file cljx?]} :as opts]]
[file cljx?]
(if-let [rdr (source-reader-for-ns ns file)]
(let [cljx? (or cljx? (and
(nil? cljx?)
(string? file)
(re-find #"\.cljx$" file)))
rdr (if cljx?
(-> (slurp rdr)
(cljx.core/transform cljx.rules/clj-rules)
java.io.StringReader.)
rdr)]
(let [file (rksm.system-files/file-for-ns ns file)
cljx? (or cljx? (and (nil? cljx?) (boolean (re-find #"\.cljx$" (str file)))))]
(if-let [rdr (source-reader-for-ns ns file)]
(with-open [rdr rdr]
(add-source-to-interns-with-reader rdr interns opts)))
interns))
(add-source-to-interns-with-reader rdr interns {assoc opts :cljx? cljx?}))
interns)))

; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Expand Down
29 changes: 29 additions & 0 deletions test/rksm/cloxp_source_reader/cljx_test.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
(ns rksm.cloxp-source-reader.cljx-test
(:require [clojure.test :refer :all]
[rksm.cloxp-source-reader.core :as src-rdr]
[rksm.system-files.cljx :as cljx]))

(defn fixture [test]
(cljx/enable-cljx-load-support!)
(test)
(remove-ns 'rksm.cloxp-source-reader.test.cljx-dummy))

(use-fixtures :each fixture)

(deftest read-cljx-intern-source
(require 'rksm.cloxp-source-reader.test.cljx-dummy :reload)
(let [meta-data (src-rdr/add-source-to-interns
'rksm.cloxp-source-reader.test.cljx-dummy
(map meta (vals (ns-interns 'rksm.cloxp-source-reader.test.cljx-dummy))))
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)")]
(is (= expected sources))))

; -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

(comment
(keep (comp (partial re-find #".*repl.*") str) (rksm.system-files/classpath))
(run-tests *ns*)
)
8 changes: 4 additions & 4 deletions test/rksm/cloxp_source_reader/test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,15 @@
(testing "extract meta entities from source"

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

(testing "less meta entities than source"
(is (= [{:source "(def x 23)" :column 1,:line 1}
{:source "(def y 24)" :column 1,:line 6}]
(is (= [{:source "(def x 23)\n" :column 1,:line 1}
{:source "(def y 24)\n" :column 1,:line 6}]
(let [entities [{:column 1,:line 1} {:column 1,:line 6}]
source (java.io.StringReader. "(def x 23)\n(def baz\n\n99)\n\n(def y 24)\n")]
(src-rdr/add-source-to-interns-with-reader source entities)))))
Expand Down
16 changes: 16 additions & 0 deletions test/rksm/cloxp_source_reader/test/cljx_dummy.cljx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
(ns rksm.cloxp-source-reader.test.cljx-dummy)

(defn x-to-string
[x]
(let [buf #+clj (StringBuilder.) #+cljs (gstring/StringBuffer.)]
(.append buf "x is: ")
(.append buf (str x))))

(reify
#+clj clojure.lang.IFn
#+cljs cljs.core.IFn
(invoke [_ x] (inc x)))

(def x 23)

(def y #+clj 24 #+cljx 25)

0 comments on commit 187432f

Please sign in to comment.