Skip to content

Commit 109f7c3

Browse files
committed
make check syntax investigate more identifiers
Specifically identifiers that it finds inside origin fields are treated as if they themselves were in the original program, so their orgin fields (etc) are all checked
1 parent 6377a30 commit 109f7c3

File tree

2 files changed

+74
-19
lines changed

2 files changed

+74
-19
lines changed

drracket-tool-test/tests/check-syntax/syncheck-direct.rkt

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,55 @@
517517
'((66 77) (92 95)) ;; sketchy; should we eliminate?
518518
'((85 88) (92 95))))
519519

520+
(let ()
521+
(define prefix
522+
(string-append
523+
"#lang racket/base\n"
524+
"(require (for-syntax racket/base))\n"
525+
"(define-syntax (m stx)\n"
526+
" (syntax-case stx ()\n"
527+
" [(_ x y)\n"
528+
" (syntax-property\n"
529+
" #'(void)\n"
530+
" 'disappeared-use\n"
531+
" (syntax-property\n"
532+
" (syntax-local-introduce #'x)\n"
533+
" 'disappeared-use\n"
534+
" (syntax-local-introduce #'y)))]))\n"))
535+
536+
;; drop all the arrows in the prefix, and
537+
;; adjust the arrows after the prefix to
538+
;; treat the end of the prefix as position 0.
539+
(define (remove-prefix set)
540+
(define new-set
541+
542+
(for/set ([e (in-set set)])
543+
(define new
544+
(match e
545+
[(list (list start-left start-right)
546+
(list end-left end-right))
547+
(list (list (- start-left (string-length prefix))
548+
(- start-right (string-length prefix)))
549+
(list (- end-left (string-length prefix))
550+
(- end-right (string-length prefix))))]))
551+
(and (0 . <= . (list-ref (list-ref new 0) 0))
552+
(0 . <= . (list-ref (list-ref new 0) 0))
553+
new)))
554+
(set-remove new-set #f))
555+
556+
(check-equal?
557+
(remove-prefix
558+
(get-binding-arrows
559+
(string-append
560+
prefix
561+
"\n"
562+
"(define f 1)\n"
563+
"(define g 1)\n"
564+
"(m f g)\n")))
565+
(set '((9 10) (30 31))
566+
'((22 23) (32 33)))))
567+
568+
520569
;
521570
;
522571
;

drracket-tool-text-lib/drracket/private/syncheck/traversals.rkt

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -265,20 +265,22 @@
265265
(+ level level-of-enclosing-module))]
266266
[binders (lookup-phase-to-mapping phase-to-binders
267267
(+ level level-of-enclosing-module))]
268-
[tops (lookup-phase-to-mapping phase-to-tops (+ level level-of-enclosing-module))]
269-
[collect-general-info
270-
(λ (stx)
271-
(add-origins stx varrefs level-of-enclosing-module)
272-
(add-disappeared-bindings stx binders sub-identifier-binding-directives varrefs
273-
level level-of-enclosing-module mods)
274-
(add-disappeared-uses stx varrefs sub-identifier-binding-directives
275-
level level-of-enclosing-module mods)
276-
(add-mouse-over-tooltips stx)
277-
(add-sub-range-binders stx
278-
sub-identifier-binding-directives
279-
level
280-
level-of-enclosing-module
281-
mods))])
268+
[tops (lookup-phase-to-mapping phase-to-tops (+ level level-of-enclosing-module))])
269+
270+
(define (collect-general-info stx)
271+
(add-origins stx varrefs level-of-enclosing-module collect-general-info)
272+
(add-disappeared-bindings stx binders sub-identifier-binding-directives varrefs
273+
level level-of-enclosing-module mods
274+
collect-general-info)
275+
(add-disappeared-uses stx varrefs sub-identifier-binding-directives
276+
level level-of-enclosing-module mods
277+
collect-general-info)
278+
(add-mouse-over-tooltips stx)
279+
(add-sub-range-binders stx
280+
sub-identifier-binding-directives
281+
level
282+
level-of-enclosing-module
283+
mods))
282284

283285
(define (collect-nested-general-info stx)
284286
(let loop ([stx stx])
@@ -399,7 +401,7 @@
399401
[(set! var e)
400402
(begin
401403
(annotate-raw-keyword stx-obj varrefs level-of-enclosing-module)
402-
(add-origins (list-ref (syntax->list stx-obj) 1) varrefs level-of-enclosing-module)
404+
(add-origins (list-ref (syntax->list stx-obj) 1) varrefs level-of-enclosing-module collect-general-info)
403405
;; tops are used here because a binding free use of a set!'d variable
404406
;; is treated just the same as (#%top . x).
405407
(add-id varsets (syntax var) level-of-enclosing-module)
@@ -714,7 +716,8 @@
714716
disappeared-uses
715717
level
716718
level-of-enclosing-module
717-
mods)
719+
mods
720+
collect-general-info)
718721
(define prop (syntax-property stx 'disappeared-binding))
719722
(when prop
720723
(let loop ([prop prop])
@@ -723,7 +726,7 @@
723726
(loop (car prop))
724727
(loop (cdr prop))]
725728
[(identifier? prop)
726-
(add-origins prop disappeared-uses level-of-enclosing-module)
729+
(collect-general-info prop)
727730
(add-binders prop
728731
binders
729732
#f
@@ -739,7 +742,8 @@
739742
sub-identifier-binding-directives
740743
level
741744
level-of-enclosing-module
742-
mods)
745+
mods
746+
collect-general-info)
743747
(define prop (syntax-property stx 'disappeared-use))
744748
(when prop
745749
(let loop ([prop prop])
@@ -748,6 +752,7 @@
748752
(loop (car prop))
749753
(loop (cdr prop))]
750754
[(identifier? prop)
755+
(collect-general-info prop)
751756
(add-sub-range-binders prop
752757
sub-identifier-binding-directives
753758
level
@@ -1388,13 +1393,14 @@
13881393
(values cleaned-up-path rkt-submods)))
13891394

13901395
;; add-origins : syntax? id-set exact-integer? -> void
1391-
(define (add-origins stx id-set level-of-enclosing-module)
1396+
(define (add-origins stx id-set level-of-enclosing-module collect-general-info)
13921397
(let loop ([ct (syntax-property stx 'origin)])
13931398
(match ct
13941399
[(cons hd tl)
13951400
(loop hd)
13961401
(loop tl)]
13971402
[(? identifier?)
1403+
(collect-general-info ct)
13981404
(add-id id-set ct level-of-enclosing-module)]
13991405
[_ (void)])))
14001406

0 commit comments

Comments
 (0)