racket/collects/macro-debugger/analysis/check-requires-script.rkt
2011-06-01 14:32:21 -04:00

76 lines
2.1 KiB
Racket

#lang racket/base
(require racket/match
racket/cmdline
syntax/modresolve
"check-requires.rkt")
#|
See comments in check-requires.rkt for what this analysis does and
how to interpret the results.
Example (from racket root directory):
racket -l macro-debugger/analysis/check-requires-script \
collects/syntax/*.rkt
|#
;; Configuration
;; show-keep? : (parameterof bool)
;; Show KEEP messages in output.
(define show-keep? (make-parameter #f))
;; show-bypass? : (parameterof bool)
;; Show BYPASS messages in output.
(define show-bypass? (make-parameter #f))
;; ========
(define (go mod)
(printf "~s:\n" mod)
(with-handlers ([exn:fail?
(lambda (exn)
(printf "ERROR in ~s\n" mod)
((error-display-handler) (exn-message exn) exn)
(newline))])
(let ([recs (check-requires mod)])
(for ([rec recs])
(match rec
[(list 'keep mpi phase comment)
(when (show-keep?)
(printf "KEEP ~a at ~a~a\n"
(mpi->key mpi) phase
(if comment (format " (~a)" comment) "")))]
[(list 'bypass mpi phase)
(when (show-bypass?)
(printf "BYPASS ~a at ~a\n" (mpi->key mpi) phase))]
[(list 'drop mpi phase)
(printf "DROP ~a at ~a\n" (mpi->key mpi) phase)]))))
(newline))
;; Command-line args are interpreted as files if the file exists,
;; module names otherwise.
(command-line
#:once-each
[("--show-keep")
"Show KEEP recommendations"
(show-keep? #t)]
[("--show-bypass")
"Show BYPASS recommendations"
(show-bypass? #t)]
[("--ignore-disappeared-use")
"Ignore 'disappeared-use syntax property"
(add-disappeared-uses? #f)]
#:args args
(for ([arg (in-list args)])
(cond [(file-exists? arg)
(go `(file ,arg))]
[else
(let* ([inport (open-input-string arg)]
[mod (read inport)])
(unless (eof-object? (peek-char inport))
(error "bad module name:" arg))
(go mod))])))