Skip to content

Commit 43b21db

Browse files
committed
Rename old anayzer to old
1 parent b178857 commit 43b21db

File tree

5 files changed

+188
-185
lines changed

5 files changed

+188
-185
lines changed

src/nextjournal/clerk/analyzer.clj

Lines changed: 48 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,9 @@
66
[clojure.java.io :as io]
77
[clojure.set :as set]
88
[clojure.string :as str]
9-
[clojure.tools.analyzer :as ana]
10-
[clojure.tools.analyzer.ast :as ana-ast]
11-
[clojure.tools.analyzer.jvm :as ana-jvm]
12-
[clojure.tools.analyzer.utils :as ana-utils]
139
[multiformats.base.b58 :as b58]
1410
[multiformats.hash :as hash]
11+
[nextjournal.clerk.analyzer.impl :as ana :refer [analyze*]]
1512
[nextjournal.clerk.classpath :as cp]
1613
[nextjournal.clerk.config :as config]
1714
[nextjournal.clerk.parser :as parser]
@@ -63,13 +60,13 @@
6360
(comp (keep :class)
6461
(filter class?)
6562
(map ensure-symbol))
66-
(ana-ast/nodes analyzed))
63+
(ana/nodes analyzed))
6764
(into #{}
6865
(comp (filter (comp #{:const} :op))
6966
(filter (comp #{:class} :type))
7067
(keep :form)
7168
(map ensure-symbol))
72-
(ana-ast/nodes analyzed))))
69+
(ana/nodes analyzed))))
7370

7471
#_(map type (:deps (analyze '(+ 1 2))))
7572

@@ -83,17 +80,6 @@
8380

8481
#_(rewrite-defcached '(nextjournal.clerk/defcached foo :bar))
8582

86-
(defn unresolvable-symbol-handler [ns sym ast-node]
87-
ast-node)
88-
89-
(defn wrong-tag-handler [tag ast-node]
90-
ast-node)
91-
92-
(def analyzer-passes-opts
93-
(assoc ana-jvm/default-passes-opts
94-
:validate/wrong-tag-handler wrong-tag-handler
95-
:validate/unresolvable-symbol-handler unresolvable-symbol-handler))
96-
9783
(defn form->ex-data
9884
"Returns ex-data map with the form and its location info from metadata."
9985
[form]
@@ -105,13 +91,8 @@
10591
([bindings form]
10692
(binding [config/*in-clerk* true]
10793
(try
108-
(let [old-deftype-hack ana-jvm/-deftype]
109-
;; NOTE: workaround for tools.analyzer `-deftype` + `eval` HACK, which redefines classes which doesn't work well with instance? checks
110-
(with-redefs [ana-jvm/-deftype (fn [name class-name args interfaces]
111-
(when-not (resolve class-name)
112-
(old-deftype-hack name class-name args interfaces)))]
113-
(ana-jvm/analyze form (ana-jvm/empty-env) {:bindings bindings
114-
:passes-opts analyzer-passes-opts})))
94+
(analyze* (assoc (ana/to-env bindings)
95+
:ns (ns-name *ns*)) form)
11596
(catch java.lang.AssertionError e
11697
(throw (ex-info "Failed to analyze form"
11798
(form->ex-data form)
@@ -138,16 +119,35 @@
138119

139120
(defn analyze [form]
140121
(let [!deps (atom #{})
141-
!forms (atom [])
142-
mexpander (fn [form env]
143-
(swap! !forms conj form)
144-
(let [f (if (seq? form) (first form) form)
145-
v (ana-utils/resolve-sym f env)]
146-
(when (and (not (-> env :locals (get f))) (var? v))
147-
(swap! !deps conj v)))
148-
(ana-jvm/macroexpand-1 form env))
149-
analyzed (analyze-form {#'ana/macroexpand-1 mexpander} (rewrite-defcached form))
150-
nodes (ana-ast/nodes analyzed)
122+
analyzed (binding [ana/*deps* !deps]
123+
(-> (analyze-form (rewrite-defcached form))
124+
(ana/resolve-syms-pass)
125+
(ana/macroexpand-pass)))
126+
_ (ana/prewalk (ana/only-nodes
127+
#{:var :binding :symbol}
128+
(fn [var-node]
129+
(case (:op var-node)
130+
:var (let [var (:var var-node)]
131+
(swap! !deps conj var))
132+
:binding (when-let [t (:tag (meta (:form var-node)))]
133+
(when-let [clazz (try (resolve t)
134+
(catch Exception _ nil))]
135+
(when (class? clazz)
136+
(swap! !deps conj (.getName ^Class clazz)))))
137+
:symbol (when-not (:local? var-node)
138+
(let [form (:form var-node)]
139+
(if (qualified-symbol? form)
140+
(let [clazz-sym (symbol (namespace form))]
141+
(when-let [clazz (try (resolve clazz-sym)
142+
(catch Exception _ nil))]
143+
(when (class? clazz)
144+
(swap! !deps conj (.getName ^Class clazz)))))
145+
(when-let [clazz (try (resolve form)
146+
(catch Exception _ nil))]
147+
(when (class? clazz)
148+
(swap! !deps conj (.getName ^Class clazz))))))))
149+
var-node)) analyzed)
150+
nodes (ana/nodes analyzed)
151151
{:keys [vars declared]} (get-vars+forward-declarations nodes)
152152
vars- (set/difference vars declared)
153153
var (when (and (= 1 (count vars))
@@ -168,6 +168,7 @@
168168
deref-deps
169169
(class-deps analyzed)
170170
(when (var? form) #{(symbol form)}))
171+
;; _ (def d deps)
171172
hash-fn (-> form meta :nextjournal.clerk/hash-fn)]
172173
(cond-> {#_#_:analyzed analyzed
173174
:form form
@@ -184,13 +185,19 @@
184185
(seq declared) (assoc :declared declared)
185186
var (assoc :var var))))
186187

187-
#_(analyze '(assoc {} :a :b))
188+
#_(analyze '(assoc {} (dissoc {} :a) 2))
188189
#_(analyze '[[assoc]])
189-
#_(analyze nil)
190-
#_(analyze '(let [inc assoc]))
191-
#_(analyze '(Class/forName "dude"))
192-
#_(:deps (analyze '(fn [^String x] (.length x))))
193-
#_(:deps (analyze '(ns foo (:import [java.lang String]))))
190+
#_(analyze '(let [inc assoc]
191+
)) ;; let + assoc, no inc since it's a binding
192+
#_(analyze '(fn [^String x] (.length x)))
193+
#_(analyze '(.length "foo"))
194+
#_(analyze '(quote [inc clojure.core/inc])) ;; no deps
195+
#_(analyze 'String)
196+
#_(analyze '(defprotocol Dude))
197+
#_(binding [*deps* (atom #{})]
198+
(-> (analyze-form '(fn [^String x] (.length x)))
199+
(resolve-syms-pass)
200+
(macroexpand-pass)))
194201

195202
#_(:vars (analyze '(do (declare x y) (def x 0) (def z) (def w 0)))) ;=> x y z w
196203
#_(:vars- (analyze '(do (def x 0) (declare x y) (def z) (def w 0)))) ;=> x z w
@@ -552,7 +559,7 @@
552559
analyze-doc-deps
553560
set-no-cache-on-redefs
554561
make-deps-inherit-no-cache
555-
(dissoc :analyzed-file-set :counter))))))
562+
(dissoc :analyzed-file-set :counter))))))
556563

557564
(comment
558565
(reset! !file->analysis-cache {})

src/nextjournal/clerk/analyzer/impl.clj

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,13 @@
9191
(var? v) (symbol v)
9292
(var?' v) (symbol (str (:ns v)) (str (:name v)))))
9393

94+
#_(ns-unmap *ns* 'macroexpand-hook)
95+
9496
(defmulti macroexpand-hook (fn [the-var _&form _&env _args] (var-sym the-var)))
9597

96-
(defmethod macroexpand-hook 'clojure.core/deftype [_ &form &env [name class-name args interfaces]]
97-
(when-not (resolve class-name)
98-
(apply #'clojure.core/deftype &form &env name class-name args interfaces)))
98+
#_(defmethod macroexpand-hook 'clojure.core/deftype [_ &form &env [name class-name args interfaces]]
99+
(when-not (resolve class-name)
100+
(apply #'clojure.core/deftype &form &env name class-name args interfaces)))
99101

100102
(defmethod macroexpand-hook :default [the-var &form &env args]
101103
(if (cljs? &env)
Lines changed: 42 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
(ns nextjournal.clerk.analyzer2
1+
(ns nextjournal.clerk.analyzer-old
22
{:nextjournal.clerk/no-cache true}
33
(:refer-clojure :exclude [hash])
44
(:require [babashka.fs :as fs]
55
[clojure.core :as core]
66
[clojure.java.io :as io]
77
[clojure.set :as set]
88
[clojure.string :as str]
9+
[clojure.tools.analyzer :as ana]
10+
[clojure.tools.analyzer.ast :as ana-ast]
11+
[clojure.tools.analyzer.jvm :as ana-jvm]
12+
[clojure.tools.analyzer.utils :as ana-utils]
913
[multiformats.base.b58 :as b58]
1014
[multiformats.hash :as hash]
11-
[nextjournal.clerk.analyzer.impl :as ana :refer [analyze*]]
1215
[nextjournal.clerk.classpath :as cp]
1316
[nextjournal.clerk.config :as config]
1417
[nextjournal.clerk.parser :as parser]
@@ -60,13 +63,13 @@
6063
(comp (keep :class)
6164
(filter class?)
6265
(map ensure-symbol))
63-
(ana/nodes analyzed))
66+
(ana-ast/nodes analyzed))
6467
(into #{}
6568
(comp (filter (comp #{:const} :op))
6669
(filter (comp #{:class} :type))
6770
(keep :form)
6871
(map ensure-symbol))
69-
(ana/nodes analyzed))))
72+
(ana-ast/nodes analyzed))))
7073

7174
#_(map type (:deps (analyze '(+ 1 2))))
7275

@@ -80,6 +83,17 @@
8083

8184
#_(rewrite-defcached '(nextjournal.clerk/defcached foo :bar))
8285

86+
(defn unresolvable-symbol-handler [ns sym ast-node]
87+
ast-node)
88+
89+
(defn wrong-tag-handler [tag ast-node]
90+
ast-node)
91+
92+
(def analyzer-passes-opts
93+
(assoc ana-jvm/default-passes-opts
94+
:validate/wrong-tag-handler wrong-tag-handler
95+
:validate/unresolvable-symbol-handler unresolvable-symbol-handler))
96+
8397
(defn form->ex-data
8498
"Returns ex-data map with the form and its location info from metadata."
8599
[form]
@@ -91,8 +105,13 @@
91105
([bindings form]
92106
(binding [config/*in-clerk* true]
93107
(try
94-
(analyze* (assoc (ana/to-env bindings)
95-
:ns (ns-name *ns*)) form)
108+
(let [old-deftype-hack ana-jvm/-deftype]
109+
;; NOTE: workaround for tools.analyzer `-deftype` + `eval` HACK, which redefines classes which doesn't work well with instance? checks
110+
(with-redefs [ana-jvm/-deftype (fn [name class-name args interfaces]
111+
(when-not (resolve class-name)
112+
(old-deftype-hack name class-name args interfaces)))]
113+
(ana-jvm/analyze form (ana-jvm/empty-env) {:bindings bindings
114+
:passes-opts analyzer-passes-opts})))
96115
(catch java.lang.AssertionError e
97116
(throw (ex-info "Failed to analyze form"
98117
(form->ex-data form)
@@ -119,35 +138,16 @@
119138

120139
(defn analyze [form]
121140
(let [!deps (atom #{})
122-
analyzed (binding [ana/*deps* !deps]
123-
(-> (analyze-form (rewrite-defcached form))
124-
(ana/resolve-syms-pass)
125-
(ana/macroexpand-pass)))
126-
_ (ana/prewalk (ana/only-nodes
127-
#{:var :binding :symbol}
128-
(fn [var-node]
129-
(case (:op var-node)
130-
:var (let [var (:var var-node)]
131-
(swap! !deps conj var))
132-
:binding (when-let [t (:tag (meta (:form var-node)))]
133-
(when-let [clazz (try (resolve t)
134-
(catch Exception _ nil))]
135-
(when (class? clazz)
136-
(swap! !deps conj (.getName ^Class clazz)))))
137-
:symbol (when-not (:local? var-node)
138-
(let [form (:form var-node)]
139-
(if (qualified-symbol? form)
140-
(let [clazz-sym (symbol (namespace form))]
141-
(when-let [clazz (try (resolve clazz-sym)
142-
(catch Exception _ nil))]
143-
(when (class? clazz)
144-
(swap! !deps conj (.getName ^Class clazz)))))
145-
(when-let [clazz (try (resolve form)
146-
(catch Exception _ nil))]
147-
(when (class? clazz)
148-
(swap! !deps conj (.getName ^Class clazz))))))))
149-
var-node)) analyzed)
150-
nodes (ana/nodes analyzed)
141+
!forms (atom [])
142+
mexpander (fn [form env]
143+
(swap! !forms conj form)
144+
(let [f (if (seq? form) (first form) form)
145+
v (ana-utils/resolve-sym f env)]
146+
(when (and (not (-> env :locals (get f))) (var? v))
147+
(swap! !deps conj v)))
148+
(ana-jvm/macroexpand-1 form env))
149+
analyzed (analyze-form {#'ana/macroexpand-1 mexpander} (rewrite-defcached form))
150+
nodes (ana-ast/nodes analyzed)
151151
{:keys [vars declared]} (get-vars+forward-declarations nodes)
152152
vars- (set/difference vars declared)
153153
var (when (and (= 1 (count vars))
@@ -168,7 +168,6 @@
168168
deref-deps
169169
(class-deps analyzed)
170170
(when (var? form) #{(symbol form)}))
171-
;; _ (def d deps)
172171
hash-fn (-> form meta :nextjournal.clerk/hash-fn)]
173172
(cond-> {#_#_:analyzed analyzed
174173
:form form
@@ -185,19 +184,13 @@
185184
(seq declared) (assoc :declared declared)
186185
var (assoc :var var))))
187186

188-
#_(analyze '(assoc {} (dissoc {} :a) 2))
187+
#_(analyze '(assoc {} :a :b))
189188
#_(analyze '[[assoc]])
190-
#_(analyze '(let [inc assoc]
191-
)) ;; let + assoc, no inc since it's a binding
192-
#_(analyze '(fn [^String x] (.length x)))
193-
#_(analyze '(.length "foo"))
194-
#_(analyze '(quote [inc clojure.core/inc])) ;; no deps
195-
#_(analyze 'String)
196-
#_(analyze '(defprotocol Dude))
197-
#_(binding [*deps* (atom #{})]
198-
(-> (analyze-form '(fn [^String x] (.length x)))
199-
(resolve-syms-pass)
200-
(macroexpand-pass)))
189+
#_(analyze nil)
190+
#_(analyze '(let [inc assoc]))
191+
#_(analyze '(Class/forName "dude"))
192+
#_(:deps (analyze '(fn [^String x] (.length x))))
193+
#_(:deps (analyze '(ns foo (:import [java.lang String]))))
201194

202195
#_(:vars (analyze '(do (declare x y) (def x 0) (def z) (def w 0)))) ;=> x y z w
203196
#_(:vars- (analyze '(do (def x 0) (declare x y) (def z) (def w 0)))) ;=> x z w
@@ -559,7 +552,7 @@
559552
analyze-doc-deps
560553
set-no-cache-on-redefs
561554
make-deps-inherit-no-cache
562-
(dissoc :analyzed-file-set :counter))))))
555+
(dissoc :analyzed-file-set :counter))))))
563556

564557
(comment
565558
(reset! !file->analysis-cache {})

0 commit comments

Comments
 (0)