diff --git a/pkgs/racket-test/tests/stxparse/test-exp.rkt b/pkgs/racket-test/tests/stxparse/test-exp.rkt index 5558b6feab..2136ffdf18 100644 --- a/pkgs/racket-test/tests/stxparse/test-exp.rkt +++ b/pkgs/racket-test/tests/stxparse/test-exp.rkt @@ -79,6 +79,18 @@ (s= ((x.c1 x.c2) ...) '((2 3) (4 5))))) (terx (#:c 1 2) ((~eh-var x extopts) ...) #rx"missing required occurrence of A option") + + ;; from Alexis King (#2551) (3/2019) + (let () + (define-eh-alternative-set opts + [pattern {~optional {~seq #:foo foo:expr}}]) + (test-exn "eh-alts no spurious description" + (lambda (e) + (and (regexp-match? #rx"expected more terms" (exn-message e)) + (not (regexp-match? #rx"eh-alt-parser" (exn-message e))))) + (lambda () + (syntax-parse #'(use-opts #:foo) + [(_ {~eh-var o opts} ...) 'ok])))) ) (require 'eh-alts) diff --git a/racket/collects/syntax/parse/private/parse.rkt b/racket/collects/syntax/parse/private/parse.rkt index f66d6f5d69..d81a2a96c2 100644 --- a/racket/collects/syntax/parse/private/parse.rkt +++ b/racket/collects/syntax/parse/private/parse.rkt @@ -54,11 +54,11 @@ (let-values ([(name formals arity) (let ([p (check-stxclass-header #'header stx)]) (values (car p) (cadr p) (caddr p)))]) - (let ([the-rhs (parse-rhs #'rhss splicing? #:context stx)]) + (let ([the-rhs (parse-rhs #'rhss splicing? #:context stx + #:default-description (symbol->string (syntax-e name)))]) (with-syntax ([name name] [formals formals] - [desc (cond [(rhs-description the-rhs) => constant-desc] - [else (symbol->string (syntax-e name))])] + [desc (cond [(rhs-description the-rhs) => constant-desc] [else #f])] [parser (generate-temporary (format-symbol "parse-~a" name))] [arity arity] [attrs (rhs-attrs the-rhs)] @@ -155,7 +155,7 @@ (with-syntax ([formals* formals*] [(def ...) defs] [((vdef ...) ...) vdefss] - [description (or description (symbol->string (syntax-e name)))] + [description description] [transparent? transparent?] [delimit-cut? delimit-cut?] [body body]) diff --git a/racket/collects/syntax/parse/private/rep.rkt b/racket/collects/syntax/parse/private/rep.rkt index 130bcabe4c..3a1196b3db 100644 --- a/racket/collects/syntax/parse/private/rep.rkt +++ b/racket/collects/syntax/parse/private/rep.rkt @@ -29,9 +29,9 @@ (-> syntax? boolean?)] [parse-rhs - (-> syntax? boolean? - #:context (or/c false/c syntax?) - rhs?)] + (->* [syntax? boolean? #:context (or/c false/c syntax?)] + [#:default-description (or/c #f string?)] + rhs?)] [parse-pattern+sides (-> syntax? syntax? #:splicing? boolean? @@ -178,8 +178,8 @@ ;; --- -;; parse-rhs : Syntax Boolean #:context Syntax -> RHS -(define (parse-rhs stx splicing? #:context ctx) +;; parse-rhs : Syntax Boolean #:context Syntax #:default-description (U String #f) -> RHS +(define (parse-rhs stx splicing? #:context ctx #:default-description [default-description #f]) (call/txlifts (lambda () (parameterize ((current-syntax-context ctx)) @@ -194,7 +194,7 @@ (or attributes (filter (lambda (a) (symbol-interned? (attr-name a))) (intersect-sattrss (map variant-attrs variants))))) - (make rhs sattrs transp? description variants + (make rhs sattrs transp? (or description #`(quote #,default-description)) variants (append (get-txlifts-as-definitions) defs) commit? delimit-cut?)))))