Skip to content

Commit 4c2b701

Browse files
committed
Strengthen refactor-nrepl.analyzer
Now it uses locks and `invalid-fqn?`
1 parent 27633e5 commit 4c2b701

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

src/refactor_nrepl/analyzer.clj

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
[clojure.tools.namespace.parse :refer [read-ns-decl]]
1010
[clojure.walk :as walk]
1111
[refactor-nrepl
12-
[config :as config]]
12+
[config :as config]
13+
[core :as core]
14+
[util :as util]]
1315
[refactor-nrepl.ns.tracker :as tracker])
1416
(:import java.io.PushbackReader
1517
java.util.regex.Pattern))
@@ -71,14 +73,18 @@
7173

7274
(defn- build-ast
7375
[ns aliases]
74-
(when (ns-on-cp? ns)
75-
(let [opts {:passes-opts
76-
{:validate/unresolvable-symbol-handler shadow-unresolvable-symbol-handler
77-
:validate/throw-on-arity-mismatch false
78-
:validate/wrong-tag-handler shadow-wrong-tag-handler}}]
79-
(binding [ana/macroexpand-1 noop-macroexpand-1
80-
reader/*data-readers* *data-readers*]
81-
(assoc-in (aj/analyze-ns ns (aj/empty-env) opts) [0 :alias-info] aliases)))))
76+
(when (and (ns-on-cp? ns)
77+
(not (util/invalid-fqn? ns)))
78+
;; Use `locking`, because AST analysis can perform arbitrary evaluation.
79+
;; Parallel analysis is not safe, especially as it can perform `require` calls.
80+
(locking core/require-lock
81+
(let [opts {:passes-opts
82+
{:validate/unresolvable-symbol-handler shadow-unresolvable-symbol-handler
83+
:validate/throw-on-arity-mismatch false
84+
:validate/wrong-tag-handler shadow-wrong-tag-handler}}]
85+
(binding [ana/macroexpand-1 noop-macroexpand-1
86+
reader/*data-readers* *data-readers*]
87+
(assoc-in (aj/analyze-ns ns (aj/empty-env) opts) [0 :alias-info] aliases))))))
8288

8389
(defn- cachable-ast [file-content]
8490
(let [[ns aliases] (parse-ns file-content)]

0 commit comments

Comments
 (0)