|
672 | 672 |
|
673 | 673 | (declare static-body?)
|
674 | 674 |
|
| 675 | +(defn- static-form? [&env form] |
| 676 | + (static-body? &env [form])) |
| 677 | + |
675 | 678 | (defn- static-endpoint? [&env form]
|
676 | 679 | (and (seq? form)
|
677 | 680 | (boolean
|
|
785 | 788 | (when (symbol? sym)
|
786 | 789 | (let [v (resolve &env sym)]
|
787 | 790 | (when (or (= #'when v)
|
| 791 | + (= #'cond v) |
788 | 792 | (= #'= v)
|
789 | 793 | (= #'not= v)
|
| 794 | + (= #'boolean v) |
790 | 795 | (= sym 'if))
|
791 | 796 | (static-body? &env (next form)))))))))
|
792 | 797 |
|
| 798 | +(defn- var-form? [&env form] |
| 799 | + (boolean |
| 800 | + (or (and (seq? form) |
| 801 | + (= 2 (count form)) |
| 802 | + (= 'var (first form))) |
| 803 | + (when (symbol? form) |
| 804 | + (var? (resolve &env form)))))) |
| 805 | + |
| 806 | +(defn- static-expansion? [&env form] |
| 807 | + (boolean |
| 808 | + (when (and (seq? form) |
| 809 | + (symbol? (first form)) |
| 810 | + (not (contains? &env (first form)))) |
| 811 | + (let [form' (macroexpand-1 form)] |
| 812 | + (when-not (identical? form' form) |
| 813 | + (static-form? &env form')))))) |
| 814 | + |
| 815 | +(defn- constant-form? [&env form] |
| 816 | + (or ((some-fn nil? keyword? number? boolean?) form) |
| 817 | + (and (seq? form) |
| 818 | + (= 2 (count form)) |
| 819 | + (= 'quote (first form))))) |
| 820 | + |
| 821 | +(defn- static-binder? [&env bv] |
| 822 | + (and (vector? bv) |
| 823 | + (even? (count bv)) |
| 824 | + (every? (fn [[_ init]] |
| 825 | + (static-body? &env init)) |
| 826 | + (partition 2 bv)))) |
| 827 | + |
| 828 | +(defn- static-let? [&env body] |
| 829 | + (and (seq? body) |
| 830 | + (symbol? (first body)) |
| 831 | + (or (= 'let* (first body)) |
| 832 | + (let [v (resolve &env (first body))] |
| 833 | + (when (var? v) |
| 834 | + (contains? |
| 835 | + '#{clojure.core/let compojure.api.sweet/let-routes compojure.api.core/let-routes} |
| 836 | + (symbol v))))) |
| 837 | + (let [[_ bv & body] body] |
| 838 | + (and (static-binder? &env bv) |
| 839 | + (static-body? &env body))))) |
| 840 | + |
| 841 | +(defn- static-vector? [&env body] |
| 842 | + (and (vector? body) |
| 843 | + (every? #(static-body? &env %) body))) |
| 844 | + |
793 | 845 | (defn- static-body? [&env body]
|
794 | 846 | (every? #(or (static-endpoint? &env %)
|
795 | 847 | (contains? &env %) ;;local
|
796 |
| - (when (symbol? %) |
797 |
| - (var? (resolve &env %))) ;;var deref |
798 |
| - ((some-fn keyword? number? boolean?) %) |
| 848 | + (var-form? &env %) |
| 849 | + (constant-form? &env %) |
| 850 | + (static-let? &env %) |
799 | 851 | (static-cond? &env %)
|
800 | 852 | (static-context? &env %)
|
801 | 853 | (static-middleware? &env %)
|
802 |
| - (static-route-middleware? &env %)) |
| 854 | + (static-route-middleware? &env %) |
| 855 | + (static-expansion? &env %)) |
803 | 856 | body))
|
804 | 857 |
|
805 | 858 | (defn restructure [method [path route-arg & args] {:keys [context? &form &env]}]
|
|
0 commit comments