diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 4420e9d0b..b8c5ae94b 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -5,7 +5,7 @@ jobs: # Runtime Tests runtime-test: name: Runtime Tests - runs-on: macos-14 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -19,50 +19,37 @@ jobs: tools-deps: '1.10.1.763' - name: Cache maven - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-maven with: path: ~/.m2 - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - name: Cache gitlibs - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-gitlibs with: path: ~/.gitlibs - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - # - name: Cache JSC - # uses: actions/cache@v4 - # env: - # cache-name: cache-jsc - # with: - # path: WebKit - # key: ${{ runner.os }}-jsc - # restore-keys: | - # ${{ runner.os }}-jsc - - name: Build tests run: clojure -M:runtime.test.build - # - name: Install JSC - # run: ./ci/install_jsc.sh - - name: Run tests run: | - /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Helpers/jsc builds/out-adv/core-advanced-test.js | tee test-out.txt + node builds/out-adv/core-advanced-test.js | tee test-out.txt grep -qxF '0 failures, 0 errors.' test-out.txt # Lite Tests lite-test: name: Lite Tests - runs-on: macos-14 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -76,44 +63,31 @@ jobs: tools-deps: '1.10.1.763' - name: Cache maven - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-maven with: path: ~/.m2 - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - name: Cache gitlibs - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-gitlibs with: path: ~/.gitlibs - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - # - name: Cache JSC - # uses: actions/cache@v4 - # env: - # cache-name: cache-jsc - # with: - # path: WebKit - # key: ${{ runner.os }}-jsc - # restore-keys: | - # ${{ runner.os }}-jsc - - name: Build tests run: clojure -M:lite.test.build - # - name: Install JSC - # run: ./ci/install_jsc.sh - - name: Run tests run: | - /System/Library/Frameworks/JavaScriptCore.framework/Versions/A/Helpers/jsc builds/out-lite/lite-test.js | tee test-out.txt + node builds/out-lite/lite-test.js | tee test-out.txt grep -qxF '0 failures, 0 errors.' test-out.txt # Runtime Tests @@ -145,7 +119,7 @@ jobs: # Self-host Tests self-host-test: name: Self-host Tests - runs-on: macos-14 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -159,22 +133,22 @@ jobs: tools-deps: '1.10.1.763' - name: Cache maven - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-maven with: path: ~/.m2 - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - name: Cache gitlibs - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-gitlibs with: path: ~/.gitlibs - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- @@ -189,7 +163,7 @@ jobs: # Self-parity Tests self-parity-test: name: Self-parity Tests - runs-on: macos-14 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -203,22 +177,22 @@ jobs: tools-deps: '1.10.1.763' - name: Cache maven - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-maven with: path: ~/.m2 - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - name: Cache gitlibs - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-gitlibs with: path: ~/.gitlibs - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- @@ -233,7 +207,7 @@ jobs: # Compiler Tests compiler-test: name: Compiler Tests - runs-on: macos-14 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -247,22 +221,22 @@ jobs: tools-deps: '1.10.1.763' - name: Cache maven - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-maven with: path: ~/.m2 - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - name: Cache gitlibs - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-gitlibs with: path: ~/.gitlibs - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- @@ -292,7 +266,7 @@ jobs: # CLI Tests cli-test: name: CLI Tests - runs-on: macos-14 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 with: @@ -308,22 +282,22 @@ jobs: tools-deps: '1.10.1.763' - name: Cache maven - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-maven with: path: ~/.m2 - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- - name: Cache gitlibs - uses: actions/cache@v4 + uses: actions/cache@v4.2.0 env: cache-name: cache-gitlibs with: path: ~/.gitlibs - key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/deps.edn') }} + key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('deps.edn', '*/deps.edn') }} restore-keys: | ${{ runner.os }}-${{ env.cache-name }}- diff --git a/src/main/clojure/cljs/analyzer.cljc b/src/main/clojure/cljs/analyzer.cljc index aa52f6fc9..91ce2f13e 100644 --- a/src/main/clojure/cljs/analyzer.cljc +++ b/src/main/clojure/cljs/analyzer.cljc @@ -4120,6 +4120,7 @@ (select-keys lb [:name :local :arg-id :variadic? :init]))) (let [sym-meta (meta sym) sym-ns (namespace sym) + sym-name (name sym) cur-ns (str (-> env :ns :name)) ;; when compiling a macros namespace that requires itself, we need ;; to resolve calls to `my-ns.core/foo` to `my-ns.core$macros/foo` @@ -4130,21 +4131,36 @@ (not (gstring/endsWith sym-ns "$macros")) (= sym-ns (subs cur-ns 0 (- (count cur-ns) 7)))) (symbol (str sym-ns "$macros") (name sym)) - sym)]) - info (if-not (contains? sym-meta ::analyzed) + sym)])] + (if (and sym-ns + (nil? (resolve-ns-alias env sym-ns nil)) + (not= ".." sym-name) ;; special case `..` macro in self-hosted + (or (= "new" sym-name) + (string/starts-with? sym-name "."))) + (merge + {:op :qualified-method + :env env + :form sym + :class (symbol sym-ns)} + (if (= "new" sym-name) + {:kind :new + :name (symbol sym-name)} + {:kind :method + :name (symbol (subs sym-name 1))})) + (let [info (if-not (contains? sym-meta ::analyzed) (resolve-existing-var env sym) (resolve-var env sym))] - (assert (:op info) (:op info)) - (desugar-dotted-expr - (if-not (true? (:def-var env)) - (merge - (assoc ret :info info) - (select-keys info [:op :name :ns :tag]) - (when-let [const-expr (:const-expr info)] - {:const-expr const-expr})) - (let [info (resolve-var env sym)] - (merge (assoc ret :op :var :info info) - (select-keys info [:op :name :ns :tag])))))))))) + (assert (:op info) (:op info)) + (desugar-dotted-expr + (if-not (true? (:def-var env)) + (merge + (assoc ret :info info) + (select-keys info [:op :name :ns :tag]) + (when-let [const-expr (:const-expr info)] + {:const-expr const-expr})) + (let [info (resolve-var env sym)] + (merge (assoc ret :op :var :info info) + (select-keys info [:op :name :ns :tag])))))))))))) (defn excluded? #?(:cljs {:tag boolean}) diff --git a/src/main/clojure/cljs/compiler.cljc b/src/main/clojure/cljs/compiler.cljc index 8a17d17d2..a791cc2ba 100644 --- a/src/main/clojure/cljs/compiler.cljc +++ b/src/main/clojure/cljs/compiler.cljc @@ -1301,6 +1301,14 @@ (comma-sep args) "))"))) +(defmethod emit* :qualified-method + [{ctor :class :keys [args env kind name]}] + (if (= :new kind) + (emit-wrap env + (emits "(function (...args) { return Reflect.construct(" ctor ", args) })")) + (emit-wrap env + (emits "(function (x, ...args) { return Reflect.apply(" ctor ".prototype." name ", x, args) })")))) + (defmethod emit* :set! [{:keys [target val env]}] (emit-wrap env (emits "(" target " = " val ")")))