        (assert targetexpr "set! target must be a field or a symbol naming a var")
        (cond
         (= targetexpr ::set-unchecked-if) {:env env :op :no-op}
-        :else {:env env :op :set! :target targetexpr :val valexpr})))))
+        :else {:env env :op :set! :form form :target targetexpr :val valexpr})))))
 
 (defmethod parse 'ns
-  [_ env [_ name & args] _]
+  [_ env [_ name & args :as form] _]
   (let [excludes
         (reduce (fn [s [k exclude xs]]
                   (if (= k :refer-clojure)

                     (assoc :file *cljs-file*)
                     (assoc :line line))
                 m))))
    {:env env :op :defrecord* :t t :fields fields}))

;; dot accessor code


                                     (into {} (map (fn [[alias nsym]]
                                                     [alias (find-ns nsym)])
                                                   requires-macros)))))
    {:env env :op :ns :form form :name name :uses uses :requires requires
     :uses-macros uses-macros :requires-macros requires-macros :excludes excludes}))

(defmethod parse 'deftype*
  [_ env [_ tsym fields :as form] _]
  (let [t (munge (:name (resolve-var (dissoc env :locals) tsym)))]
    (swap! namespaces update-in [(-> env :ns :name) :defs tsym]
           (fn [m]
