diff --git a/src/squint/compiler.cljc b/src/squint/compiler.cljc index 5dc31544..278bee34 100644 --- a/src/squint/compiler.cljc +++ b/src/squint/compiler.cljc @@ -424,13 +424,7 @@ (let [next-t (-> (transpile-form next-form env) not-empty) next-js - (if (re-matches #"^(/\*|//|\"|\').*" (str next-t)) - (let [js (str next-t "\n")] - (if-let [p (:pragmas env)] - (do (swap! p str js) - nil) - js)) - (statement next-t))] + (cc/save-pragma env next-t)] (recur (str transpiled next-js))))))))) (defn compile-string* @@ -447,7 +441,8 @@ cc/*target* :squint *jsx* false cc/*repl* (:repl opts cc/*repl*)] - (let [opts (merge {:ns-state (atom {})} opts) + (let [opts (merge {:ns-state (atom {}) + :top-level true} opts) imported-vars (atom {}) public-vars (atom #{}) aliases (atom (merge aliases {core-alias cc/*core-package*})) diff --git a/src/squint/compiler_common.cljc b/src/squint/compiler_common.cljc index 98d87975..10ec5bfd 100644 --- a/src/squint/compiler_common.cljc +++ b/src/squint/compiler_common.cljc @@ -282,13 +282,23 @@ (cond-> (format "(%sfunction () {\n %s\n})()" (if *async* "async " "") s) *async* (wrap-await return?)))) +(defn save-pragma [env next-t] + (if (and (:top-level env) + (re-matches #"^(/\*|//|\"|\').*" (str next-t))) + (let [js (str next-t "\n")] + (if-let [p (:pragmas env)] + (do (swap! p str js) + nil) + js)) + (statement next-t))) + (defn emit-do [env exprs] (let [bl (butlast exprs) l (last exprs) ctx (:context env) statement-env (assoc env :context :statement) iife? (and (seq bl) (= :expr ctx)) - s (cond-> (str (str/join "" (map #(statement (emit % statement-env)) bl)) + s (cond-> (str (str/join "" (map #(save-pragma env (emit % statement-env)) bl)) (emit l (assoc env :context (if iife? :return ctx)))) diff --git a/test/squint/compiler_test.cljs b/test/squint/compiler_test.cljs index 2fa87261..f525498e 100644 --- a/test/squint/compiler_test.cljs +++ b/test/squint/compiler_test.cljs @@ -2131,15 +2131,16 @@ new Foo();") (is (eq [1 2 3 4 5 6] (jsv! '(into [] cat [[1 2 3] [4 5 6]]))))) (deftest pragmas-test - (let [{:keys [pragmas javascript]} (compiler/compile-string* " -\"use client\" + (let [code "\"use client\" (js* \"// ts-check\") -(defn foo [] (merge nil nil))")] - (is (str/includes? pragmas "use client")) - (is (str/includes? pragmas "// ts-check")) - (is (not (str/includes? pragmas ";"))) - (is (< (str/index-of javascript "use client") (str/index-of javascript "ts-check"))) - (is (< (str/index-of javascript "ts-check") (str/index-of javascript "import"))))) +(defn foo [] (merge nil nil))"] + (doseq [code [code (str/replace "(do %s)" "%s" code)]] + (let [{:keys [pragmas javascript]} (compiler/compile-string* code)] + (is (str/includes? pragmas "use client")) + (is (str/includes? pragmas "// ts-check")) + (is (not (str/includes? pragmas ";"))) + (is (< (str/index-of javascript "use client") (str/index-of javascript "ts-check"))) + (is (< (str/index-of javascript "ts-check") (str/index-of javascript "import"))))))) (defn init [] (t/run-tests 'squint.compiler-test 'squint.jsx-test 'squint.string-test))