A bundle is closed-world — everything it needs is inlined and nothing is required afterward — so a user defn unreachable from the entry's reference graph can be dropped. The bundler now computes reachability from main-ns/-main plus every non-prunable form and drops dead defn/defn- by exact source span (formatting and reader macros in the surviving code are untouched). Conservative and sound: only plain defn/defn- are prunable; a defn is kept if its bare or ns-qualified name appears in any kept form, the closure runs to a fixpoint, and any use of resolve/ns-resolve/requiring-resolve/find-var/intern/ eval/load-string disables pruning entirely. A parse failure on any file also falls back to verbatim bundling, so the command stays as robust as a plain concatenation. defmethod/defrecord/extend bodies are non-prunable and scanned, so a fn reached only via dynamic dispatch stays live. New reader/parse-all-spans returns [form start end] byte offsets so the drop is a verbatim slice, not a re-print. 30-fn library used by a 3-fn entry: bundle 1114 -> 437 bytes (61% smaller, 27 dead fns dropped), output byte-identical. Co-authored-by: Yogthos <yogthos@gmail.com> |
||
|---|---|---|
| .. | ||
| bench | ||
| clojure-stdlib/clojure | ||
| integration | ||
| spec | ||
| support | ||
| unit | ||