diff --git a/typed-racket-lib/typed-racket/tc-setup.rkt b/typed-racket-lib/typed-racket/tc-setup.rkt index 1c2cebfe..74b91cb1 100644 --- a/typed-racket-lib/typed-racket/tc-setup.rkt +++ b/typed-racket-lib/typed-racket/tc-setup.rkt @@ -76,9 +76,8 @@ (tc-setup orig-stx stx 'top-level local-expand/capture* (kernel-form-identifier-list) (λ (head-expanded-stx) - (parameterize ([orig-module-stx (or (orig-module-stx) orig-stx)]) - (do-time "Trampoline the top-level checker") - (tc-toplevel-start head-expanded-stx))))) + (do-time "Trampoline the top-level checker") + (tc-toplevel-start (or (orig-module-stx) orig-stx) head-expanded-stx)))) (define (tc-module/full orig-stx stx k) (tc-setup orig-stx stx 'module-begin local-expand (list #'module*) diff --git a/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt b/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt index 06898ae0..c4d5eda7 100644 --- a/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt +++ b/typed-racket-lib/typed-racket/typecheck/toplevel-trampoline.rkt @@ -18,15 +18,18 @@ ;; entrypoint for typechecking a top-level interaction ;; this is defined in this module (instead of tc-top-level.rkt) in ;; order to avoid cyclic dependency issues -;; syntax -> syntax -(define (tc-toplevel-start stx) +;; syntax syntax -> syntax +(define (tc-toplevel-start orig-stx stx) (syntax-parse stx #:literal-sets (kernel-literals) ;; Don't open up `begin`s that are supposed to be ignored [(~and (begin e ... e-last) (~not (~or _:ignore^ _:ignore-some^))) - #'(begin (tc-toplevel-trampoline e) ... - (tc-toplevel-trampoline/report e-last))])) + ;; the original syntax is threaded through for error message reporting + ;; later in `trampoline-core` + #`(begin (tc-toplevel-trampoline (quote-syntax #,orig-stx) e) ... + (tc-toplevel-trampoline/report + (quote-syntax #,orig-stx) e-last))])) (module trampolines racket/base (require "../utils/utils.rkt" @@ -56,7 +59,7 @@ (define-for-syntax (trampoline-core stx report? kont) (syntax-parse stx - [(_ e) + [(_ orig-stx e) (define head-expanded (disarm* (local-expand/capture* #'e 'top-level (kernel-form-identifier-list)))) @@ -78,7 +81,8 @@ ;; Unlike the `begin` cases, we probably don't need to trampoline back ;; to the top-level because we're not catching lifts from macros at the ;; top-level context but instead from expression context. - (parameterize ([expanded-module-stx fully-expanded]) + (parameterize ([orig-module-stx #'orig-stx] + [expanded-module-stx fully-expanded]) (syntax-parse fully-expanded #:literal-sets (kernel-literals) [(begin form ...) diff --git a/typed-racket-test/fail/top-level-srcloc.rkt b/typed-racket-test/fail/top-level-srcloc.rkt new file mode 100644 index 00000000..43f0844d --- /dev/null +++ b/typed-racket-test/fail/top-level-srcloc.rkt @@ -0,0 +1,9 @@ +#; +(exn-pred (regexp-quote "in: (apply + (quote foo))")) +#lang racket/load + +;; Test that top-level source locations are recovered in error messages + +(require typed/racket) + +(apply + 'foo)