Skip to content

Commit c37442c

Browse files
author
dnolen
committed
CLJS-2718: Setting *warn-on-infer* in REPL throws a SyntaxError
refactor so that we always generate AST for set! calls, only if non-REPL and a special case do we throw it away now REPL behavior matches Clojure for set! even for magic compiler flags
1 parent aac4993 commit c37442c

2 files changed

Lines changed: 44 additions & 48 deletions

File tree

src/main/clojure/cljs/analyzer.cljc

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2023,53 +2023,49 @@
20232023
[`(. ~target ~val) alt]
20242024
[target val])]
20252025
(disallowing-recur
2026-
(let [enve (assoc env :context :expr)
2027-
targetexpr (cond
2028-
(and (= target '*unchecked-if*) ;; TODO: proper resolve
2029-
(or (true? val) (false? val)))
2030-
(do
2031-
(set! *unchecked-if* val)
2032-
::set-unchecked-if)
2033-
2034-
(and (= target '*unchecked-arrays*) ;; TODO: proper resolve
2035-
(or (true? val) (false? val)))
2036-
(do
2037-
(set! *unchecked-arrays* val)
2038-
::set-unchecked-arrays)
2039-
2040-
(= target '*warn-on-infer*)
2041-
(do
2042-
(set! *cljs-warnings* (assoc *cljs-warnings* :infer-warning true))
2043-
::set-warn-on-infer)
2044-
2045-
(symbol? target)
2046-
(do
2047-
(when (some? (:const (resolve-var (dissoc env :locals) target)))
2048-
(throw (error env "Can't set! a constant")))
2049-
(let [local (-> env :locals target)]
2050-
(when-not (or (nil? local)
2051-
(and (:field local)
2052-
(or (:mutable local)
2053-
(:unsynchronized-mutable local)
2054-
(:volatile-mutable local))))
2055-
(throw (error env "Can't set! local var or non-mutable field"))))
2056-
(analyze-symbol enve target))
2057-
2058-
:else
2059-
(when (seq? target)
2060-
(let [targetexpr (analyze-seq enve target nil)]
2061-
(when (:field targetexpr)
2062-
targetexpr))))
2063-
valexpr (analyze enve val)]
2064-
(when-not targetexpr
2065-
(throw (error env "set! target must be a field or a symbol naming a var")))
2066-
(cond
2067-
(some? (#{::set-unchecked-if ::set-unchecked-arrays ::set-warn-on-infer} targetexpr))
2068-
{:env env :op :no-op}
2026+
(let [enve (assoc env :context :expr)
2027+
texpr (cond
2028+
(symbol? target)
2029+
(do
2030+
(cond
2031+
(and (= target '*unchecked-if*) ;; TODO: proper resolve
2032+
(or (true? val) (false? val)))
2033+
(set! *unchecked-if* val)
2034+
2035+
(and (= target '*unchecked-arrays*) ;; TODO: proper resolve
2036+
(or (true? val) (false? val)))
2037+
(set! *unchecked-arrays* val)
2038+
2039+
(and (= target '*warn-on-infer*)
2040+
(or (true? val) (false? val)))
2041+
(set! *cljs-warnings* (assoc *cljs-warnings* :infer-warning val)))
2042+
(when (some? (:const (resolve-var (dissoc env :locals) target)))
2043+
(throw (error env "Can't set! a constant")))
2044+
(let [local (-> env :locals target)]
2045+
(when-not (or (nil? local)
2046+
(and (:field local)
2047+
(or (:mutable local)
2048+
(:unsynchronized-mutable local)
2049+
(:volatile-mutable local))))
2050+
(throw (error env "Can't set! local var or non-mutable field"))))
2051+
(analyze-symbol enve target))
2052+
2053+
:else
2054+
(when (seq? target)
2055+
(let [texpr (analyze-seq enve target nil)]
2056+
(when (:field texpr)
2057+
texpr))))
2058+
vexpr (analyze enve val)]
2059+
(when-not texpr
2060+
(throw (error env "set! target must be a field or a symbol naming a var")))
2061+
(cond
2062+
(and (not (:def-emits-var env)) ;; non-REPL context
2063+
(some? ('#{*unchecked-if* *unchecked-array* *warn-on-infer*} target)))
2064+
{:env env :op :no-op}
20692065

2070-
:else
2071-
{:env env :op :set! :form form :target targetexpr :val valexpr
2072-
:children [targetexpr valexpr]})))))
2066+
:else
2067+
{:env env :op :set! :form form :target texpr :val vexpr
2068+
:children [texpr vexpr]})))))
20732069

20742070
#?(:clj (declare analyze-file))
20752071

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -998,8 +998,8 @@
998998
(.baz x))]
999999
:externs ["src/test/externs/test.js"]
10001000
:warnings ws
1001-
:warn false})]
1002-
(is (string/blank? res))
1001+
:warn false
1002+
:with-core? true})]
10031003
(is (= 1 (count @ws)))
10041004
(is (string/starts-with? (first @ws) "Cannot infer target type"))))
10051005

0 commit comments

Comments
 (0)