diff --git a/typed-racket-lib/typed-racket/typecheck/def-export.rkt b/typed-racket-lib/typed-racket/typecheck/def-export.rkt index 7197e7ac..02511d58 100644 --- a/typed-racket-lib/typed-racket/typecheck/def-export.rkt +++ b/typed-racket-lib/typed-racket/typecheck/def-export.rkt @@ -9,8 +9,5 @@ (define-syntax (def-export stx) (syntax-parse stx [(def-export export-id:identifier id:identifier cnt-id:identifier) - #'(define-syntax export-id - (let ([c #'cnt-id]) - (if (unbox typed-context?) - (renamer #'id c) - (renamer c))))])) + #'(define-syntax export-id (typed-renaming (syntax-property #'id 'not-free-identifier=? #t) + (syntax-property #'cnt-id 'not-free-identifier=? #t)))])) diff --git a/typed-racket-lib/typed-racket/typecheck/renamer.rkt b/typed-racket-lib/typed-racket/typecheck/renamer.rkt index e33b2b20..157620d4 100644 --- a/typed-racket-lib/typed-racket/typecheck/renamer.rkt +++ b/typed-racket-lib/typed-racket/typecheck/renamer.rkt @@ -1,16 +1,24 @@ #lang racket/base -(provide renamer un-rename) +(require typed-racket/utils/tc-utils) + +(provide typed-renaming un-rename) ;; target : identifier ;; alternate : identifier (define-struct typed-renaming (target alternate) - #:property prop:rename-transformer 0) - -(define (renamer id [alt #f]) - (if alt - (make-typed-renaming (syntax-property id 'not-free-identifier=? #t) alt) - (make-rename-transformer (syntax-property id 'not-free-identifier=? #t)))) + ;; prevent the rename transformer from expanding in + ;; module-begin context because the typed context flag + ;; will not be set until the module-begin + #:property prop:expansion-contexts + '(expression top-level module definition-context) + ;; delay the rename transformer target selection until + ;; expansion time when the typed context flag is set correctly + #:property prop:rename-transformer + (λ (obj) + (if (unbox typed-context?) + (typed-renaming-target obj) + (typed-renaming-alternate obj)))) ;; Undo renaming for type lookup. ;; Used because of macros that mark the identifier used as the binding such as diff --git a/typed-racket-test/succeed/gh-issue-163-1.rkt b/typed-racket-test/succeed/gh-issue-163-1.rkt new file mode 100644 index 00000000..f7f084ec --- /dev/null +++ b/typed-racket-test/succeed/gh-issue-163-1.rkt @@ -0,0 +1,18 @@ +#lang typed/racket + +;; Test for GH issue 163 + +(: bar (case→ (→ 'a True) (→ 'b False))) +(define (bar x) (if (eq? x 'a) #t #f)) + +(module m typed/racket + (: foo (case→ (→ 'a True) (→ 'b False))) + (define (foo x) (if (eq? x 'a) #t #f)) + + (provide foo)) + +(require 'm) + +(module+ test + (define b bar) + (define f foo)) diff --git a/typed-racket-test/succeed/gh-issue-163-2.rkt b/typed-racket-test/succeed/gh-issue-163-2.rkt new file mode 100644 index 00000000..13f04d60 --- /dev/null +++ b/typed-racket-test/succeed/gh-issue-163-2.rkt @@ -0,0 +1,9 @@ +#lang racket + +(module m typed/racket/base + (define x 1) + (provide x)) + +(module n typed/racket/base + (require (submod ".." m)) + (module* a #f x)) diff --git a/typed-racket-test/succeed/gh-issue-181.rkt b/typed-racket-test/succeed/gh-issue-181.rkt new file mode 100644 index 00000000..79db25ad --- /dev/null +++ b/typed-racket-test/succeed/gh-issue-181.rkt @@ -0,0 +1,16 @@ +#lang typed/racket + +;; Test case for GH issue #181 + +(module m1 typed/racket + (provide bar) + (define-syntax-rule (bar) 42)) + +(module m2 typed/racket + (require typed/racket + (submod ".." m1)) + (provide (all-from-out typed/racket) + bar)) + +(module m3 (submod ".." m2) + (bar))