|
941 | 941 | [(checked-arrays) sym]) |
942 | 942 | sym)) |
943 | 943 |
|
| 944 | +(defn ns->module-type [ns] |
| 945 | + (cond |
| 946 | + (js-module-exists? ns) :js |
| 947 | + (node-module-dep? ns) :node |
| 948 | + (dep-has-global-exports? ns) :global)) |
| 949 | + |
| 950 | +(defmulti resolve* (fn [sym full-ns current-ns] (ns->module-type full-ns))) |
| 951 | + |
| 952 | +(defmethod resolve* :node |
| 953 | + [sym full-ns current-ns] |
| 954 | + {:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." (name sym))) |
| 955 | + :ns current-ns}) |
| 956 | + |
| 957 | +(defmethod resolve* :global |
| 958 | + [sym full-ns current-ns] |
| 959 | + {:name (symbol (str current-ns) (str (munge-global-export full-ns) "." (name sym))) |
| 960 | + :ns current-ns}) |
| 961 | + |
| 962 | +(defmethod resolve* :default |
| 963 | + [sym full-ns current-ns] |
| 964 | + (merge (gets @env/*compiler* ::namespaces full-ns :defs (symbol (name sym))) |
| 965 | + {:name (symbol (str full-ns) (str (name sym))) |
| 966 | + :ns full-ns})) |
| 967 | + |
| 968 | +(defn required? [ns env] |
| 969 | + (or (contains? (set (vals (gets env :ns :requires))) ns) |
| 970 | + (contains? (set (vals (gets env :ns :uses))) ns))) |
| 971 | + |
| 972 | +(defn invokeable-ns? |
| 973 | + "Returns true if ns is a required namespace and a JavaScript module that |
| 974 | + might be invokeable as a function." |
| 975 | + [ns env] |
| 976 | + (let [ns (resolve-ns-alias env ns)] |
| 977 | + (and (or (js-module-exists? ns) |
| 978 | + (node-module-dep? ns) |
| 979 | + (dep-has-global-exports? ns)) |
| 980 | + (required? ns env)))) |
| 981 | + |
| 982 | +(defn resolve-invokeable-ns [ns current-ns env] |
| 983 | + (let [ns (resolve-ns-alias env ns) |
| 984 | + module-type (ns->module-type ns)] |
| 985 | + (case module-type |
| 986 | + :js {:name (symbol |
| 987 | + (or (gets @env/*compiler* :js-module-index ns) |
| 988 | + (resolve-ns-alias env ns))) |
| 989 | + :ns 'js} |
| 990 | + :node {:name (symbol (str current-ns) |
| 991 | + (munge-node-lib (resolve-ns-alias env ns))) |
| 992 | + :ns current-ns} |
| 993 | + :global {:name (symbol (str current-ns) |
| 994 | + (munge-global-export (resolve-ns-alias env ns))) |
| 995 | + :ns current-ns}))) |
| 996 | + |
944 | 997 | (defn resolve-var |
945 | 998 | "Resolve a var. Accepts a side-effecting confirm fn for producing |
946 | 999 | warnings about unresolved vars." |
|
983 | 1036 | (when (not= current-ns full-ns) |
984 | 1037 | (confirm-ns env full-ns)) |
985 | 1038 | (confirm env full-ns (symbol (name sym)))) |
986 | | - (cond |
987 | | - (node-module-dep? full-ns) |
988 | | - {:name (symbol (str current-ns) |
989 | | - (str (munge-node-lib full-ns) "." (name sym))) |
990 | | - :ns current-ns} |
991 | | - (dep-has-global-exports? full-ns) |
992 | | - {:name (symbol (str current-ns) |
993 | | - (str (munge-global-export full-ns) "." (name sym))) |
994 | | - :ns current-ns} |
995 | | - :else |
996 | | - (merge (gets @env/*compiler* ::namespaces full-ns :defs (symbol (name sym))) |
997 | | - {:name (symbol (str full-ns) (str (name sym))) |
998 | | - :ns full-ns}))) |
| 1039 | + (resolve* sym full-ns current-ns)) |
999 | 1040 |
|
1000 | 1041 | (dotted-symbol? sym) |
1001 | 1042 | (let [idx (.indexOf s ".") |
|
1005 | 1046 | {:name (symbol (str (:name lb)) suffix)} |
1006 | 1047 | (if-some [full-ns (gets @env/*compiler* ::namespaces current-ns :imports prefix)] |
1007 | 1048 | {:name (symbol (str full-ns) suffix)} |
1008 | | - |
1009 | | - ;else |
1010 | 1049 | (if-some [info (gets @env/*compiler* ::namespaces current-ns :defs prefix)] |
1011 | 1050 | (merge info |
1012 | 1051 | {:name (symbol (str current-ns) (str sym)) |
|
1017 | 1056 |
|
1018 | 1057 | (some? (gets @env/*compiler* ::namespaces current-ns :uses sym)) |
1019 | 1058 | (let [full-ns (gets @env/*compiler* ::namespaces current-ns :uses sym)] |
1020 | | - (cond |
1021 | | - (node-module-dep? full-ns) |
1022 | | - {:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." sym)) |
1023 | | - :ns current-ns} |
1024 | | - |
1025 | | - (dep-has-global-exports? full-ns) |
1026 | | - {:name (symbol (str current-ns) (str (munge-global-export full-ns) "." sym)) |
1027 | | - :ns current-ns} |
1028 | | - |
1029 | | - :else |
1030 | | - (merge |
1031 | | - (gets @env/*compiler* ::namespaces full-ns :defs sym) |
1032 | | - {:name (symbol (str full-ns) (str sym)) |
1033 | | - :ns full-ns}))) |
| 1059 | + (resolve* sym full-ns current-ns)) |
1034 | 1060 |
|
1035 | 1061 | (some? (gets @env/*compiler* ::namespaces current-ns :renames sym)) |
1036 | 1062 | (let [qualified-symbol (gets @env/*compiler* ::namespaces current-ns :renames sym) |
1037 | 1063 | full-ns (symbol (namespace qualified-symbol)) |
1038 | 1064 | sym (symbol (name qualified-symbol))] |
1039 | | - (cond |
1040 | | - (node-module-dep? full-ns) |
1041 | | - {:name (symbol (str current-ns) (str (munge-node-lib full-ns) "." sym)) |
1042 | | - :ns current-ns} |
1043 | | - |
1044 | | - (dep-has-global-exports? full-ns) |
1045 | | - {:name (symbol (str current-ns) (str (munge-global-export full-ns) "." sym)) |
1046 | | - :ns current-ns} |
1047 | | - |
1048 | | - :else |
1049 | | - (merge |
1050 | | - (gets @env/*compiler* ::namespaces full-ns :defs sym) |
1051 | | - {:name qualified-symbol |
1052 | | - :ns full-ns}))) |
| 1065 | + (resolve* sym full-ns current-ns)) |
1053 | 1066 |
|
1054 | 1067 | (some? (gets @env/*compiler* ::namespaces current-ns :imports sym)) |
1055 | 1068 | (recur env (gets @env/*compiler* ::namespaces current-ns :imports sym) confirm) |
|
1070 | 1083 | {:name (symbol "cljs.core" (str sym)) |
1071 | 1084 | :ns 'cljs.core})) |
1072 | 1085 |
|
1073 | | - ;; The following three cases support for invoking JS modules that export themselves as function -David |
1074 | | - (and (or (js-module-exists? s) |
1075 | | - (js-module-exists? (resolve-ns-alias env s))) |
1076 | | - (let [full-ns (resolve-ns-alias env s)] |
1077 | | - (or (contains? (set (vals (gets env :ns :requires))) full-ns) |
1078 | | - (contains? (set (vals (gets env :ns :uses))) full-ns)))) |
1079 | | - (let [module (or (gets @env/*compiler* :js-module-index s) |
1080 | | - (resolve-ns-alias env s))] |
1081 | | - {:name (symbol module) |
1082 | | - :ns 'js}) |
1083 | | - |
1084 | | - (and (or (node-module-dep? s) |
1085 | | - (node-module-dep? (resolve-ns-alias env s))) |
1086 | | - (let [full-ns (resolve-ns-alias env s)] |
1087 | | - (or (contains? (set (vals (gets env :ns :requires))) full-ns) |
1088 | | - (contains? (set (vals (gets env :ns :uses))) full-ns)))) |
1089 | | - (let [module (resolve-ns-alias env s)] |
1090 | | - {:name (symbol (str current-ns) (munge-node-lib module)) |
1091 | | - :ns current-ns}) |
1092 | | - |
1093 | | - (and (or (dep-has-global-exports? s) |
1094 | | - (dep-has-global-exports? (resolve-ns-alias env s))) |
1095 | | - (let [full-ns (resolve-ns-alias env s)] |
1096 | | - (or (contains? (set (vals (gets env :ns :requires))) full-ns) |
1097 | | - (contains? (set (vals (gets env :ns :uses))) full-ns)))) |
1098 | | - (let [module (resolve-ns-alias env s)] |
1099 | | - {:name (symbol (str current-ns) (munge-global-export module)) |
1100 | | - :ns current-ns}) |
| 1086 | + (invokeable-ns? s env) |
| 1087 | + (resolve-invokeable-ns s current-ns env) |
1101 | 1088 |
|
1102 | 1089 | :else |
1103 | 1090 | (do |
|
0 commit comments