|
10 | 10 | ;; origin and source fields of an expanded sexp |
11 | 11 | ;; also the 'bound-in-source syntax property |
12 | 12 |
|
13 | | - (define debug-origin |
14 | | - (case-lambda |
15 | | - [(original-object) (debug-origin original-object (expand original-object))] |
16 | | - [(original-object expanded-object) |
17 | | - (define-values (expanded-datum stx-ht) (syntax-object->datum/ht expanded-object)) |
18 | | - |
19 | | - (define output-text (make-object text%)) |
20 | | - (define output-port (make-text-port output-text)) |
21 | | - (define info-text (make-object text%)) |
22 | | - (define info-port (make-text-port info-text)) |
23 | | - |
24 | | - ;; assume that there aren't any eq? sub structures, only eq? flat stuff (symbols, etc) |
25 | | - ;; this is guaranteed by syntax-object->datum/ht |
26 | | - (define range-start-ht (make-hasheq)) |
27 | | - (define range-ht (make-hasheq)) |
28 | | - (define original-output-port (current-output-port)) |
29 | | - (define (range-pretty-print-pre-hook x v) |
30 | | - (hash-set! range-start-ht x (send output-text last-position))) |
31 | | - (define (range-pretty-print-post-hook x v) |
32 | | - (hash-set! range-ht x |
33 | | - (cons |
34 | | - (cons |
35 | | - (hash-ref range-start-ht x) |
36 | | - (send output-text last-position)) |
37 | | - (hash-ref range-ht x (λ () null))))) |
38 | | - |
39 | | - (define (make-modern text) |
40 | | - (send text change-style |
41 | | - (make-object style-delta% 'change-family 'modern) |
42 | | - 0 |
43 | | - (send text last-position))) |
44 | | - |
45 | | - (define dummy |
46 | | - (begin (pretty-print (syntax->datum original-object) output-port) |
47 | | - (newline output-port) |
48 | | - (parameterize ([current-output-port output-port] |
49 | | - [pretty-print-pre-print-hook range-pretty-print-pre-hook] |
50 | | - [pretty-print-post-print-hook range-pretty-print-post-hook] |
51 | | - [pretty-print-columns 30]) |
52 | | - (pretty-print expanded-datum)) |
53 | | - (make-modern output-text))) |
54 | | - |
55 | | - (define ranges |
56 | | - (sort |
57 | | - (apply append (hash-map range-ht (λ (k vs) (map (λ (v) (cons k v)) vs)))) |
58 | | - (λ (x y) |
59 | | - (<= (- (car (cdr x)) (cdr (cdr x))) |
60 | | - (- (car (cdr y)) (cdr (cdr y))))))) |
61 | | - |
62 | | - (define (show-info stx) |
63 | | - (fprintf info-port "datum: ~s\nsource: ~a\nposition: ~s\noffset: ~s\noriginal: ~s\nbound-in-source: ~s\n\n" |
64 | | - (syntax->datum stx) |
65 | | - (syntax-source stx) |
66 | | - (syntax-position stx) |
67 | | - (syntax-span stx) |
68 | | - (syntax-original? stx) |
69 | | - (syntax-property stx 'bound-in-source)) |
70 | | - (let loop ([origin (syntax-property stx 'origin)]) |
71 | | - (cond |
72 | | - [(pair? origin) |
73 | | - (loop (car origin)) |
74 | | - (loop (cdr origin))] |
75 | | - [(syntax? origin) |
76 | | - (display " " info-port) |
77 | | - (display origin info-port) |
78 | | - (newline info-port) |
79 | | - (fprintf info-port |
80 | | - " original? ~a\n datum:\n ~a\n\n" |
81 | | - (and (syntax? origin) (syntax-original? origin)) |
82 | | - (and (syntax? origin) (syntax->datum origin)))] |
83 | | - [else (void)]))) |
84 | | - |
85 | | - (for-each |
86 | | - (λ (range) |
87 | | - (let* ([obj (car range)] |
88 | | - [stx (hash-ref stx-ht obj)] |
89 | | - [start (cadr range)] |
90 | | - [end (cddr range)]) |
91 | | - (when (syntax? stx) |
92 | | - (send output-text set-clickback start end |
93 | | - (λ _ |
94 | | - (send info-text begin-edit-sequence) |
95 | | - (send info-text erase) |
96 | | - (show-info stx) |
97 | | - (make-modern info-text) |
98 | | - (send info-text end-edit-sequence)))))) |
99 | | - ranges) |
100 | | - |
101 | | - (newline output-port) |
102 | | - (newline output-port) |
103 | | - (let ([before (send output-text last-position)]) |
104 | | - (display "all" output-port) |
105 | | - (send output-text set-clickback |
106 | | - before |
107 | | - (send output-text last-position) |
108 | | - (λ _ |
109 | | - (send info-text begin-edit-sequence) |
110 | | - (send info-text erase) |
111 | | - (for-each (λ (rng) |
112 | | - (let ([stx (hash-ref stx-ht (car rng))]) |
113 | | - (when (syntax? stx) |
114 | | - (show-info stx)))) |
115 | | - ranges) |
116 | | - (make-modern info-text) |
117 | | - (send info-text end-edit-sequence)))) |
118 | | - |
119 | | - (let () |
120 | | - (define f (make-object frame% "Syntax 'origin Browser" #f 600 300)) |
121 | | - (define p (make-object horizontal-panel% f)) |
122 | | - (make-object editor-canvas% p output-text) |
123 | | - (make-object editor-canvas% p info-text) |
124 | | - (send f show #t))])) |
| 13 | + (define (debug-origin original-object [expanded-object (expand original-object)]) |
| 14 | + (define-values (expanded-datum stx-ht) (syntax-object->datum/ht expanded-object)) |
| 15 | + |
| 16 | + (define output-text (make-object text%)) |
| 17 | + (define output-port (make-text-port output-text)) |
| 18 | + (define info-text (make-object text%)) |
| 19 | + (define info-port (make-text-port info-text)) |
| 20 | + |
| 21 | + ;; assume that there aren't any eq? sub structures, only eq? flat stuff (symbols, etc) |
| 22 | + ;; this is guaranteed by syntax-object->datum/ht |
| 23 | + (define range-start-ht (make-hasheq)) |
| 24 | + (define range-ht (make-hasheq)) |
| 25 | + (define original-output-port (current-output-port)) |
| 26 | + (define (range-pretty-print-pre-hook x v) |
| 27 | + (hash-set! range-start-ht x (send output-text last-position))) |
| 28 | + (define (range-pretty-print-post-hook x v) |
| 29 | + (hash-set! range-ht |
| 30 | + x |
| 31 | + (cons (cons (hash-ref range-start-ht x) (send output-text last-position)) |
| 32 | + (hash-ref range-ht x (λ () null))))) |
| 33 | + |
| 34 | + (define (make-modern text) |
| 35 | + (send text change-style |
| 36 | + (make-object style-delta% 'change-family 'modern) |
| 37 | + 0 |
| 38 | + (send text last-position))) |
| 39 | + |
| 40 | + (define dummy |
| 41 | + (begin |
| 42 | + (pretty-print (syntax->datum original-object) output-port) |
| 43 | + (newline output-port) |
| 44 | + (parameterize ([current-output-port output-port] |
| 45 | + [pretty-print-pre-print-hook range-pretty-print-pre-hook] |
| 46 | + [pretty-print-post-print-hook range-pretty-print-post-hook] |
| 47 | + [pretty-print-columns 30]) |
| 48 | + (pretty-print expanded-datum)) |
| 49 | + (make-modern output-text))) |
| 50 | + |
| 51 | + (define ranges |
| 52 | + (sort (apply append (hash-map range-ht (λ (k vs) (map (λ (v) (cons k v)) vs)))) |
| 53 | + (λ (x y) (<= (- (car (cdr x)) (cdr (cdr x))) (- (car (cdr y)) (cdr (cdr y))))))) |
| 54 | + |
| 55 | + (define (show-info stx) |
| 56 | + (fprintf |
| 57 | + info-port |
| 58 | + "datum: ~s\nsource: ~a\nposition: ~s\noffset: ~s\noriginal: ~s\nbound-in-source: ~s\n\n" |
| 59 | + (syntax->datum stx) |
| 60 | + (syntax-source stx) |
| 61 | + (syntax-position stx) |
| 62 | + (syntax-span stx) |
| 63 | + (syntax-original? stx) |
| 64 | + (syntax-property stx 'bound-in-source)) |
| 65 | + (let loop ([origin (syntax-property stx 'origin)]) |
| 66 | + (cond |
| 67 | + [(pair? origin) |
| 68 | + (loop (car origin)) |
| 69 | + (loop (cdr origin))] |
| 70 | + [(syntax? origin) |
| 71 | + (display " " info-port) |
| 72 | + (display origin info-port) |
| 73 | + (newline info-port) |
| 74 | + (fprintf info-port |
| 75 | + " original? ~a\n datum:\n ~a\n\n" |
| 76 | + (and (syntax? origin) (syntax-original? origin)) |
| 77 | + (and (syntax? origin) (syntax->datum origin)))] |
| 78 | + [else (void)]))) |
| 79 | + |
| 80 | + (for-each (λ (range) |
| 81 | + (let* ([obj (car range)] |
| 82 | + [stx (hash-ref stx-ht obj)] |
| 83 | + [start (cadr range)] |
| 84 | + [end (cddr range)]) |
| 85 | + (when (syntax? stx) |
| 86 | + (send output-text set-clickback |
| 87 | + start |
| 88 | + end |
| 89 | + (λ _ |
| 90 | + (send info-text begin-edit-sequence) |
| 91 | + (send info-text erase) |
| 92 | + (show-info stx) |
| 93 | + (make-modern info-text) |
| 94 | + (send info-text end-edit-sequence)))))) |
| 95 | + ranges) |
| 96 | + |
| 97 | + (newline output-port) |
| 98 | + (newline output-port) |
| 99 | + (let ([before (send output-text last-position)]) |
| 100 | + (display "all" output-port) |
| 101 | + (send output-text set-clickback |
| 102 | + before |
| 103 | + (send output-text last-position) |
| 104 | + (λ _ |
| 105 | + (send info-text begin-edit-sequence) |
| 106 | + (send info-text erase) |
| 107 | + (for-each (λ (rng) |
| 108 | + (let ([stx (hash-ref stx-ht (car rng))]) |
| 109 | + (when (syntax? stx) |
| 110 | + (show-info stx)))) |
| 111 | + ranges) |
| 112 | + (make-modern info-text) |
| 113 | + (send info-text end-edit-sequence)))) |
| 114 | + |
| 115 | + (let () |
| 116 | + (define f (make-object frame% "Syntax 'origin Browser" #f 600 300)) |
| 117 | + (define p (make-object horizontal-panel% f)) |
| 118 | + (make-object editor-canvas% p output-text) |
| 119 | + (make-object editor-canvas% p info-text) |
| 120 | + (send f show #t))) |
125 | 121 |
|
126 | 122 | ;; build-ht : stx -> hash-table |
127 | 123 | ;; the resulting hash-table maps from the each sub-object's to its syntax. |
|
0 commit comments