|
13 | 13 | [cljs.env :as env] |
14 | 14 | [cljs.analyzer :as a] |
15 | 15 | [cljs.analyzer.api :as ana-api] |
| 16 | + [cljs.compiler :as comp] |
16 | 17 | [cljs.closure :as closure] |
17 | 18 | [cljs.externs :as externs] |
18 | 19 | [cljs.analyzer :as ana]) |
|
854 | 855 | )))) |
855 | 856 | ) |
856 | 857 |
|
857 | | -(comment |
858 | | - (require '[cljs.compiler :as cc]) |
859 | | - (require '[cljs.closure :as closure]) |
860 | | - |
| 858 | +(deftest test-basic-infer |
861 | 859 | (let [test-cenv (atom {::a/externs (externs/externs-map)})] |
862 | 860 | (binding [a/*cljs-ns* a/*cljs-ns* |
863 | | - a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)] |
| 861 | + a/*cljs-warnings* (assoc a/*cljs-warnings* |
| 862 | + :infer-warning true |
| 863 | + :undeclared-var false)] |
864 | 864 | (e/with-compiler-env test-cenv |
865 | 865 | (a/analyze-form-seq |
866 | 866 | '[(ns foo.core) |
|
871 | 871 | (.apply (.-log js/console) js/console (into-array args))) |
872 | 872 | (js/console.log js/Number.MAX_VALUE) |
873 | 873 | (js/console.log js/Symbol.iterator)]) |
874 | | - (cc/emit-externs |
875 | | - (reduce util/map-merge {} |
876 | | - (map (comp :externs second) |
877 | | - (get @test-cenv ::a/namespaces))))))) |
878 | | - |
| 874 | + (is (= "var React;\nReact.Component;\n" |
| 875 | + (with-out-str |
| 876 | + (comp/emit-externs |
| 877 | + (reduce util/map-merge {} |
| 878 | + (map (comp :externs second) |
| 879 | + (get @test-cenv ::a/namespaces))))))))))) |
| 880 | + |
| 881 | +(deftest test-method-infer |
879 | 882 | (let [test-cenv (atom {::a/externs (externs/externs-map)})] |
880 | 883 | (binding [a/*cljs-ns* a/*cljs-ns* |
881 | 884 | a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)] |
882 | 885 | (e/with-compiler-env test-cenv |
883 | 886 | (a/analyze-form-seq |
884 | 887 | '[(defn foo [^js/React.Component c] |
885 | 888 | (.render c))]) |
886 | | - (cc/emit-externs |
887 | | - (reduce util/map-merge {} |
888 | | - (map (comp :externs second) |
889 | | - (get @test-cenv ::a/namespaces))))))) |
890 | | - |
891 | | - ;; works, does not generate extern |
| 889 | + (is (= "var React;\nReact.Component;\nReact.Component.prototype.render;\n" |
| 890 | + (with-out-str |
| 891 | + (comp/emit-externs |
| 892 | + (reduce util/map-merge {} |
| 893 | + (map (comp :externs second) |
| 894 | + (get @test-cenv ::a/namespaces))))))))))) |
| 895 | + |
| 896 | +(deftest test-minimal-infer |
892 | 897 | (let [test-cenv (atom {::a/externs (externs/externs-map |
893 | 898 | (closure/load-externs |
894 | 899 | {:externs ["src/test/externs/test.js"]}))})] |
|
897 | 902 | (e/with-compiler-env test-cenv |
898 | 903 | (a/analyze-form-seq |
899 | 904 | '[(js/console.log (.wozMethod (js/baz)))]) |
900 | | - (cc/emit-externs |
901 | | - (reduce util/map-merge {} |
902 | | - (map (comp :externs second) |
903 | | - (get @test-cenv ::a/namespaces))))))) |
904 | | - |
905 | | - ;; works, does not generate extern |
| 905 | + (is (= "" |
| 906 | + (with-out-str |
| 907 | + (comp/emit-externs |
| 908 | + (reduce util/map-merge {} |
| 909 | + (map (comp :externs second) |
| 910 | + (get @test-cenv ::a/namespaces))))))))))) |
| 911 | + |
| 912 | +(deftest test-type-hint-minimal-infer |
906 | 913 | (let [test-cenv (atom {::a/externs (externs/externs-map |
907 | 914 | (closure/load-externs |
908 | 915 | {:externs ["src/test/externs/test.js"]}))})] |
|
912 | 919 | (a/analyze-form-seq |
913 | 920 | '[(defn afun [^js/Foo x] |
914 | 921 | (.wozMethod x))]) |
915 | | - (cc/emit-externs |
916 | | - (reduce util/map-merge {} |
917 | | - (map (comp :externs second) |
918 | | - (get @test-cenv ::a/namespaces))))))) |
| 922 | + (is (= "" |
| 923 | + (with-out-str |
| 924 | + (comp/emit-externs |
| 925 | + (reduce util/map-merge {} |
| 926 | + (map (comp :externs second) |
| 927 | + (get @test-cenv ::a/namespaces))))))))))) |
| 928 | + |
| 929 | +(deftest test-type-hint-minimal-infer-unknown-method |
| 930 | + (let [test-cenv (atom {::a/externs (externs/externs-map |
| 931 | + (closure/load-externs |
| 932 | + {:externs ["src/test/externs/test.js"]}))})] |
| 933 | + (binding [a/*cljs-ns* a/*cljs-ns* |
| 934 | + a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)] |
| 935 | + (e/with-compiler-env test-cenv |
| 936 | + (a/analyze-form-seq |
| 937 | + '[(defn baz [^js/Foo a] |
| 938 | + (.gozMethod a))]) |
| 939 | + (is (= "Foo.prototype.gozMethod;\n" |
| 940 | + (with-out-str |
| 941 | + (comp/emit-externs |
| 942 | + (reduce util/map-merge {} |
| 943 | + (map (comp :externs second) |
| 944 | + (get @test-cenv ::a/namespaces))))))))))) |
| 945 | + |
| 946 | +(comment |
| 947 | + (require '[cljs.compiler :as cc]) |
| 948 | + (require '[cljs.closure :as closure]) |
919 | 949 |
|
920 | 950 | ;; FIXME: generates externs we know about including the one we don't |
921 | 951 | (let [test-cenv (atom {::a/externs (externs/externs-map |
|
0 commit comments