Skip to content

Commit

Permalink
add locals to fingerprinting to avoid weird reloading errors
Browse files Browse the repository at this point in the history
  • Loading branch information
cgrand committed Dec 16, 2024
1 parent 0029eb6 commit 0cef882
Showing 1 changed file with 32 additions and 3 deletions.
35 changes: 32 additions & 3 deletions clj/src/cljd/compiler.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@

(defn- resolve-non-local-symbol [sym type-vars]
(let [{:keys [libs dart-aliases] :as nses} @nses
{:keys [mappings clj-aliases] :as current-ns} (nses *current-ns*)
{:keys [mappings clj-aliases typedefs] :as current-ns} (nses *current-ns*)
ensure-class (fn [v] (when (= :class (:type v)) v))
resolve (fn [sym ensure-right-type]
(else->>
Expand Down Expand Up @@ -2618,6 +2618,15 @@
:else
(assoc-in nses [the-ns sym] (assoc m :meta (merge msym (:meta m)))))))

(defn do-typedef [nses old-sym sym]
(let [the-ns *current-ns*]
(update nses the-ns
(fn [ns]
(-> ns
(dissoc old-sym)
(assoc-in [:mappings old-sym] sym)
(assoc-in [:typedefs old-sym] sym))))))

(defn alter-def [nses sym f & args]
(apply update-in nses [*current-ns* sym] f args))

Expand Down Expand Up @@ -2889,15 +2898,29 @@
env-for-ctor-call)]
[parsed-class-meta-specs (emit-class-specs 'dart:core/Object parsed-class-meta-specs env-for-ctor-call)]))
all-fields (cond->> closed-overs meta-field (cons meta-field))
; change the classname to vary on meta+closed-overs to avoid
; reloading errors on fieldset changes.
; introduce a typedef to fix code emitted above
old-class-name class-name
fingerprint (str fingerprint "_"
(Integer/toUnsignedString
(hash all-fields) 36))
class-name (anonymous-global
(munge-str
(str (if-some [var-name (:var-name opts)] "ifn" (or (:name-hint opts) "reify"))))
fingerprint)
mclass-name (vary-meta class-name assoc :type-params (:type-vars env))
dart-type (new-dart-type mclass-name (:type-vars env) [] parsed-class-specs env)

dart-type (if meta-field
(let [meta-members (:members (new-dart-type mclass-name (:type-vars env) all-fields parsed-class-meta-specs env))]
(-> dart-type
; no mixins, no super, only interfaces
(update-in [:members :interfaces] (fnil into []) (:interfaces meta-members))
(update :members into (filter (fn [[k]] (string? k))) meta-members)))
dart-type)
_ (swap! nses alter-def class-name assoc :dart/type dart-type)
class (-> class
_ (swap! nses do-typedef old-class-name class-name)
_ (swap! nses do-def class-name {:dart/name mclass-name :dart/type dart-type :type :class})class (-> class
(assoc
:name (emit-type mclass-name env)
:ctor class-name
Expand Down Expand Up @@ -4406,6 +4429,12 @@
(dart-print " as ")
(dart-print dart-alias)
(dart-print ";\n"))
(doseq [[alias type] (:typedefs ns-map)]
(dart-print "typedef ")
(dart-print alias)
(dart-print " = ")
(dart-print type)
(dart-print ";\n"))
(doseq [[sym v] (->> ns-map (filter (comp symbol? key)) (sort-by key))
:when (symbol? sym)
:let [{:keys [dart/code]} v]
Expand Down

0 comments on commit 0cef882

Please sign in to comment.