|
14 | 14 | "../utils/prefab.rkt" |
15 | 15 | "../utils/identifier.rkt" |
16 | 16 |
|
| 17 | + "../private/user-defined-type-constr.rkt" |
| 18 | + |
17 | 19 | "../env/type-name-env.rkt" |
18 | 20 | "../env/row-constraint-env.rkt" |
19 | 21 | "../env/lexical-env.rkt" |
| 22 | + "../env/type-constr-env.rkt" |
20 | 23 |
|
21 | 24 | "../rep/core-rep.rkt" |
22 | 25 | "../rep/rep-utils.rkt" |
|
412 | 415 | ;; Key with (cons name 'app) instead of just name because the |
413 | 416 | ;; application of the Name is not necessarily the same as the |
414 | 417 | ;; 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*))])] |
426 | 437 | ;; Implicit recursive aliases |
427 | 438 | [(Name: name-id args #f) |
428 | 439 | (cond [;; recursive references are looked up in a special table |
|
0 commit comments