7
7
class RDoc ::Parser ::RipperStateLex
8
8
# :stopdoc:
9
9
10
- # TODO: Remove this constants after Ruby 2.4 EOL
11
- RIPPER_HAS_LEX_STATE = Ripper ::Filter . method_defined? ( :state )
12
-
13
10
Token = Struct . new ( :line_no , :char_no , :kind , :text , :state )
14
11
15
- EXPR_NONE = 0
16
- EXPR_BEG = 1
17
- EXPR_END = 2
18
- EXPR_ENDARG = 4
19
- EXPR_ENDFN = 8
20
- EXPR_ARG = 16
21
- EXPR_CMDARG = 32
22
- EXPR_MID = 64
23
- EXPR_FNAME = 128
24
- EXPR_DOT = 256
25
- EXPR_CLASS = 512
26
- EXPR_LABEL = 1024
27
- EXPR_LABELED = 2048
28
- EXPR_FITEM = 4096
29
- EXPR_VALUE = EXPR_BEG
30
- EXPR_BEG_ANY = ( EXPR_BEG | EXPR_MID | EXPR_CLASS )
31
- EXPR_ARG_ANY = ( EXPR_ARG | EXPR_CMDARG )
32
- EXPR_END_ANY = ( EXPR_END | EXPR_ENDARG | EXPR_ENDFN )
33
-
34
- class InnerStateLex < Ripper ::Filter
35
- attr_accessor :lex_state
36
-
37
- def initialize ( code )
38
- @lex_state = EXPR_BEG
39
- @in_fname = false
40
- @continue = false
41
- reset
42
- super ( code )
43
- end
44
-
45
- def reset
46
- @command_start = false
47
- @cmd_state = @command_start
48
- end
49
-
50
- def on_nl ( tok , data )
51
- case @lex_state
52
- when EXPR_FNAME , EXPR_DOT
53
- @continue = true
54
- else
55
- @continue = false
56
- @lex_state = EXPR_BEG unless ( EXPR_LABEL & @lex_state ) != 0
57
- end
58
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
59
- end
60
-
61
- def on_ignored_nl ( tok , data )
62
- case @lex_state
63
- when EXPR_FNAME , EXPR_DOT
64
- @continue = true
65
- else
66
- @continue = false
67
- @lex_state = EXPR_BEG unless ( EXPR_LABEL & @lex_state ) != 0
68
- end
69
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
70
- end
71
-
72
- def on_op ( tok , data )
73
- case tok
74
- when '&' , '|' , '!' , '!=' , '!~'
75
- case @lex_state
76
- when EXPR_FNAME , EXPR_DOT
77
- @lex_state = EXPR_ARG
78
- else
79
- @lex_state = EXPR_BEG
80
- end
81
- when '<<'
82
- # TODO next token?
83
- case @lex_state
84
- when EXPR_FNAME , EXPR_DOT
85
- @lex_state = EXPR_ARG
86
- else
87
- @lex_state = EXPR_BEG
88
- end
89
- when '?'
90
- @lex_state = EXPR_BEG
91
- when '&&' , '||' , '+=' , '-=' , '*=' , '**=' ,
92
- '&=' , '|=' , '^=' , '<<=' , '>>=' , '||=' , '&&='
93
- @lex_state = EXPR_BEG
94
- when '::'
95
- case @lex_state
96
- when EXPR_ARG , EXPR_CMDARG
97
- @lex_state = EXPR_DOT
98
- when EXPR_FNAME , EXPR_DOT
99
- @lex_state = EXPR_ARG
100
- else
101
- @lex_state = EXPR_BEG
102
- end
103
- else
104
- case @lex_state
105
- when EXPR_FNAME , EXPR_DOT
106
- @lex_state = EXPR_ARG
107
- else
108
- @lex_state = EXPR_BEG
109
- end
110
- end
111
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
112
- end
113
-
114
- def on_kw ( tok , data )
115
- case tok
116
- when 'class'
117
- @lex_state = EXPR_CLASS
118
- @in_fname = true
119
- when 'def'
120
- @lex_state = EXPR_FNAME
121
- @continue = true
122
- @in_fname = true
123
- when 'if' , 'unless' , 'while' , 'until'
124
- if ( ( EXPR_MID | EXPR_END | EXPR_ENDARG | EXPR_ENDFN | EXPR_ARG | EXPR_CMDARG ) & @lex_state ) != 0 # postfix if
125
- @lex_state = EXPR_BEG | EXPR_LABEL
126
- else
127
- @lex_state = EXPR_BEG
128
- end
129
- when 'begin' , 'case' , 'when'
130
- @lex_state = EXPR_BEG
131
- when 'return' , 'break'
132
- @lex_state = EXPR_MID
133
- else
134
- if @lex_state == EXPR_FNAME
135
- @lex_state = EXPR_END
136
- else
137
- @lex_state = EXPR_END
138
- end
139
- end
140
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
141
- end
142
-
143
- def on_tstring_beg ( tok , data )
144
- @lex_state = EXPR_BEG
145
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
146
- end
147
-
148
- def on_tstring_end ( tok , data )
149
- @lex_state = EXPR_END | EXPR_ENDARG
150
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
151
- end
152
-
153
- def on_CHAR ( tok , data )
154
- @lex_state = EXPR_END
155
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
156
- end
157
-
158
- def on_period ( tok , data )
159
- @lex_state = EXPR_DOT
160
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
161
- end
162
-
163
- def on_int ( tok , data )
164
- @lex_state = EXPR_END | EXPR_ENDARG
165
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
166
- end
167
-
168
- def on_float ( tok , data )
169
- @lex_state = EXPR_END | EXPR_ENDARG
170
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
171
- end
172
-
173
- def on_rational ( tok , data )
174
- @lex_state = EXPR_END | EXPR_ENDARG
175
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
176
- end
177
-
178
- def on_imaginary ( tok , data )
179
- @lex_state = EXPR_END | EXPR_ENDARG
180
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
181
- end
182
-
183
- def on_symbeg ( tok , data )
184
- @lex_state = EXPR_FNAME
185
- @continue = true
186
- @in_fname = true
187
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
188
- end
189
-
190
- private def on_variables ( event , tok , data )
191
- if @in_fname
192
- @lex_state = EXPR_ENDFN
193
- @in_fname = false
194
- @continue = false
195
- elsif @continue
196
- case @lex_state
197
- when EXPR_DOT
198
- @lex_state = EXPR_ARG
199
- else
200
- @lex_state = EXPR_ENDFN
201
- @continue = false
202
- end
203
- else
204
- @lex_state = EXPR_CMDARG
205
- end
206
- data << Token . new ( lineno , column , event , tok , @lex_state )
207
- end
208
-
209
- def on_ident ( tok , data )
210
- on_variables ( __method__ , tok , data )
211
- end
212
-
213
- def on_ivar ( tok , data )
214
- @lex_state = EXPR_END
215
- on_variables ( __method__ , tok , data )
216
- end
217
-
218
- def on_cvar ( tok , data )
219
- @lex_state = EXPR_END
220
- on_variables ( __method__ , tok , data )
221
- end
222
-
223
- def on_gvar ( tok , data )
224
- @lex_state = EXPR_END
225
- on_variables ( __method__ , tok , data )
226
- end
227
-
228
- def on_backref ( tok , data )
229
- @lex_state = EXPR_END
230
- on_variables ( __method__ , tok , data )
231
- end
232
-
233
- def on_lparen ( tok , data )
234
- @lex_state = EXPR_LABEL | EXPR_BEG
235
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
236
- end
237
-
238
- def on_rparen ( tok , data )
239
- @lex_state = EXPR_ENDFN
240
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
241
- end
242
-
243
- def on_lbrace ( tok , data )
244
- @lex_state = EXPR_LABEL | EXPR_BEG
245
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
246
- end
247
-
248
- def on_rbrace ( tok , data )
249
- @lex_state = EXPR_ENDARG
250
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
251
- end
252
-
253
- def on_lbracket ( tok , data )
254
- @lex_state = EXPR_LABEL | EXPR_BEG
255
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
256
- end
257
-
258
- def on_rbracket ( tok , data )
259
- @lex_state = EXPR_ENDARG
260
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
261
- end
262
-
263
- def on_const ( tok , data )
264
- case @lex_state
265
- when EXPR_FNAME
266
- @lex_state = EXPR_ENDFN
267
- when EXPR_CLASS , EXPR_CMDARG , EXPR_MID
268
- @lex_state = EXPR_ARG
269
- else
270
- @lex_state = EXPR_CMDARG
271
- end
272
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
273
- end
274
-
275
- def on_sp ( tok , data )
276
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
277
- end
278
-
279
- def on_comma ( tok , data )
280
- @lex_state = EXPR_BEG | EXPR_LABEL if ( EXPR_ARG_ANY & @lex_state ) != 0
281
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
282
- end
283
-
284
- def on_comment ( tok , data )
285
- @lex_state = EXPR_BEG unless ( EXPR_LABEL & @lex_state ) != 0
286
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
287
- end
288
-
289
- def on_ignored_sp ( tok , data )
290
- @lex_state = EXPR_BEG unless ( EXPR_LABEL & @lex_state ) != 0
291
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
292
- end
293
-
294
- def on_heredoc_beg ( tok , data )
295
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
296
- @lex_state = EXPR_END
297
- data
298
- end
299
-
300
- def on_heredoc_end ( tok , data )
301
- data << Token . new ( lineno , column , __method__ , tok , @lex_state )
302
- @lex_state = EXPR_BEG
303
- data
304
- end
305
-
306
- def on_default ( event , tok , data )
307
- reset
308
- data << Token . new ( lineno , column , event , tok , @lex_state )
309
- end
310
- end unless RIPPER_HAS_LEX_STATE
12
+ EXPR_END = Ripper ::EXPR_END
13
+ EXPR_ENDFN = Ripper ::EXPR_ENDFN
14
+ EXPR_ARG = Ripper ::EXPR_ARG
15
+ EXPR_FNAME = Ripper ::EXPR_FNAME
311
16
312
17
class InnerStateLex < Ripper ::Filter
313
18
def initialize ( code )
@@ -317,7 +22,7 @@ def initialize(code)
317
22
def on_default ( event , tok , data )
318
23
data << Token . new ( lineno , column , event , tok , state )
319
24
end
320
- end if RIPPER_HAS_LEX_STATE
25
+ end
321
26
322
27
def get_squashed_tk
323
28
if @buf . empty?
@@ -333,9 +38,8 @@ def get_squashed_tk
333
38
tk = get_string_tk ( tk )
334
39
when :on_backtick then
335
40
if ( tk [ :state ] & ( EXPR_FNAME | EXPR_ENDFN ) ) != 0
336
- @inner_lex . lex_state = EXPR_ARG unless RIPPER_HAS_LEX_STATE
337
41
tk [ :kind ] = :on_ident
338
- tk [ :state ] = Ripper ::Lexer . const_defined? ( :State ) ? Ripper :: Lexer :: State . new ( EXPR_ARG ) : EXPR_ARG
42
+ tk [ :state ] = Ripper ::Lexer :: State . new ( EXPR_ARG )
339
43
else
340
44
tk = get_string_tk ( tk )
341
45
end
@@ -345,7 +49,6 @@ def get_squashed_tk
345
49
tk = get_embdoc_tk ( tk )
346
50
when :on_heredoc_beg then
347
51
@heredoc_queue << retrieve_heredoc_info ( tk )
348
- @inner_lex . lex_state = EXPR_END unless RIPPER_HAS_LEX_STATE
349
52
when :on_nl , :on_ignored_nl , :on_comment , :on_heredoc_end then
350
53
if !@heredoc_queue . empty?
351
54
get_heredoc_tk ( *@heredoc_queue . shift )
@@ -549,8 +252,7 @@ def get_squashed_tk
549
252
private def get_op_tk ( tk )
550
253
redefinable_operators = %w[ ! != !~ % & * ** + +@ - -@ / < << <= <=> == === =~ > >= >> [] []= ^ ` | ~ ]
551
254
if redefinable_operators . include? ( tk [ :text ] ) and tk [ :state ] == EXPR_ARG then
552
- @inner_lex . lex_state = EXPR_ARG unless RIPPER_HAS_LEX_STATE
553
- tk [ :state ] = Ripper ::Lexer . const_defined? ( :State ) ? Ripper ::Lexer ::State . new ( EXPR_ARG ) : EXPR_ARG
255
+ tk [ :state ] = Ripper ::Lexer ::State . new ( EXPR_ARG )
554
256
tk [ :kind ] = :on_ident
555
257
elsif tk [ :text ] =~ /^[-+]$/ then
556
258
tk_ahead = get_squashed_tk
0 commit comments