Skip to content

Commit 1ee1954

Browse files
committed
Use Struct for each token
This replaces Hash with Struct for each token. For your information, Struct#[] and Struct#[]= provides the same behavior of Hash.
1 parent 265ef8b commit 1ee1954

File tree

2 files changed

+56
-84
lines changed

2 files changed

+56
-84
lines changed

lib/rdoc/parser/ripper_state_lex.rb

Lines changed: 36 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ class RDoc::Parser::RipperStateLex
55
# TODO: Remove this constants after Ruby 2.4 EOL
66
RIPPER_HAS_LEX_STATE = Ripper::Filter.method_defined?(:state)
77

8+
Token = Struct.new(:line_no, :char_no, :kind, :text, :state)
9+
810
EXPR_NONE = 0
911
EXPR_BEG = 1
1012
EXPR_END = 2
@@ -48,7 +50,7 @@ def on_nl(tok, data)
4850
@continue = false
4951
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
5052
end
51-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
53+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
5254
end
5355

5456
def on_ignored_nl(tok, data)
@@ -59,7 +61,7 @@ def on_ignored_nl(tok, data)
5961
@continue = false
6062
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
6163
end
62-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
64+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
6365
end
6466

6567
def on_op(tok, data)
@@ -101,7 +103,7 @@ def on_op(tok, data)
101103
@lex_state = EXPR_BEG
102104
end
103105
end
104-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
106+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
105107
end
106108

107109
def on_kw(tok, data)
@@ -130,54 +132,54 @@ def on_kw(tok, data)
130132
@lex_state = EXPR_END
131133
end
132134
end
133-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
135+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
134136
end
135137

136138
def on_tstring_beg(tok, data)
137139
@lex_state = EXPR_BEG
138-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
140+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
139141
end
140142

141143
def on_tstring_end(tok, data)
142144
@lex_state = EXPR_END | EXPR_ENDARG
143-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
145+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
144146
end
145147

146148
def on_CHAR(tok, data)
147149
@lex_state = EXPR_END
148-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
150+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
149151
end
150152

151153
def on_period(tok, data)
152154
@lex_state = EXPR_DOT
153-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
155+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
154156
end
155157

156158
def on_int(tok, data)
157159
@lex_state = EXPR_END | EXPR_ENDARG
158-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
160+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
159161
end
160162

161163
def on_float(tok, data)
162164
@lex_state = EXPR_END | EXPR_ENDARG
163-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
165+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
164166
end
165167

166168
def on_rational(tok, data)
167169
@lex_state = EXPR_END | EXPR_ENDARG
168-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
170+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
169171
end
170172

171173
def on_imaginary(tok, data)
172174
@lex_state = EXPR_END | EXPR_ENDARG
173-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
175+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
174176
end
175177

176178
def on_symbeg(tok, data)
177179
@lex_state = EXPR_FNAME
178180
@continue = true
179181
@in_fname = true
180-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
182+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
181183
end
182184

183185
private def on_variables(event, tok, data)
@@ -196,7 +198,7 @@ def on_symbeg(tok, data)
196198
else
197199
@lex_state = EXPR_CMDARG
198200
end
199-
@callback.call({ :line_no => lineno, :char_no => column, :kind => event, :text => tok, :state => @lex_state})
201+
@callback.call(Token.new(lineno, column, event, tok, @lex_state))
200202
end
201203

202204
def on_ident(tok, data)
@@ -225,32 +227,32 @@ def on_backref(tok, data)
225227

226228
def on_lparen(tok, data)
227229
@lex_state = EXPR_LABEL | EXPR_BEG
228-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
230+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
229231
end
230232

231233
def on_rparen(tok, data)
232234
@lex_state = EXPR_ENDFN
233-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
235+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
234236
end
235237

236238
def on_lbrace(tok, data)
237239
@lex_state = EXPR_LABEL | EXPR_BEG
238-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
240+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
239241
end
240242

241243
def on_rbrace(tok, data)
242244
@lex_state = EXPR_ENDARG
243-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
245+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
244246
end
245247

246248
def on_lbracket(tok, data)
247249
@lex_state = EXPR_LABEL | EXPR_BEG
248-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
250+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
249251
end
250252

251253
def on_rbracket(tok, data)
252254
@lex_state = EXPR_ENDARG
253-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
255+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
254256
end
255257

256258
def on_const(tok, data)
@@ -262,36 +264,36 @@ def on_const(tok, data)
262264
else
263265
@lex_state = EXPR_CMDARG
264266
end
265-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
267+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
266268
end
267269

268270
def on_sp(tok, data)
269-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
271+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
270272
end
271273

272274
def on_comma(tok, data)
273275
@lex_state = EXPR_BEG | EXPR_LABEL if (EXPR_ARG_ANY & @lex_state) != 0
274-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
276+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
275277
end
276278

277279
def on_comment(tok, data)
278280
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
279-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
281+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
280282
end
281283

282284
def on_ignored_sp(tok, data)
283285
@lex_state = EXPR_BEG unless (EXPR_LABEL & @lex_state) != 0
284-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
286+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
285287
end
286288

287289
def on_heredoc_end(tok, data)
288-
@callback.call({ :line_no => lineno, :char_no => column, :kind => __method__, :text => tok, :state => @lex_state})
290+
@callback.call(Token.new(lineno, column, __method__, tok, @lex_state))
289291
@lex_state = EXPR_BEG
290292
end
291293

292294
def on_default(event, tok, data)
293295
reset
294-
@callback.call({ :line_no => lineno, :char_no => column, :kind => event, :text => tok, :state => @lex_state})
296+
@callback.call(Token.new(lineno, column, event, tok, @lex_state))
295297
end
296298

297299
def each(&block)
@@ -306,7 +308,7 @@ def initialize(code)
306308
end
307309

308310
def on_default(event, tok, data)
309-
@callback.call({ :line_no => lineno, :char_no => column, :kind => event, :text => tok, :state => state})
311+
@callback.call(Token.new(lineno, column, event, tok, state))
310312
end
311313

312314
def each(&block)
@@ -367,7 +369,7 @@ def get_squashed_tk
367369

368370
private def get_symbol_tk(tk)
369371
is_symbol = true
370-
symbol_tk = { :line_no => tk[:line_no], :char_no => tk[:char_no], :kind => :on_symbol }
372+
symbol_tk = Token.new(tk.line_no, tk.char_no, :on_symbol)
371373
if ":'" == tk[:text] or ':"' == tk[:text]
372374
tk1 = get_string_tk(tk)
373375
symbol_tk[:text] = tk1[:text]
@@ -436,13 +438,7 @@ def get_squashed_tk
436438
end
437439
end
438440
end
439-
{
440-
:line_no => tk[:line_no],
441-
:char_no => tk[:char_no],
442-
:kind => kind,
443-
:text => string,
444-
:state => state
445-
}
441+
Token.new(tk.line_no, tk.char_no, kind, string, state)
446442
end
447443

448444
private def get_regexp_tk(tk)
@@ -460,13 +456,7 @@ def get_squashed_tk
460456
string = string + inner_str_tk[:text]
461457
end
462458
end
463-
{
464-
:line_no => tk[:line_no],
465-
:char_no => tk[:char_no],
466-
:kind => :on_regexp,
467-
:text => string,
468-
:state => state
469-
}
459+
Token.new(tk.line_no, tk.char_no, :on_regexp, string, state)
470460
end
471461

472462
private def get_embdoc_tk(tk)
@@ -475,13 +465,7 @@ def get_squashed_tk
475465
string = string + embdoc_tk[:text]
476466
end
477467
string = string + embdoc_tk[:text]
478-
{
479-
:line_no => tk[:line_no],
480-
:char_no => tk[:char_no],
481-
:kind => :on_embdoc,
482-
:text => string,
483-
:state => embdoc_tk[:state]
484-
}
468+
Token.new(tk.line_no, tk.char_no, :on_embdoc, string, embdoc_tk.state)
485469
end
486470

487471
private def get_heredoc_tk(heredoc_name, indent)
@@ -499,13 +483,7 @@ def get_squashed_tk
499483
start_tk = tk unless start_tk
500484
prev_tk = tk unless prev_tk
501485
@buf.unshift tk # closing heredoc
502-
heredoc_tk = {
503-
:line_no => start_tk[:line_no],
504-
:char_no => start_tk[:char_no],
505-
:kind => :on_heredoc,
506-
:text => string,
507-
:state => prev_tk[:state]
508-
}
486+
heredoc_tk = Token.new(start_tk.line_no, start_tk.char_no, :on_heredoc, string, prev_tk.state)
509487
@buf.unshift heredoc_tk
510488
end
511489

@@ -561,13 +539,7 @@ def get_squashed_tk
561539
end
562540
end
563541
text = "#{start_token}#{string}#{end_token}"
564-
{
565-
:line_no => line_no,
566-
:char_no => char_no,
567-
:kind => :on_dstring,
568-
:text => text,
569-
:state => state
570-
}
542+
Token.new(line_no, char_no, :on_dstring, text, state)
571543
end
572544

573545
private def get_op_tk(tk)

lib/rdoc/parser/ruby.rb

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -536,17 +536,17 @@ def get_included_module_with_optional_parens
536536
def get_end_token tk # :nodoc:
537537
case tk[:kind]
538538
when :on_lparen
539-
{
540-
:kind => :on_rparen,
541-
:text => ')'
542-
}
539+
token = RDoc::Parser::RipperStateLex::Token.new
540+
token[:kind] = :on_rparen
541+
token[:text] = ')'
542+
token
543543
when :on_rparen
544544
nil
545545
else
546-
{
547-
:kind => :on_nl,
548-
:text => "\n"
549-
}
546+
token = RDoc::Parser::RipperStateLex::Token.new
547+
token[:kind] = :on_nl
548+
token[:text] = "\n"
549+
token
550550
end
551551
end
552552

@@ -1104,10 +1104,10 @@ def parse_comment_ghost container, text, name, column, line_no, # :nodoc:
11041104
record_location meth
11051105

11061106
meth.start_collecting_tokens
1107-
indent = { :line_no => 1, :char_no => 1, :kind => :on_sp, :text => ' ' * column }
1108-
position_comment = { :line_no => line_no, :char_no => 1, :kind => :on_comment }
1107+
indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
1108+
position_comment = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
11091109
position_comment[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
1110-
newline = { :line_no => 0, :char_no => 0, :kind => :on_nl, :text => "\n" }
1110+
newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
11111111
meth.add_tokens [position_comment, newline, indent]
11121112

11131113
meth.params =
@@ -1147,10 +1147,10 @@ def parse_comment_tomdoc container, tk, comment
11471147
meth.line = line_no
11481148

11491149
meth.start_collecting_tokens
1150-
indent = { :line_no => 1, :char_no => 1, :kind => :on_sp, :text => ' ' * column }
1151-
position_comment = { :line_no => line_no, :char_no => 1, :kind => :on_comment }
1150+
indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
1151+
position_comment = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
11521152
position_comment[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
1153-
newline = { :line_no => 0, :char_no => 0, :kind => :on_nl, :text => "\n" }
1153+
newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
11541154
meth.add_tokens [position_comment, newline, indent]
11551155

11561156
meth.call_seq = signature
@@ -1315,10 +1315,10 @@ def parse_meta_method(container, single, tk, comment)
13151315
remove_token_listener self
13161316

13171317
meth.start_collecting_tokens
1318-
indent = { :line_no => 1, :char_no => 1, :kind => :on_sp, :text => ' ' * column }
1319-
position_comment = { :line_no => line_no, :char_no => 1, :kind => :on_comment }
1318+
indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
1319+
position_comment = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
13201320
position_comment[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
1321-
newline = { :line_no => 0, :char_no => 0, :kind => :on_nl, :text => "\n" }
1321+
newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
13221322
meth.add_tokens [position_comment, newline, indent]
13231323
meth.add_tokens @token_stream
13241324

@@ -1418,10 +1418,10 @@ def parse_method(container, single, tk, comment)
14181418
meth.line = line_no
14191419

14201420
meth.start_collecting_tokens
1421-
indent = { :line_no => 1, :char_no => 1, :kind => :on_sp, :text => ' ' * column }
1422-
token = { :line_no => line_no, :char_no => 1, :kind => :on_comment }
1421+
indent = RDoc::Parser::RipperStateLex::Token.new(1, 1, :on_sp, ' ' * column)
1422+
token = RDoc::Parser::RipperStateLex::Token.new(line_no, 1, :on_comment)
14231423
token[:text] = "# File #{@top_level.relative_name}, line #{line_no}"
1424-
newline = { :line_no => 0, :char_no => 0, :kind => :on_nl, :text => "\n" }
1424+
newline = RDoc::Parser::RipperStateLex::Token.new(0, 0, :on_nl, "\n")
14251425
meth.add_tokens [token, newline, indent]
14261426
meth.add_tokens @token_stream
14271427

0 commit comments

Comments
 (0)