|
1441 | 1441 | (register-constant! env sym)
|
1442 | 1442 | {:op :const :val sym :env env :form sym :tag 'cljs.core/Keyword})
|
1443 | 1443 |
|
1444 |
| -(defn get-tag [e] |
1445 |
| - (if-some [tag (-> e :form meta :tag)] |
| 1444 | +(defn get-tag [ast] |
| 1445 | + (if-some [tag (-> ast :form meta :tag)] |
1446 | 1446 | tag
|
1447 |
| - (if-some [tag (-> e :tag)] |
| 1447 | + (if-some [tag (-> ast :tag)] |
1448 | 1448 | tag
|
1449 |
| - (-> e :info :tag)))) |
| 1449 | + (-> ast :info :tag)))) |
1450 | 1450 |
|
1451 |
| -(defn find-matching-method [f params] |
| 1451 | +(defn find-matching-method [fn-ast params] |
1452 | 1452 | ;; if local fn, need to look in :info
|
1453 |
| - (let [methods (or (:methods f) (-> f :info :methods)) |
| 1453 | + (let [methods (or (:methods fn-ast) (-> fn-ast :info :methods)) |
1454 | 1454 | c (count params)]
|
1455 | 1455 | (some
|
1456 | 1456 | (fn [m]
|
|
1476 | 1476 |
|
1477 | 1477 | (declare infer-tag)
|
1478 | 1478 |
|
1479 |
| -(defn unwrap-quote [{:keys [op] :as expr}] |
| 1479 | +(defn unwrap-quote [{:keys [op] :as ast}] |
1480 | 1480 | (if #?(:clj (= op :quote)
|
1481 | 1481 | :cljs (keyword-identical? op :quote))
|
1482 |
| - (:expr expr) |
1483 |
| - expr)) |
| 1482 | + (:expr ast) |
| 1483 | + ast)) |
1484 | 1484 |
|
1485 |
| -(defn infer-if [env e] |
1486 |
| - (let [{:keys [op form]} (unwrap-quote (:test e)) |
1487 |
| - then-tag (infer-tag env (:then e))] |
| 1485 | +(defn infer-if [env ast] |
| 1486 | + (let [{:keys [op form]} (unwrap-quote (:test ast)) |
| 1487 | + then-tag (infer-tag env (:then ast))] |
1488 | 1488 | (if (and #?(:clj (= op :const)
|
1489 | 1489 | :cljs (keyword-identical? op :const))
|
1490 | 1490 | (not (nil? form))
|
1491 | 1491 | (not (false? form)))
|
1492 | 1492 | then-tag
|
1493 |
| - (let [else-tag (infer-tag env (:else e))] |
| 1493 | + (let [else-tag (infer-tag env (:else ast))] |
1494 | 1494 | (cond
|
1495 | 1495 | (or #?(:clj (= then-tag else-tag)
|
1496 | 1496 | :cljs (symbol-identical? then-tag else-tag))
|
|
1533 | 1533 | (js-var-fn? fn-ast) 'js
|
1534 | 1534 | :else (when (= 'js (:ns info)) 'js)))
|
1535 | 1535 |
|
1536 |
| -(defn infer-invoke [env {fn-ast :fn :keys [args] :as e}] |
| 1536 | +(defn infer-invoke [env {fn-ast :fn :keys [args] :as ast}] |
1537 | 1537 | (let [me (assoc (find-matching-method fn-ast args) :op :fn-method)]
|
1538 | 1538 | (if-some [ret-tag (infer-tag env me)]
|
1539 | 1539 | ret-tag
|
|
1545 | 1545 | (defn infer-tag
|
1546 | 1546 | "Given env, an analysis environment, and e, an AST node, return the inferred
|
1547 | 1547 | type of the node"
|
1548 |
| - [env e] |
1549 |
| - (if-some [tag (get-tag e)] |
| 1548 | + [env ast] |
| 1549 | + (if-some [tag (get-tag ast)] |
1550 | 1550 | tag
|
1551 |
| - (case (:op e) |
| 1551 | + (case (:op ast) |
1552 | 1552 | :recur impl/IGNORE_SYM
|
1553 | 1553 | :throw impl/IGNORE_SYM
|
1554 |
| - :let (infer-tag env (:body e)) |
1555 |
| - :loop (infer-tag env (:body e)) |
1556 |
| - :do (infer-tag env (:ret e)) |
1557 |
| - :fn-method (infer-tag env (:body e)) |
1558 |
| - :def (infer-tag env (:init e)) |
1559 |
| - :invoke (infer-invoke env e) |
1560 |
| - :if (infer-if env e) |
1561 |
| - :const (case (:form e) |
| 1554 | + :let (infer-tag env (:body ast)) |
| 1555 | + :loop (infer-tag env (:body ast)) |
| 1556 | + :do (infer-tag env (:ret ast)) |
| 1557 | + :fn-method (infer-tag env (:body ast)) |
| 1558 | + :def (infer-tag env (:init ast)) |
| 1559 | + :invoke (infer-invoke env ast) |
| 1560 | + :if (infer-if env ast) |
| 1561 | + :const (case (:form ast) |
1562 | 1562 | true impl/BOOLEAN_SYM
|
1563 | 1563 | false impl/BOOLEAN_SYM
|
1564 | 1564 | impl/ANY_SYM)
|
1565 |
| - :quote (infer-tag env (:expr e)) |
| 1565 | + :quote (infer-tag env (:expr ast)) |
1566 | 1566 | (:var :local :js-var :binding)
|
1567 |
| - (if-some [init (:init e)] |
| 1567 | + (if-some [init (:init ast)] |
1568 | 1568 | (infer-tag env init)
|
1569 |
| - (infer-tag env (:info e))) |
| 1569 | + (infer-tag env (:info ast))) |
1570 | 1570 | (:host-field :host-call)
|
1571 | 1571 | impl/ANY_SYM
|
1572 | 1572 | :js impl/ANY_SYM
|
|
0 commit comments