better checking of case where a local name is used before it is defined (in an int-def context)
svn: r12659
This commit is contained in:
parent
df62fbad79
commit
6e9ccd3f43
|
@ -173,6 +173,20 @@
|
|||
[super-instantiate super-instantiate-param]
|
||||
[super-new super-new-param])
|
||||
|
||||
;;--------------------------------------------------------------------
|
||||
;; local member name lookup
|
||||
;;--------------------------------------------------------------------
|
||||
|
||||
(define-for-syntax (localize orig-id)
|
||||
(do-localize orig-id #'validate-local-member))
|
||||
|
||||
(define (validate-local-member orig s)
|
||||
(if (symbol? s)
|
||||
s
|
||||
(error 'local-member-name
|
||||
"used before its definition: ~a"
|
||||
orig)))
|
||||
|
||||
;;--------------------------------------------------------------------
|
||||
;; class macros
|
||||
;;--------------------------------------------------------------------
|
||||
|
|
|
@ -293,15 +293,17 @@
|
|||
|
||||
(define-struct private-name (orig-id gen-id))
|
||||
|
||||
(define (localize orig-id)
|
||||
(define (do-localize orig-id validate-local-member-stx)
|
||||
(let loop ([id orig-id])
|
||||
(let ([v (syntax-local-value id (lambda () #f))])
|
||||
(cond
|
||||
[(and v (private-name? v))
|
||||
(list 'unquote
|
||||
(binding (private-name-orig-id v)
|
||||
id
|
||||
(private-name-gen-id v)))]
|
||||
(list validate-local-member-stx
|
||||
(list 'quote orig-id)
|
||||
(binding (private-name-orig-id v)
|
||||
id
|
||||
(private-name-gen-id v))))]
|
||||
[(and (set!-transformer? v)
|
||||
(s!t? (set!-transformer-procedure v)))
|
||||
(s!t-ref (set!-transformer-procedure v) 1)]
|
||||
|
@ -353,6 +355,6 @@
|
|||
make-init-error-map make-init-redirect super-error-map
|
||||
make-with-method-map
|
||||
flatten-args make-method-call
|
||||
make-private-name localize
|
||||
do-localize make-private-name
|
||||
generate-super-call generate-inner-call
|
||||
generate-class-expand-context class-top-level-context?)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user