1#lang racket/base
2(require compiler/compilation-path
3         compiler/private/dep
4         setup/collects)
5
6(provide module-recorded-dependencies)
7
8(define (module-recorded-dependencies path)
9  (define collection-cache (make-hash))
10  (define (module-dependencies path all-deps)
11    (define dep-path (path-add-extension (get-compilation-path path) #".dep"))
12    (define deps (with-handlers ([exn:fail:filesystem? (lambda (exn) #f)]
13                                 [exn:fail:read? (lambda (exn) #f)])
14                   (call-with-input-file* dep-path read)))
15    (for/fold ([all-deps all-deps]) ([dep (in-list (if (and (list? deps)
16                                                            (pair? deps)
17                                                            (pair? (cdr deps))
18                                                            (pair? (cddr deps)))
19                                                       (cdddr deps)
20                                                       '()))])
21      (define p (collects-relative*->path (dep->encoded-path dep) collection-cache))
22      (cond
23        [(hash-ref all-deps p #f) all-deps]
24        [else
25         (define new-deps (hash-set all-deps p #t))
26         (cond
27           [(external-dep? dep) new-deps]
28           [else (module-dependencies p new-deps)])])))
29  (hash-keys (module-dependencies (simplify-path path) #hash())))
30
31(define (get-compilation-path path)
32  (define-values (dir name) (get-compilation-dir+name path))
33  (build-path dir name))
34
35(define (collects-relative*->path p cache)
36  (if (bytes? p)
37      (bytes->path p)
38      (hash-ref! cache p (lambda () (collects-relative->path p)))))
39