Skip to content

Commit 20be322

Browse files
committed
contract: repair contract generation for type application
1 parent 1d0e0b0 commit 20be322

File tree

7 files changed

+55
-22
lines changed

7 files changed

+55
-22
lines changed

typed-racket-lib/typed-racket/env/type-alias-helper.rkt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,8 @@
292292
(define res (in-same-component? id x))
293293
res)
294294
type-alias-productivity-map
295-
#:delay-variances? #t))
295+
#:delay-variances? #t
296+
#:recursive? #t))
296297
(register-type-constructor! id ty-op)
297298
(complete-type-alias-registration! id)
298299
(reset-resolver-cache!)

typed-racket-lib/typed-racket/private/parse-type.rkt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@
6666
[parse-type-operator-abstraction (c:->* (identifier? (c:listof identifier?) syntax?)
6767
((c:or/c (c:-> identifier? boolean?) #f)
6868
(free-id-table/c identifier? boolean?)
69-
#:delay-variances? boolean?)
69+
#:delay-variances? boolean?
70+
#:recursive? boolean?)
7071
TypeConstructor?)]
7172
[parse-for-effects (c:-> identifier? (c:cons/c (c:listof identifier?) syntax?)
7273
(values (c:listof identifier?)
@@ -651,7 +652,8 @@
651652
(define (parse-type-operator-abstraction name arg-names stx [opt-in-same-component? #f]
652653
[type-op-productivity-map (make-immutable-free-id-table)]
653654
#:delay-variances?
654-
[delay-variances? #f])
655+
[delay-variances? #f]
656+
#:recursive? [recursive? #f])
655657
(define syms (map syntax-e arg-names))
656658
(define mode (synth-mode name syms opt-in-same-component?))
657659
(define var-kind-level-env
@@ -670,7 +672,7 @@
670672
var-kind-level-env
671673
#:mode mode)))
672674

673-
(make-type-constr (user-defined-type-op syms res)
675+
(make-type-constr (user-defined-type-op syms res recursive?)
674676
(length syms)
675677
(free-id-table-ref type-op-productivity-map name #f)
676678
#:variances

typed-racket-lib/typed-racket/private/type-contract.rkt

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
"../utils/prefab.rkt"
1515
"../utils/identifier.rkt"
1616

17+
"../private/user-defined-type-constr.rkt"
18+
1719
"../env/type-name-env.rkt"
1820
"../env/row-constraint-env.rkt"
1921
"../env/lexical-env.rkt"
22+
"../env/type-constr-env.rkt"
2023

2124
"../rep/core-rep.rkt"
2225
"../rep/rep-utils.rkt"
@@ -412,17 +415,25 @@
412415
;; Key with (cons name 'app) instead of just name because the
413416
;; application of the Name is not necessarily the same as the
414417
;; Name type alone
415-
(cond [(hash-ref recursive-values (cons name 'app) #f)]
416-
[else
417-
(define name* (generate-temporary name))
418-
(recursive-sc (list name*)
419-
(list
420-
(t->sc (resolve-once type)
421-
#:recursive-values
422-
(hash-set recursive-values
423-
(cons name 'app)
424-
(recursive-sc-use name*))))
425-
(recursive-sc-use name*))])]
418+
(define constr (lookup-type-constructor name))
419+
(cond
420+
;; when constr is a built-in or non-recursive user-defined type
421+
;; constructor, don't generate a recursive static contract
422+
;; for the resulting type.
423+
[(not (and (user-defined-type-constr? constr)
424+
(recursive-type-constr? constr)))
425+
(t->sc (resolve-once type))]
426+
[(hash-ref recursive-values (cons name 'app) #f)]
427+
[else
428+
(define name* (generate-temporary name))
429+
(recursive-sc (list name*)
430+
(list
431+
(t->sc (resolve-once type)
432+
#:recursive-values
433+
(hash-set recursive-values
434+
(cons name 'app)
435+
(recursive-sc-use name*))))
436+
(recursive-sc-use name*))])]
426437
;; Implicit recursive aliases
427438
[(Name: name-id args #f)
428439
(cond [;; recursive references are looked up in a special table

typed-racket-lib/typed-racket/private/user-defined-type-constr.rkt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,22 +7,30 @@
77
(subst-all make-simple-substitution)])
88

99
(provide (struct-out user-defined-type-op)
10-
user-defined-type-constr?)
10+
user-defined-type-constr?
11+
recursive-type-constr?)
1112

12-
(struct user-defined-type-op (vars type) #:transparent
13+
(struct user-defined-type-op (vars type recursive?) #:transparent
1314
#:methods gen:type-rep-maker
1415
[(define (gen-create-type-rep me args)
15-
(match-define (user-defined-type-op vars type) me)
16+
(match-define (user-defined-type-op vars type recursive?) me)
1617
(subst-all (make-simple-substitution vars args)
1718
type))
1819
(define (gen-serialize-type-rep me t->s)
19-
(match-define (user-defined-type-op vars type) me)
20+
(match-define (user-defined-type-op vars type recursive?) me)
2021
`(user-defined-type-op (list ,@(for/list ([i (in-list vars)])
2122
`(quote ,i)))
22-
,(t->s type)))])
23+
,(t->s type)
24+
,recursive?))])
2325

2426
(define (user-defined-type-constr? constr-rep)
2527
(match constr-rep
2628
[(struct* TypeConstructor ([real-trep-constr (? user-defined-type-op?)]))
2729
#t]
2830
[_ #f]))
31+
32+
(define (recursive-type-constr? constr)
33+
(match constr
34+
[(struct* TypeConstructor
35+
([real-trep-constr (struct* user-defined-type-op ([recursive? recursive?]))]))
36+
recursive?]))

typed-racket-lib/typed-racket/rep/free-variance.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@
210210
(match-define (struct* TypeConstructor ([real-trep-constr maker]
211211
[variances old-variances]))
212212
constr)
213-
(match-define (struct user-defined-type-op [tvars type]) maker)
213+
(match-define (struct user-defined-type-op [tvars type _]) maker)
214214
(cond
215215
[(or (not tvars) (null? tvars)) #t]
216216
[else

typed-racket-lib/typed-racket/typecheck/tc-structs.rkt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@
233233
(make-Poly (struct-desc-tvars desc) sty))
234234
(unless (empty? (struct-desc-tvars desc))
235235
(define variances (map (lambda _ variance:const) (struct-desc-tvars desc)))
236-
(define ty-op (make-type-constr (user-defined-type-op (struct-desc-tvars desc) sty)
236+
(define ty-op (make-type-constr (user-defined-type-op (struct-desc-tvars desc) sty #f)
237237
(length (struct-desc-tvars desc))
238238
#:variances
239239
variances))
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#lang racket
2+
3+
(module typed typed/racket/base
4+
5+
(define-type (LV a) (Listof a))
6+
(provide make)
7+
(define (make [in : (LV (LV Natural))]) : Void
8+
(void)))
9+
10+
(require 'typed)
11+
(make '((1 1) (2 2) (3 3) (4 4)))

0 commit comments

Comments
 (0)