From 519dfb6fdcb8ffad1ad45b67f6095e40b8ee9845 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Tue, 15 Dec 2015 20:29:58 -0500 Subject: [PATCH] Handle `Sequenceof` in the type parser to support multiple values. --- typed-racket-lib/typed-racket/base-env/base-types-extra.rkt | 2 +- typed-racket-lib/typed-racket/base-env/base-types.rkt | 1 - typed-racket-lib/typed-racket/private/parse-type.rkt | 3 +++ typed-racket-test/unit-tests/parse-type-tests.rkt | 1 + typed-racket-test/unit-tests/typecheck-tests.rkt | 3 +++ 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt b/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt index 4fdbb90b..12863d55 100644 --- a/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt @@ -17,7 +17,7 @@ (define-other-types -> ->* case-> U Rec All Opaque Vector Parameterof List List* Class Object Unit Values AnyValues Instance Refinement - pred Struct Struct-Type Prefab Top Bot Distinction) + pred Struct Struct-Type Prefab Top Bot Distinction Sequenceof) (provide (rename-out [All ∀] [U Un] diff --git a/typed-racket-lib/typed-racket/base-env/base-types.rkt b/typed-racket-lib/typed-racket/base-env/base-types.rkt index 71451a05..a82b6fcd 100644 --- a/typed-racket-lib/typed-racket/base-env/base-types.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-types.rkt @@ -187,7 +187,6 @@ [Pairof (-poly (a b) (-pair a b))] [MPairof (-poly (a b) (-mpair a b))] [MListof (-poly (a) (-mlst a))] -[Sequenceof (-poly (a) (-seq a))] [Thread-Cellof (-poly (a) (-thread-cell a))] [Custodian-Boxof (-poly (a) (make-CustodianBox a))] diff --git a/typed-racket-lib/typed-racket/private/parse-type.rkt b/typed-racket-lib/typed-racket/private/parse-type.rkt index 458ef284..208b2739 100644 --- a/typed-racket-lib/typed-racket/private/parse-type.rkt +++ b/typed-racket-lib/typed-racket/private/parse-type.rkt @@ -108,6 +108,7 @@ (define-literal-syntax-class #:for-label Top) (define-literal-syntax-class #:for-label Bot) (define-literal-syntax-class #:for-label Distinction) +(define-literal-syntax-class #:for-label Sequenceof) ;; (Syntax -> Type) -> Syntax Any -> Syntax ;; See `parse-type/id`. This is a curried generalization. @@ -483,6 +484,8 @@ #:stx stx (~a (syntax-e #'p) " expects one or two type arguments, given " (sub1 (length (syntax->list #'(args ...))))))] + [(:Sequenceof^ t ...) + (apply -seq (parse-types #'(t ...)))] ;; curried function notation [((~and dom:non-keyword-ty (~not :->^)) ... :->^ diff --git a/typed-racket-test/unit-tests/parse-type-tests.rkt b/typed-racket-test/unit-tests/parse-type-tests.rkt index 881ab828..7c2ec486 100644 --- a/typed-racket-test/unit-tests/parse-type-tests.rkt +++ b/typed-racket-test/unit-tests/parse-type-tests.rkt @@ -402,6 +402,7 @@ [FAIL (Unit (init-depend) String)] [FAIL (Unit (import bad) (export) String)] [FAIL (Unit (import) (export bad) String)] + [(Sequenceof Any Any) (-seq Univ Univ)] )) ;; FIXME - add tests for parse-values-type, parse-tc-results diff --git a/typed-racket-test/unit-tests/typecheck-tests.rkt b/typed-racket-test/unit-tests/typecheck-tests.rkt index f02d90d4..0589bc1b 100644 --- a/typed-racket-test/unit-tests/typecheck-tests.rkt +++ b/typed-racket-test/unit-tests/typecheck-tests.rkt @@ -3835,6 +3835,9 @@ [tc-e (for*/fold: ((xs : (Listof Symbol) '())) ((x '(a b c))) (cons x xs)) (-lst -Symbol)] + + [tc-e (ann (in-hash (hash)) (Sequenceof Any Any)) + (-seq Univ Univ)] ) (test-suite