From d86597b19c9efef97ca5f9771c6882cf4b77e624 Mon Sep 17 00:00:00 2001
From: Nemanja Glumac <31325167+nemanjaglumac@users.noreply.github.com>
Date: Fri, 31 Mar 2023 11:21:53 +0200
Subject: [PATCH] Revert "shared.ns/import-fn(s) emit optimized defn forms
 (#29700)" (#29715)

This reverts commit a817ed8aff5ef4c0048c747caaecaeed5c143a31.
---
 .../src/metabase/shared/util/namespaces.clj   | 61 +++----------------
 .../metabase/shared/util/namespaces_test.cljc | 39 ------------
 2 files changed, 7 insertions(+), 93 deletions(-)
 delete mode 100644 shared/test/metabase/shared/util/namespaces_test.cljc

diff --git a/shared/src/metabase/shared/util/namespaces.clj b/shared/src/metabase/shared/util/namespaces.clj
index 52e2f4f2d54..5e2e0869db3 100644
--- a/shared/src/metabase/shared/util/namespaces.clj
+++ b/shared/src/metabase/shared/util/namespaces.clj
@@ -1,59 +1,12 @@
 (ns metabase.shared.util.namespaces
   "Potemkin is Java-only, so here's a basic function-importing macro that works for both CLJS and CLJ."
   (:require
-   [net.cgrand.macrovich :as macros]
-   [potemkin :as p]))
+    [net.cgrand.macrovich :as macros]
+    [potemkin :as p]))
 
-(defn- arity-form
-  "Generate the form for a given arity with `arglist` for a `defn` form created by [[-redef]]."
-  [imported-symbol arglist]
-  (let [variadic?          (some (partial = '&) arglist)
-        simplified-arglist (mapv (fn [arg]
-                                   (if (symbol? arg)
-                                     arg
-                                     (gensym "arg-")))
-                                 arglist)]
-    (list simplified-arglist
-          (cond->> (list* imported-symbol (remove (partial = '&) simplified-arglist))
-            variadic? (cons 'apply)))))
-
-(defn- defn-form
-  "Generate the `defn` form for [[-redef]]."
-  [imported-symbol defn-name docstring arglists]
-  `(defn ~defn-name
-     ~docstring
-     ;; ClojureScript seems to ignore this metadata anyway, oh well. Make sure we re-quote arglists so the reader
-     ;; doesn't try to evaluate them.
-     {:arglists '~arglists}
-     ~@(for [arglist arglists]
-         (arity-form imported-symbol arglist))))
-
-(defmacro -redef
-  "Impl for [[import-fn]] and [[import-fns]]."
-  [imported-symbol created-symbol]
-  {:pre [(qualified-symbol? imported-symbol)
-         ((some-fn nil? simple-symbol?) created-symbol)]}
-  ;; In ClojureScript compilation, `imported-symbol` will come in like `u/format-seconds` instead of
-  ;; `metabase.util/format-seconds`, thus we'll need to use [[cljs.analyzer/resolve-symbol]] to resolve it to the real
-  ;; unaliased version.
-  (let [resolve-symbol    (macros/case
-                            :cljs (requiring-resolve 'cljs.analyzer/resolve-symbol)
-                            :clj  identity)
-        imported-var      (requiring-resolve (resolve-symbol imported-symbol))
-        imported-metadata (meta imported-var)
-        metadata          (merge
-                           {:doc      "docstring"
-                            :arglists '([& args])}
-                           ;; preserve important metadata from the imported var.
-                           imported-metadata
-                           ;; preserve metadata attached to the symbol(s) passed in to import-fn(s).
-                           (meta created-symbol)
-                           (meta imported-symbol))
-        defn-name         (-> (or created-symbol (symbol (name imported-symbol)))
-                              ;; attach everything except for `:doc` and `:arglists` to the symbol we're deffing; we'll
-                              ;; deal with `:doc` and `:arglists` separately.
-                              (with-meta (dissoc metadata :doc :arglists)))]
-    (defn-form imported-symbol defn-name (:doc metadata) (:arglists metadata))))
+(defn- redef [target sym]
+  (let [defn-name (or sym (symbol (name target)))]
+    `(def ~defn-name "docstring" (fn [& args#] (apply ~target args#)))))
 
 (defmacro import-fn
   "Imports a single defn from another namespace.
@@ -64,7 +17,7 @@
   ([target]
    `(import-fn ~target nil))
   ([target sym]
-   `(-redef ~target ~sym)))
+   (redef target sym)))
 
 (defmacro import-fns
   "Imports defns from other namespaces.
@@ -79,5 +32,5 @@
                      :let [target-sym (if (vector? f) (first f)  f)
                            new-sym    (if (vector? f) (second f) f)
                            target     (symbol (name target-ns) (name target-sym))]]
-                 `(-redef ~target ~new-sym)))
+                 (redef target new-sym)))
     :clj  `(p/import-vars ~@spaces)))
diff --git a/shared/test/metabase/shared/util/namespaces_test.cljc b/shared/test/metabase/shared/util/namespaces_test.cljc
deleted file mode 100644
index 54983b53f82..00000000000
--- a/shared/test/metabase/shared/util/namespaces_test.cljc
+++ /dev/null
@@ -1,39 +0,0 @@
-(ns metabase.shared.util.namespaces-test
-  (:require
-   [clojure.test :refer [deftest is testing are]]
-   [metabase.shared.formatting.date :as shared.formatting.date]
-   [metabase.shared.util.namespaces :as shared.ns]))
-
-#?(:clj
-   (deftest ^:synchronized arity-form-test
-     (with-redefs [gensym (fn [prefix]
-                            (symbol (str prefix "1234")))]
-       (are [arglist expected-form] (= expected-form
-                                       (#'shared.ns/arity-form 'imported/fn arglist))
-         '[x]
-         '([x]
-           (imported/fn x))
-
-         '[x y]
-         '([x y]
-           (imported/fn x y))
-
-         '[{:destructured :map} x]
-         '([arg-1234 x]
-           (imported/fn arg-1234 x))
-
-         '[x & more]
-         '([x & more]
-           (apply imported/fn x more))))))
-
-;;; this is just an arbitrarily selected function that has `:export` metadata; we can change it to something else if
-;;; it changes upstream.
-(shared.ns/import-fn ^::extra-key shared.formatting.date/format-for-parameter)
-
-(deftest ^:parallel import-fn-test
-  (testing "Should copy important metadata from the source var"
-    (is (:export (meta #'format-for-parameter)))
-    (is (= (select-keys (meta #'shared.formatting.date/format-for-parameter) [:export :arglists :doc])
-           (select-keys (meta #'format-for-parameter) [:export :arglists :doc]))))
-  (testing "Should preserve metadata on the symbol(s) passed to import-fn(s)"
-    (is (::extra-key (meta #'format-for-parameter)))))
-- 
GitLab