|
3036 | 3036 | (symbol (str name-str "$macros"))
|
3037 | 3037 | name)))
|
3038 | 3038 |
|
| 3039 | +(defn- check-duplicate-aliases |
| 3040 | + [env old new] |
| 3041 | + (let [ns-name (:name old)] |
| 3042 | + (doseq [k [:requires :require-macros]] |
| 3043 | + (let [old-aliases (get old k) |
| 3044 | + new-aliases (get new k)] |
| 3045 | + (when-some [alias (some (set (keys new-aliases)) |
| 3046 | + (->> old-aliases |
| 3047 | + (remove (fn [[k v :as entry]] |
| 3048 | + (or (= k v) |
| 3049 | + (= entry (find new-aliases k))))) |
| 3050 | + keys))] |
| 3051 | + (throw (error env |
| 3052 | + (str "Alias " alias " already exists in namespace " ns-name |
| 3053 | + ", aliasing " (get old-aliases alias))))))))) |
| 3054 | + |
| 3055 | +(defn- merge-ns-info [old new env] |
| 3056 | + (if (pos? (count old)) |
| 3057 | + (let [deep-merge-keys |
| 3058 | + [:use-macros :require-macros :rename-macros |
| 3059 | + :uses :requires :renames :imports]] |
| 3060 | + #?(:clj |
| 3061 | + (when *check-alias-dupes* |
| 3062 | + (check-duplicate-aliases env old new))) |
| 3063 | + (merge |
| 3064 | + old |
| 3065 | + (select-keys new [:excludes]) |
| 3066 | + (merge-with merge |
| 3067 | + (select-keys old deep-merge-keys) |
| 3068 | + (select-keys new deep-merge-keys)))) |
| 3069 | + new)) |
| 3070 | + |
3039 | 3071 | (defmethod parse 'ns
|
3040 | 3072 | [_ env [_ name & args :as form] _ opts]
|
3041 | 3073 | (when-not *allow-ns*
|
|
3129 | 3161 | :requires requires
|
3130 | 3162 | :renames (merge renames core-renames)
|
3131 | 3163 | :imports imports}]
|
3132 |
| - (swap! env/*compiler* update-in [::namespaces name] merge ns-info) |
| 3164 | + (swap! env/*compiler* update-in [::namespaces name] merge-ns-info ns-info env) |
3133 | 3165 | (merge {:op :ns
|
3134 | 3166 | :env env
|
3135 | 3167 | :form form
|
|
3144 | 3176 | (update-in [:requires]
|
3145 | 3177 | (fn [m] (with-meta m {(@reload :require) true})))))))))
|
3146 | 3178 |
|
3147 |
| -(defn- check-duplicate-aliases |
3148 |
| - [env old new] |
3149 |
| - (let [ns-name (:name old)] |
3150 |
| - (doseq [k [:requires :require-macros]] |
3151 |
| - (let [old-aliases (get old k) |
3152 |
| - new-aliases (get new k)] |
3153 |
| - (when-some [alias (some (set (keys new-aliases)) |
3154 |
| - (->> old-aliases |
3155 |
| - (remove (fn [[k v :as entry]] |
3156 |
| - (or (= k v) |
3157 |
| - (= entry (find new-aliases k))))) |
3158 |
| - keys))] |
3159 |
| - (throw (error env |
3160 |
| - (str "Alias " alias " already exists in namespace " ns-name |
3161 |
| - ", aliasing " (get old-aliases alias))))))))) |
3162 |
| - |
3163 | 3179 | (defmethod parse 'ns*
|
3164 | 3180 | [_ env [_ quoted-specs :as form] _ opts]
|
3165 | 3181 | (when-let [not-quoted (->> (remove keyword? quoted-specs)
|
|
3222 | 3238 | :uses uses
|
3223 | 3239 | :requires requires
|
3224 | 3240 | :renames (merge renames core-renames)
|
3225 |
| - :imports imports} |
3226 |
| - ns-info |
3227 |
| - (let [ns-info' (get-in @env/*compiler* [::namespaces name])] |
3228 |
| - (if (pos? (count ns-info')) |
3229 |
| - (let [merge-keys |
3230 |
| - [:use-macros :require-macros :rename-macros |
3231 |
| - :uses :requires :renames :imports]] |
3232 |
| - #?(:clj |
3233 |
| - (when *check-alias-dupes* |
3234 |
| - (check-duplicate-aliases env ns-info' require-info))) |
3235 |
| - (merge |
3236 |
| - ns-info' |
3237 |
| - {:excludes excludes} |
3238 |
| - (merge-with merge |
3239 |
| - (select-keys ns-info' merge-keys) |
3240 |
| - (select-keys require-info merge-keys)))) |
3241 |
| - require-info))] |
3242 |
| - (swap! env/*compiler* update-in [::namespaces name] merge ns-info) |
| 3241 | + :imports imports}] |
| 3242 | + (swap! env/*compiler* update-in [::namespaces name] merge-ns-info require-info env) |
3243 | 3243 | (merge {:op :ns*
|
3244 | 3244 | :env env
|
3245 | 3245 | :form form
|
|
0 commit comments