(module tc-utils mzscheme
(provide (all-defined))
(require (lib "list.ss"))
(define current-orig-stx (make-parameter #'here))
(define (find-origin stx)
(cond [(syntax-property stx 'origin) => (lambda (orig)
(let ([r (reverse orig)])
(let loop ([r (reverse orig)])
(if (null? r) #f
(if (syntax-source (car r)) (car r)
(loop (cdr r)))))))]
[else #f]))
(define print-syntax? (make-parameter #t))
(define (tc-error msg . rest)
(define cur-stx (current-orig-stx))
(define new-stx
(cond
[(or (print-syntax?)
(syntax-original? cur-stx)
(identifier? cur-stx))
cur-stx]
[(and (not (syntax-source cur-stx)) (find-origin cur-stx))]
[else (datum->syntax-object cur-stx (syntax-e (or (find-origin cur-stx) #'..)) cur-stx cur-stx)]))
(raise-syntax-error 'typecheck (apply format msg rest) new-stx new-stx))
(define (tc-error/stx stx msg . rest)
(parameterize ([current-orig-stx stx])
(apply tc-error msg rest)))
(define (symbolic-identifier=? a b)
(eq? (syntax-e a) (syntax-e b)))
(define current-type-names (make-parameter (lambda () '())))
(define (lookup-fail e) (tc-error "unbound identifier ~a" e))
(define-struct (exn:fail:tc exn:fail) ())
(define (int-err msg . args)
(raise (make-exn:fail:tc (string-append "Internal Typechecker Error: " (apply format msg args))
(current-continuation-marks))))
(define typed-context? (box #f))
(define type-name-references (make-parameter '()))
(define (add-type-name-reference t)
(type-name-references (cons t (type-name-references))))
)