A first pass
This commit is contained in:
parent
e8dd8c9c60
commit
10efdac497
3
Makefile
3
Makefile
|
@ -1,2 +1,5 @@
|
|||
all:
|
||||
raco setup --check-pkg-deps cover && raco test . && raco cover -b .
|
||||
|
||||
debug:
|
||||
raco setup cover && raco test . && raco cover -vb .
|
||||
|
|
|
@ -183,6 +183,7 @@ in "coverage.rkt". This raw coverage information is converted to a usable form b
|
|||
(define (load-annotate-top)
|
||||
(make-annotate-top (load-raw-coverage) (load-cover-name)))
|
||||
|
||||
|
||||
(define (get-raw-coverage)
|
||||
(get-val environment-raw-cover))
|
||||
(define (load-raw-coverage)
|
||||
|
@ -217,7 +218,8 @@ in "coverage.rkt". This raw coverage information is converted to a usable form b
|
|||
|
||||
;; filtered : (listof (list boolean srcloc))
|
||||
;; remove redundant expressions
|
||||
(define filtered (hash-map (get-raw-coverage) (λ (k v) (list v (apply make-srcloc k)))))
|
||||
(define filtered (hash-map (get-raw-coverage)
|
||||
(λ (k v) (list (unbox v) (apply make-srcloc k)))))
|
||||
|
||||
(define out (make-hash))
|
||||
|
||||
|
|
78
strace.rkt
78
strace.rkt
|
@ -3,24 +3,22 @@
|
|||
(require errortrace/stacktrace
|
||||
racket/function
|
||||
racket/syntax
|
||||
syntax/parse
|
||||
racket/unit
|
||||
syntax/kerncase
|
||||
racket/runtime-path
|
||||
racket/fixnum
|
||||
"private/file-utils.rkt"
|
||||
"private/shared.rkt")
|
||||
|
||||
(define (make-annotate-top c cover-name)
|
||||
(define (initialize-test-coverage-point stx)
|
||||
(define srcloc (stx->srcloc stx))
|
||||
(when srcloc
|
||||
(hash-set! c srcloc #f)))
|
||||
(define (with-mark src dest phase) dest)
|
||||
(define test-coverage-enabled (make-parameter #t))
|
||||
|
||||
(define (test-covered stx)
|
||||
(with-syntax ([c cover-name]
|
||||
[loc (stx->srcloc/stx stx)])
|
||||
#'(#%plain-app hash-set! c loc #t)))
|
||||
(define lift-name #'do-lift)
|
||||
(define set-box-name #'set-box!)
|
||||
(define hash-ref-name #'hash-ref)
|
||||
|
||||
|
||||
(define profile-key (gensym))
|
||||
|
||||
|
@ -28,6 +26,19 @@
|
|||
(define initialize-profile-point void)
|
||||
(define (register-profile-start . a) #f)
|
||||
(define register-profile-done void)
|
||||
(define (initialize-test-coverage-point stx)
|
||||
(define srcloc (stx->srcloc stx))
|
||||
(when srcloc
|
||||
(hash-set! c srcloc (box #f))))
|
||||
|
||||
(define (test-covered stx)
|
||||
(define loc/stx (stx->srcloc/stx stx))
|
||||
(with-syntax ([c cover-name]
|
||||
[loc loc/stx]
|
||||
[set-box! set-box-name]
|
||||
[hash-ref hash-ref-name]
|
||||
[do-lift lift-name])
|
||||
#`(set-box! (do-lift (hash-ref c loc)) #t)))
|
||||
|
||||
|
||||
(define (make-srcloc-maker f)
|
||||
|
@ -54,10 +65,21 @@
|
|||
[span span])
|
||||
#'(quote (src a b pos span))))))
|
||||
|
||||
(define o (current-output-port))
|
||||
(define (in:annotate-top annotate-top)
|
||||
(lambda (stx phase)
|
||||
(define e (add-cover-require stx))
|
||||
(if e (annotate-clean (annotate-top e phase)) stx)))
|
||||
(let ([tmp (if e (expand-syntax (annotate-clean (annotate-top (expand-syntax e) phase))) stx)])
|
||||
#;
|
||||
(when (equal? (string->path "/Users/florence/playground/cover/private/format-utils.rkt") (syntax-source e))
|
||||
(define ce (dynamic-require 'racket/gui 'current-eventspace))
|
||||
(define me (dynamic-require 'racket/gui 'make-eventspace))
|
||||
(parameterize ([ce (me)])
|
||||
(thread (lambda () ((dynamic-require 'macro-debugger/syntax-browser 'browse-syntax) tmp))))
|
||||
(let loop () (loop)))
|
||||
; (write (syntax-source e) o)
|
||||
; (displayln "")
|
||||
tmp)))
|
||||
|
||||
(define (add-cover-require expr)
|
||||
(define inspector (variable-reference->module-declaration-inspector
|
||||
|
@ -69,7 +91,10 @@
|
|||
(member '(#%declare #:cross-phase-persistent) (syntax->datum #'(e ...)))
|
||||
#f]
|
||||
[(module name lang mb)
|
||||
(with-syntax ([cover cover-name])
|
||||
(with-syntax ([cover cover-name]
|
||||
[set-box set-box-name]
|
||||
[hash-rf hash-ref-name]
|
||||
[do-lift lift-name])
|
||||
(syntax-case (syntax-disarm #'mb inspector) ()
|
||||
[(#%module-begin b ...)
|
||||
(with-syntax ([(body ...)
|
||||
|
@ -77,24 +102,35 @@
|
|||
(syntax-rearm
|
||||
(namespace-syntax-introduce
|
||||
(datum->syntax
|
||||
expr
|
||||
disarmed
|
||||
(syntax-e
|
||||
#'(module name lang
|
||||
(#%module-begin
|
||||
(#%require (rename cover/coverage cover coverage))
|
||||
body ...)))
|
||||
expr expr))
|
||||
#'(m name lang
|
||||
(#%module-begin
|
||||
(#%require (rename cover/coverage cover coverage)
|
||||
(rename '#%kernel set-box set-box!)
|
||||
(rename '#%kernel hash-rf hash-ref))
|
||||
(#%require (for-syntax '#%kernel))
|
||||
(define-syntaxes (do-lift)
|
||||
(lambda (stx)
|
||||
(syntax-local-lift-expression (cadr (syntax-e stx)))))
|
||||
body ...)))
|
||||
disarmed
|
||||
disarmed))
|
||||
expr))]))]
|
||||
[_ (if top #f expr)])))
|
||||
|
||||
;; in order to write modules to disk the top level needs to
|
||||
;; be a module. so we trust that the module is loaded and trim the expression
|
||||
(define (annotate-clean e)
|
||||
(kernel-syntax-case e #f
|
||||
[(begin e mod)
|
||||
(eval #'e)
|
||||
#'mod]
|
||||
[_ e]))
|
||||
(kernel-syntax-case e #f
|
||||
[(begin e mod)
|
||||
(begin
|
||||
(syntax-case #'e (set-box! do-lift make-srcloc hash-ref)
|
||||
[(set-box! (lift (hash-ref _ (make-srcloc v ...))) _)
|
||||
(let ([location (apply make-srcloc (syntax->datum #'(v ...)))])
|
||||
(set-box! (hash-ref c location) #t))])
|
||||
#'mod)]
|
||||
[_ e]))
|
||||
|
||||
(define-values/invoke-unit/infer stacktrace@)
|
||||
(in:annotate-top annotate-top))
|
||||
|
|
Loading…
Reference in New Issue
Block a user