From a80f55946d0f221517bdbe47aa2dc72aab3fc4ba Mon Sep 17 00:00:00 2001 From: Asumu Takikawa Date: Tue, 21 Apr 2015 15:38:32 -0400 Subject: [PATCH] Adjust error messages for : annotation form Print better error messages for expression like (: 2 Zero). Also fix and improve error messages for multiple/missing types. Closes PR 15044 --- typed-racket-lib/typed-racket/base-env/colon.rkt | 11 ++++++----- typed-racket-test/unit-tests/prims-tests.rkt | 10 ++++++++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/typed-racket-lib/typed-racket/base-env/colon.rkt b/typed-racket-lib/typed-racket/base-env/colon.rkt index b14af4bc..a0be55f1 100644 --- a/typed-racket-lib/typed-racket/base-env/colon.rkt +++ b/typed-racket-lib/typed-racket/base-env/colon.rkt @@ -37,7 +37,8 @@ (define-syntax (:-helper stx) (syntax-parse stx - [(_ _ top-level? i:id ty) + [(_ orig-stx top-level? i ty) + #:fail-unless (identifier? #'i) (err #'orig-stx "expected identifier" #'i) (unless (or (syntax-e #'top-level?) (identifier-binding #'i)) (tc-error/stx #'i @@ -47,9 +48,9 @@ (syntax-property (syntax/loc stx (begin (quote (:-internal i ty)) (#%plain-app values))) 'disappeared-use #'i)] - [(_ orig-stx _ i:id x ...) + [(_ orig-stx _ i x ...) + #:fail-unless (identifier? #'i) (err #'orig-stx "expected identifier" #'i) (case (syntax-length #'(x ...)) - [(1) (err #'orig-stx "can only annotate identifiers with types" #'i)] - [(0) (err #'orig-stx "missing type")] - [else (err #'orig-stx "bad syntax (multiple types after identifier)")])])) + [(0) (err #'orig-stx "missing type after identifier")] + [else (err #'orig-stx "too many types after identifier")])])) diff --git a/typed-racket-test/unit-tests/prims-tests.rkt b/typed-racket-test/unit-tests/prims-tests.rkt index 500761fa..1576938c 100644 --- a/typed-racket-test/unit-tests/prims-tests.rkt +++ b/typed-racket-test/unit-tests/prims-tests.rkt @@ -20,10 +20,16 @@ ;; and error checking in primitive macros (define tests (test-suite "Prims tests" + (check-bad (let () (: 2 Zero) 'dummy) + #rx"expected identifier") + (check-bad (let () (: x) 'dummy) + #rx"missing type") + (check-bad (let () (: x Listof Any) 'dummy) + #rx"too many types") (check-bad (let () (: x : Listof Any) 'dummy) - #rx"multiple types") + #rx"too many types") (check-bad (let () (: x : -> String String) 'dummy) - #rx"multiple types") + #rx"too many types") (check-ok (let () (: x : String -> String -> String) (define x 0) 'dummy))))