@@ -27,40 +27,39 @@ to delegate to the scheme-lexer (in the 'no-lang-line mode).
27
27
28
28
|#
29
29
30
-
31
- (define (do-module-lexer* in offset mode filter-lexer)
30
+ ( struct before-lang-line (racket-lexer-mode) #:prefab )
31
+ (define (do-module-lexer* in offset mode can-return-attribs-hash? filter-lexer)
32
32
(cond
33
- [(or (not mode) (eq? mode ' before-lang-line ))
33
+ [(or (not mode) (before-lang-line? mode ))
34
34
(define lexer-port (peeking-input-port in #:init-position (+ 1 (file-position in))))
35
35
(let-values ([(line col pos) (port-next-location in)])
36
36
(when line
37
37
(port-count-lines! lexer-port)))
38
38
(set-port-next-location-from in lexer-port)
39
- (define-values (lexeme type data new-token-start new-token-end) (racket-lexer lexer-port))
39
+ (define-values (lexeme type data new-token-start new-token-end backup new-mode)
40
+ (racket-lexer* lexer-port offset
41
+ (if (before-lang-line? mode)
42
+ (before-lang-line-racket-lexer-mode mode)
43
+ #f )))
44
+ (define the-type (if (symbol? type) type (hash-ref type 'type )))
45
+ (define is-a-comment-type? (or (equal? the-type 'comment ) (equal? the-type 'white-space ) (equal? the-type 'sexp-comment )))
40
46
(cond
41
- [(equal? type 'sexp-comment )
42
- (define position-before-read (file-position lexer-port))
43
- (define read-succeeded?
44
- (with-handlers ([exn:fail:read? (λ (x) #f )])
45
- (read lexer-port)
46
- #t ))
47
- (cond
48
- [read-succeeded?
49
- ;; sync ports
50
- (for/list ([i (in-range (file-position in) (file-position lexer-port))])
51
- (read-byte-or-special in))
52
- (define-values (_1 _2 new-token-end) (port-next-location in))
53
- (values lexeme type data new-token-start new-token-end 0 'before-lang-line )]
54
- [else
55
- (copy-port in (open-output-nowhere))
56
- (define-values (_1 _2 end) (port-next-location in))
57
- (values "#; " 'error #f new-token-start end 0 'before-lang-line )])]
58
- [(or (eq? type 'comment ) (eq? type 'white-space ))
47
+ [(or is-a-comment-type? (and (hash? type) (hash-ref type 'comment? #f )))
59
48
(define lexer-end (file-position lexer-port))
60
49
;; sync ports
61
50
(for/list ([i (in-range (file-position in) (file-position lexer-port))])
62
51
(read-byte-or-special in))
63
- (values lexeme type data new-token-start new-token-end 0 'before-lang-line )]
52
+ (values lexeme
53
+ (cond
54
+ [can-return-attribs-hash?
55
+ type]
56
+ [is-a-comment-type?
57
+ the-type]
58
+ [(and (hash? type) (equal? (hash-ref type 'type ) 'error ))
59
+ 'error ]
60
+ [else
61
+ 'comment ])
62
+ data new-token-start new-token-end backup (before-lang-line new-mode))]
64
63
[else
65
64
;; look for #lang:
66
65
(define p (peeking-input-port in #:init-position (+ 1 (file-position in))))
@@ -107,7 +106,8 @@ to delegate to the scheme-lexer (in the 'no-lang-line mode).
107
106
(cons the-lexer #f )
108
107
the-lexer))]
109
108
110
- [(and (eq? type 'other )
109
+ [(and (or (equal? type 'other )
110
+ (and (hash? type) (equal? (hash-ref type 'type ) 'other )))
111
111
(string? lexeme)
112
112
;; the read-language docs say that this is all it takes to commit to a #lang
113
113
(regexp-match #rx"^#[!l] " lexeme))
@@ -118,46 +118,52 @@ to delegate to the scheme-lexer (in the 'no-lang-line mode).
118
118
[else
119
119
(for ([i (in-range (file-position in) (file-position lexer-port))])
120
120
(read-byte-or-special in))
121
- (values lexeme type data new-token-start new-token-end 0 'no-lang-line )])])]
121
+ (values lexeme
122
+ (if can-return-attribs-hash? type (attribs->symbol type))
123
+ data new-token-start new-token-end 0 'no-lang-line )])])]
122
124
[(eq? mode 'no-lang-line )
123
125
(let-values ([(lexeme type data new-token-start new-token-end)
124
126
(racket-lexer in)])
125
127
(values lexeme type data new-token-start new-token-end 0 'no-lang-line ))]
126
128
[(pair? mode)
127
129
;; #lang-selected language consumes and produces a mode:
128
- (let-values ([(lexeme type data new-token-start new-token-end backup-delta new-mode)
130
+ (let-values ([(lexeme type data new-token-start new-token-end backup-delta new-mode)
129
131
((car mode) in offset (cdr mode))])
130
- (values lexeme type data new-token-start new-token-end backup-delta
132
+ (values lexeme
133
+ (if can-return-attribs-hash? type (attribs->symbol type))
134
+ data new-token-start new-token-end backup-delta
131
135
(if (dont-stop? new-mode)
132
136
(dont-stop (cons (car mode) (dont-stop-val new-mode)))
133
137
(cons (car mode) new-mode))))]
134
138
[else
135
139
;; #lang-selected language (or default) doesn't deal with modes:
136
140
(let-values ([(lexeme type data new-token-start new-token-end)
137
141
(mode in)])
138
- (values lexeme type data new-token-start new-token-end 0 mode))]))
142
+ (values lexeme
143
+ (if can-return-attribs-hash? type (attribs->symbol type))
144
+ data new-token-start new-token-end 0 mode))]))
145
+
146
+ (define (attribs->symbol type)
147
+ (if (hash? type)
148
+ (hash-ref type 'type 'unknown )
149
+ type))
139
150
140
151
(define (module-lexer* in offset mode)
141
- (do-module-lexer* in offset mode (lambda (lexer) lexer)))
152
+ (do-module-lexer* in offset mode #t (lambda (lexer) lexer)))
142
153
143
154
(define (module-lexer in offset mode)
144
- (define (attribs->symbol type)
145
- (if (hash? type)
146
- (hash-ref type 'type 'unknown )
147
- type))
148
- (define-values (lexeme type data start end backup new-mode)
149
- (do-module-lexer* in offset mode (lambda (lexer)
150
- (cond
151
- [(eq? lexer racket-lexer*) racket-lexer]
152
- [(not (procedure-arity-includes? lexer 3 )) lexer]
153
- [else
154
- (procedure-rename
155
- (lambda (in offset mode)
156
- (define-values (lexeme type data start end backup new-mode)
157
- (lexer in offset mode))
158
- (values lexeme (attribs->symbol type) data start end backup new-mode))
159
- (object-name lexer))]))))
160
- (values lexeme (attribs->symbol type) data start end backup new-mode))
155
+ (do-module-lexer* in offset mode #f
156
+ (lambda (lexer)
157
+ (cond
158
+ [(eq? lexer racket-lexer*) racket-lexer]
159
+ [(not (procedure-arity-includes? lexer 3 )) lexer]
160
+ [else
161
+ (procedure-rename
162
+ (lambda (in offset mode)
163
+ (define-values (lexeme type data start end backup new-mode)
164
+ (lexer in offset mode))
165
+ (values lexeme (attribs->symbol type) data start end backup new-mode))
166
+ (object-name lexer))]))))
161
167
162
168
(define (set-port-next-location-from src dest)
163
169
(define-values (line col pos) (port-next-location src))
0 commit comments