ruby_parser 3.1.3 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data.tar.gz.sig +0 -0
- data/.autotest +16 -3
- data/History.txt +66 -0
- data/Manifest.txt +2 -0
- data/Rakefile +25 -15
- data/bin/ruby_parse_extract_error +22 -2
- data/lib/ruby18_parser.rb +27 -15
- data/lib/ruby18_parser.y +27 -16
- data/lib/ruby19_parser.rb +2296 -2265
- data/lib/ruby19_parser.y +54 -35
- data/lib/ruby20_parser.rb +6593 -0
- data/lib/ruby20_parser.y +2290 -0
- data/lib/ruby_lexer.rb +161 -93
- data/lib/ruby_parser.rb +1 -1
- data/lib/ruby_parser_extras.rb +95 -27
- data/test/test_ruby_lexer.rb +476 -29
- data/test/test_ruby_parser.rb +1141 -147
- data/test/test_ruby_parser_extras.rb +2 -3
- metadata +30 -14
- metadata.gz.sig +1 -1
data/lib/ruby_parser.rb
CHANGED
data/lib/ruby_parser_extras.rb
CHANGED
@@ -99,7 +99,8 @@ class RPStringScanner < StringScanner
|
|
99
99
|
alias :old_scan :scan
|
100
100
|
def scan re
|
101
101
|
s = old_scan re
|
102
|
-
|
102
|
+
where = caller.first.split(/:/).first(2).join(":")
|
103
|
+
d :scan => [s, where] if s
|
103
104
|
s
|
104
105
|
end
|
105
106
|
end
|
@@ -110,11 +111,39 @@ class RPStringScanner < StringScanner
|
|
110
111
|
end
|
111
112
|
|
112
113
|
module RubyParserStuff
|
113
|
-
VERSION = "3.
|
114
|
+
VERSION = "3.2.0" unless constants.include? "VERSION" # SIGH
|
114
115
|
|
115
116
|
attr_accessor :lexer, :in_def, :in_single, :file
|
116
117
|
attr_reader :env, :comments
|
117
118
|
|
119
|
+
$good20 = []
|
120
|
+
|
121
|
+
%w[
|
122
|
+
].map(&:to_i).each do |n|
|
123
|
+
$good20[n] = n
|
124
|
+
end
|
125
|
+
|
126
|
+
def debug20 n, v = nil, r = nil
|
127
|
+
raise "not yet #{n} #{v.inspect} => #{r.inspect}" unless $good20[n]
|
128
|
+
end
|
129
|
+
|
130
|
+
ruby19 = "".respond_to? :encoding
|
131
|
+
|
132
|
+
# Rhis is in sorted order of occurrence according to
|
133
|
+
# charlock_holmes against 500k files, with UTF_8 forced
|
134
|
+
# to the top.
|
135
|
+
#
|
136
|
+
# Overwrite this contstant if you need something different.
|
137
|
+
ENCODING_ORDER = [
|
138
|
+
Encoding::UTF_8, # moved to top to reflect default in 2.0
|
139
|
+
Encoding::ISO_8859_1,
|
140
|
+
Encoding::ISO_8859_2,
|
141
|
+
Encoding::ISO_8859_9,
|
142
|
+
Encoding::SHIFT_JIS,
|
143
|
+
Encoding::WINDOWS_1252,
|
144
|
+
Encoding::EUC_JP
|
145
|
+
] if ruby19
|
146
|
+
|
118
147
|
def syntax_error msg
|
119
148
|
raise RubyParser::SyntaxError, msg
|
120
149
|
end
|
@@ -129,7 +158,7 @@ module RubyParserStuff
|
|
129
158
|
end
|
130
159
|
|
131
160
|
def arg_blk_pass node1, node2 # TODO: nuke
|
132
|
-
node1 = s(:arglist, node1) unless [:arglist, :array].include? node1.first
|
161
|
+
node1 = s(:arglist, node1) unless [:arglist, :call_args, :array, :args].include? node1.first
|
133
162
|
node1 << node2 if node2
|
134
163
|
node1
|
135
164
|
end
|
@@ -146,12 +175,14 @@ module RubyParserStuff
|
|
146
175
|
if sexp.size == 2 and sexp[1].sexp_type == :array then
|
147
176
|
s(:masgn, *sexp[1][1..-1].map { |sub| clean_mlhs sub })
|
148
177
|
else
|
178
|
+
debug20 5
|
149
179
|
sexp
|
150
180
|
end
|
151
181
|
when :gasgn, :iasgn, :lasgn, :cvasgn then
|
152
182
|
if sexp.size == 2 then
|
153
183
|
sexp.last
|
154
184
|
else
|
185
|
+
debug20 7
|
155
186
|
sexp # optional value
|
156
187
|
end
|
157
188
|
else
|
@@ -182,6 +213,34 @@ module RubyParserStuff
|
|
182
213
|
end
|
183
214
|
end
|
184
215
|
|
216
|
+
def array_to_hash array
|
217
|
+
s(:hash, *array[1..-1])
|
218
|
+
end
|
219
|
+
|
220
|
+
def call_args args
|
221
|
+
result = s(:call_args)
|
222
|
+
|
223
|
+
args.each do |arg|
|
224
|
+
case arg
|
225
|
+
when Sexp then
|
226
|
+
case arg.sexp_type
|
227
|
+
when :array, :args, :call_args then # HACK? remove array at some point
|
228
|
+
result.concat arg[1..-1]
|
229
|
+
else
|
230
|
+
result << arg
|
231
|
+
end
|
232
|
+
when Symbol then
|
233
|
+
result << arg
|
234
|
+
when ",", nil then
|
235
|
+
# ignore
|
236
|
+
else
|
237
|
+
raise "unhandled: #{arg.inspect} in #{args.inspect}"
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
result
|
242
|
+
end
|
243
|
+
|
185
244
|
def args args
|
186
245
|
result = s(:args)
|
187
246
|
|
@@ -189,21 +248,27 @@ module RubyParserStuff
|
|
189
248
|
case arg
|
190
249
|
when Sexp then
|
191
250
|
case arg.sexp_type
|
192
|
-
when :args, :block, :array then
|
251
|
+
when :args, :block, :array, :call_args then # HACK call_args mismatch
|
193
252
|
result.concat arg[1..-1]
|
194
253
|
when :block_arg then
|
195
254
|
result << :"&#{arg.last}"
|
196
|
-
when :
|
255
|
+
when :shadow then
|
256
|
+
if Sexp === result.last and result.last.sexp_type == :shadow then
|
257
|
+
result.last << arg.last
|
258
|
+
else
|
259
|
+
result << arg
|
260
|
+
end
|
261
|
+
when :masgn, :block_pass, :hash then # HACK: remove. prolly call_args
|
197
262
|
result << arg
|
198
263
|
else
|
199
|
-
raise "unhandled: #{arg.inspect}"
|
264
|
+
raise "unhandled: #{arg.sexp_type} in #{args.inspect}"
|
200
265
|
end
|
201
266
|
when Symbol then
|
202
267
|
result << arg
|
203
|
-
when ",", nil then
|
268
|
+
when ",", "|", ";", "(", ")", nil then
|
204
269
|
# ignore
|
205
270
|
else
|
206
|
-
raise "unhandled: #{arg.inspect}"
|
271
|
+
raise "unhandled: #{arg.inspect} in #{args.inspect}"
|
207
272
|
end
|
208
273
|
end
|
209
274
|
|
@@ -216,7 +281,7 @@ module RubyParserStuff
|
|
216
281
|
end
|
217
282
|
|
218
283
|
def assignable(lhs, value = nil)
|
219
|
-
id = lhs.to_sym
|
284
|
+
id = lhs.to_sym unless Sexp === lhs
|
220
285
|
id = id.to_sym if Sexp === id
|
221
286
|
|
222
287
|
raise "write a test 1" if id.to_s =~ /^(?:self|nil|true|false|__LINE__|__FILE__)$/
|
@@ -254,7 +319,7 @@ module RubyParserStuff
|
|
254
319
|
end
|
255
320
|
end
|
256
321
|
|
257
|
-
self.env[id] ||= :lvar
|
322
|
+
self.env[id] ||= :lvar unless result.sexp_type == :cdecl # HACK? cdecl
|
258
323
|
|
259
324
|
result << value if value
|
260
325
|
|
@@ -526,7 +591,7 @@ module RubyParserStuff
|
|
526
591
|
# TODO: need a test with f(&b) { } to produce warning
|
527
592
|
|
528
593
|
args ||= s(:arglist)
|
529
|
-
args[0] = :arglist if args.first
|
594
|
+
args[0] = :arglist if [:array, :call_args].include? args.first
|
530
595
|
args = s(:arglist, args) unless args.first == :arglist
|
531
596
|
|
532
597
|
# HACK quick hack to make this work quickly... easy to clean up above
|
@@ -932,18 +997,8 @@ module RubyParserStuff
|
|
932
997
|
end
|
933
998
|
|
934
999
|
def hack_encoding str, extra = nil
|
935
|
-
|
936
|
-
|
937
|
-
encodings = [
|
938
|
-
extra,
|
939
|
-
Encoding::ISO_8859_1,
|
940
|
-
Encoding::UTF_8,
|
941
|
-
Encoding::ISO_8859_2,
|
942
|
-
Encoding::ISO_8859_9,
|
943
|
-
Encoding::SHIFT_JIS,
|
944
|
-
Encoding::WINDOWS_1252,
|
945
|
-
Encoding::EUC_JP,
|
946
|
-
].compact
|
1000
|
+
encodings = ENCODING_ORDER.dup
|
1001
|
+
encodings.unshift(extra) unless extra.nil?
|
947
1002
|
|
948
1003
|
# terrible, horrible, no good, very bad, last ditch effort.
|
949
1004
|
encodings.each do |enc|
|
@@ -1134,6 +1189,8 @@ module RubyParserStuff
|
|
1134
1189
|
WORDLIST18 = Hash[*wordlist.map { |o| [o.name, o] }.flatten]
|
1135
1190
|
WORDLIST19 = Hash[*wordlist.map { |o| [o.name, o] }.flatten]
|
1136
1191
|
|
1192
|
+
WORDLIST18.delete "__ENCODING__"
|
1193
|
+
|
1137
1194
|
%w[and case elsif for if in module or unless until when while].each do |k|
|
1138
1195
|
WORDLIST19[k] = WORDLIST19[k].dup
|
1139
1196
|
WORDLIST19[k].state = :expr_value
|
@@ -1267,6 +1324,10 @@ module RubyParserStuff
|
|
1267
1324
|
end
|
1268
1325
|
end
|
1269
1326
|
|
1327
|
+
class Ruby20Parser < Racc::Parser
|
1328
|
+
include RubyParserStuff
|
1329
|
+
end
|
1330
|
+
|
1270
1331
|
class Ruby19Parser < Racc::Parser
|
1271
1332
|
include RubyParserStuff
|
1272
1333
|
end
|
@@ -1286,12 +1347,17 @@ class RubyParser
|
|
1286
1347
|
def initialize
|
1287
1348
|
@p18 = Ruby18Parser.new
|
1288
1349
|
@p19 = Ruby19Parser.new
|
1350
|
+
@p20 = Ruby20Parser.new
|
1289
1351
|
end
|
1290
1352
|
|
1291
1353
|
def process(s, f = "(string)", t = 10) # parens for emacs *sigh*
|
1292
|
-
@
|
1293
|
-
rescue Racc::ParseError
|
1294
|
-
|
1354
|
+
@p20.process s, f, t
|
1355
|
+
rescue Racc::ParseError, RubyParser::SyntaxError
|
1356
|
+
begin
|
1357
|
+
@p19.process s, f, t
|
1358
|
+
rescue Racc::ParseError, RubyParser::SyntaxError
|
1359
|
+
@p18.process s, f, t
|
1360
|
+
end
|
1295
1361
|
end
|
1296
1362
|
|
1297
1363
|
alias :parse :process
|
@@ -1307,6 +1373,8 @@ class RubyParser
|
|
1307
1373
|
Ruby18Parser.new
|
1308
1374
|
when /^1\.9/ then
|
1309
1375
|
Ruby19Parser.new
|
1376
|
+
when /^2.0/ then
|
1377
|
+
Ruby20Parser.new
|
1310
1378
|
else
|
1311
1379
|
raise "unrecognized RUBY_VERSION #{RUBY_VERSION}"
|
1312
1380
|
end
|
@@ -1337,7 +1405,7 @@ class Sexp
|
|
1337
1405
|
end
|
1338
1406
|
|
1339
1407
|
def to_sym
|
1340
|
-
raise "no"
|
1408
|
+
raise "no: #{self.inspect}.to_sym is a bug"
|
1341
1409
|
self.value.to_sym
|
1342
1410
|
end
|
1343
1411
|
|
data/test/test_ruby_lexer.rb
CHANGED
@@ -2,30 +2,49 @@
|
|
2
2
|
# encoding: US-ASCII
|
3
3
|
|
4
4
|
require 'rubygems'
|
5
|
-
gem "minitest"
|
6
|
-
|
7
5
|
require 'minitest/autorun'
|
8
6
|
require 'ruby_lexer'
|
9
7
|
require 'ruby18_parser'
|
8
|
+
require 'ruby20_parser'
|
9
|
+
|
10
|
+
class TestRubyLexer < Minitest::Test
|
11
|
+
attr_accessor :processor, :lex, :parser_class
|
10
12
|
|
11
|
-
|
12
|
-
alias :
|
13
|
+
alias :lexer :lex # lets me copy/paste code from parser
|
14
|
+
alias :lexer= :lex=
|
13
15
|
|
14
16
|
def setup
|
15
|
-
|
17
|
+
setup_lexer_class Ruby20Parser
|
16
18
|
end
|
17
19
|
|
18
|
-
def setup_lexer
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
20
|
+
def setup_lexer input, exp_sexp = nil
|
21
|
+
setup_new_parser
|
22
|
+
lex.src = input
|
23
|
+
lex.lex_state = :expr_beg
|
24
|
+
assert_equal exp_sexp, processor.class.new.parse(input) if exp_sexp
|
25
|
+
end
|
26
|
+
|
27
|
+
def setup_new_parser
|
28
|
+
self.processor = parser_class.new
|
29
|
+
self.lex = processor.lexer
|
30
|
+
end
|
31
|
+
|
32
|
+
def setup_lexer_class parser_class
|
33
|
+
self.parser_class = parser_class
|
34
|
+
setup_new_parser
|
35
|
+
setup_lexer "blah blah"
|
23
36
|
end
|
24
37
|
|
25
38
|
def test_advance
|
26
39
|
assert @lex.advance # blah
|
27
40
|
assert @lex.advance # blah
|
28
|
-
|
41
|
+
refute @lex.advance # nada
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_unicode_ident
|
45
|
+
s = "@\u1088\u1077\u1093\u1072"
|
46
|
+
util_lex_token(s.dup,
|
47
|
+
:tIVAR, s.dup)
|
29
48
|
end
|
30
49
|
|
31
50
|
def test_read_escape
|
@@ -44,6 +63,11 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
44
63
|
util_escape "\010", "b"
|
45
64
|
util_escape " ", "s"
|
46
65
|
util_escape "q", "q" # plain vanilla escape
|
66
|
+
|
67
|
+
util_escape "8", "8" # ugh... mri... WHY?!?
|
68
|
+
util_escape "9", "9" # ugh... mri... WHY?!?
|
69
|
+
|
70
|
+
util_escape "$", "444" # ugh
|
47
71
|
end
|
48
72
|
|
49
73
|
def test_read_escape_c
|
@@ -133,6 +157,8 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
133
157
|
end
|
134
158
|
|
135
159
|
def test_yylex_label__18
|
160
|
+
setup_lexer_class Ruby18Parser
|
161
|
+
|
136
162
|
util_lex_token("{a:",
|
137
163
|
:tLBRACE, "{",
|
138
164
|
:tIDENTIFIER, "a",
|
@@ -140,6 +166,8 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
140
166
|
end
|
141
167
|
|
142
168
|
def test_yylex_label_in_params__18
|
169
|
+
setup_lexer_class Ruby18Parser
|
170
|
+
|
143
171
|
util_lex_token("foo(a:",
|
144
172
|
:tIDENTIFIER, "foo",
|
145
173
|
:tLPAREN2, "(",
|
@@ -148,7 +176,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
148
176
|
end
|
149
177
|
|
150
178
|
def test_yylex_label__19
|
151
|
-
|
179
|
+
setup_lexer_class Ruby19Parser
|
152
180
|
|
153
181
|
util_lex_token("{a:",
|
154
182
|
:tLBRACE, "{",
|
@@ -156,7 +184,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
156
184
|
end
|
157
185
|
|
158
186
|
def test_yylex_label_in_params__19
|
159
|
-
|
187
|
+
setup_lexer_class Ruby19Parser
|
160
188
|
|
161
189
|
util_lex_token("foo(a:",
|
162
190
|
:tIDENTIFIER, "foo",
|
@@ -164,6 +192,345 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
164
192
|
:tLABEL, "a")
|
165
193
|
end
|
166
194
|
|
195
|
+
def assert_next_lexeme token=nil, value=nil, state=nil, paren=nil, brace=nil
|
196
|
+
assert @lex.advance, "no more tokens"
|
197
|
+
|
198
|
+
msg = message {
|
199
|
+
act = [@lex.token, @lex.yacc_value, @lex.lex_state,
|
200
|
+
@lex.paren_nest, @lex.brace_nest]
|
201
|
+
exp = [token, value, state, paren, brace]
|
202
|
+
"#{exp.inspect} vs #{act.inspect}"
|
203
|
+
}
|
204
|
+
|
205
|
+
act_value = @lex.yacc_value
|
206
|
+
act_value = act_value.first if Array === act_value
|
207
|
+
|
208
|
+
assert_equal token, @lex.token, msg
|
209
|
+
assert_equal value, act_value, msg
|
210
|
+
assert_equal state, @lex.lex_state, msg
|
211
|
+
assert_equal paren, @lex.paren_nest, msg if paren
|
212
|
+
assert_equal brace, @lex.brace_nest, msg if brace
|
213
|
+
end
|
214
|
+
|
215
|
+
def refute_lexeme
|
216
|
+
refute @lex.advance, "not empty: #{[@lex.token, @lex.yacc_value].inspect}"
|
217
|
+
end
|
218
|
+
|
219
|
+
def assert_lex input, exp_sexp, *args
|
220
|
+
setup_lexer input, exp_sexp
|
221
|
+
|
222
|
+
args.each_slice(5) do |token, value, state, paren, brace|
|
223
|
+
assert_next_lexeme token, value, state, paren, brace
|
224
|
+
end
|
225
|
+
|
226
|
+
refute_lexeme
|
227
|
+
end
|
228
|
+
|
229
|
+
def emulate_string_interpolation
|
230
|
+
lex_strterm = lexer.lex_strterm
|
231
|
+
string_nest = lexer.string_nest
|
232
|
+
brace_nest = lexer.brace_nest
|
233
|
+
|
234
|
+
lexer.string_nest = 0
|
235
|
+
lexer.brace_nest = 0
|
236
|
+
lexer.cond.push false
|
237
|
+
lexer.cmdarg.push false
|
238
|
+
|
239
|
+
lexer.lex_strterm = nil
|
240
|
+
lexer.lex_state = :expr_beg
|
241
|
+
|
242
|
+
yield
|
243
|
+
|
244
|
+
lexer.lex_state = :expr_endarg
|
245
|
+
assert_next_lexeme :tRCURLY, "}", :expr_endarg, 0
|
246
|
+
|
247
|
+
lexer.lex_strterm = lex_strterm
|
248
|
+
lexer.lex_state = :expr_beg
|
249
|
+
lexer.string_nest = string_nest
|
250
|
+
lexer.brace_nest = brace_nest
|
251
|
+
|
252
|
+
lexer.cond.lexpop
|
253
|
+
lexer.cmdarg.lexpop
|
254
|
+
end
|
255
|
+
|
256
|
+
def test_yylex_paren_string_parens_interpolated
|
257
|
+
setup_lexer('%((#{b}#{d}))',
|
258
|
+
s(:dstr,
|
259
|
+
"(",
|
260
|
+
s(:evstr, s(:call, nil, :b)),
|
261
|
+
s(:evstr, s(:call, nil, :d)),
|
262
|
+
s(:str, ")")))
|
263
|
+
|
264
|
+
assert_next_lexeme :tSTRING_BEG, "%)", :expr_beg, 0, 0
|
265
|
+
assert_next_lexeme :tSTRING_CONTENT, "(", :expr_beg, 0, 0
|
266
|
+
assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0
|
267
|
+
|
268
|
+
emulate_string_interpolation do
|
269
|
+
assert_next_lexeme :tIDENTIFIER, "b", :expr_arg, 0, 0
|
270
|
+
end
|
271
|
+
|
272
|
+
assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0
|
273
|
+
|
274
|
+
emulate_string_interpolation do
|
275
|
+
assert_next_lexeme :tIDENTIFIER, "d", :expr_arg, 0, 0
|
276
|
+
end
|
277
|
+
|
278
|
+
assert_next_lexeme :tSTRING_CONTENT, ")", :expr_beg, 0, 0
|
279
|
+
assert_next_lexeme :tSTRING_END, ")", :expr_end, 0, 0
|
280
|
+
|
281
|
+
refute_lexeme
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_yylex_paren_string_interpolated_regexp
|
285
|
+
setup_lexer('%( #{(/abcd/)} )',
|
286
|
+
s(:dstr, " ", s(:evstr, s(:lit, /abcd/)), s(:str, " ")))
|
287
|
+
|
288
|
+
assert_next_lexeme :tSTRING_BEG, "%)", :expr_beg, 0, 0
|
289
|
+
assert_next_lexeme :tSTRING_CONTENT, " ", :expr_beg, 0, 0
|
290
|
+
assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0
|
291
|
+
|
292
|
+
emulate_string_interpolation do
|
293
|
+
assert_next_lexeme :tLPAREN, "(", :expr_beg, 1, 0
|
294
|
+
assert_next_lexeme :tREGEXP_BEG, "/", :expr_beg, 1, 0
|
295
|
+
assert_next_lexeme :tSTRING_CONTENT, "abcd", :expr_beg, 1, 0
|
296
|
+
assert_next_lexeme :tREGEXP_END, "", :expr_end, 1, 0
|
297
|
+
assert_next_lexeme :tRPAREN, ")", :expr_endfn, 0, 0
|
298
|
+
end
|
299
|
+
|
300
|
+
assert_next_lexeme :tSTRING_CONTENT, " ", :expr_beg, 0, 0
|
301
|
+
assert_next_lexeme :tSTRING_END, ")", :expr_end, 0, 0
|
302
|
+
|
303
|
+
refute_lexeme
|
304
|
+
end
|
305
|
+
|
306
|
+
def test_yylex_not_at_defn
|
307
|
+
assert_lex("def +@; end",
|
308
|
+
s(:defn, :+@, s(:args), s(:nil)),
|
309
|
+
|
310
|
+
:kDEF, "def", :expr_fname, 0, 0,
|
311
|
+
:tUPLUS, "+@", :expr_arg, 0, 0,
|
312
|
+
:tSEMI, ";", :expr_beg, 0, 0,
|
313
|
+
:kEND, "end", :expr_end, 0, 0)
|
314
|
+
|
315
|
+
assert_lex("def !@; end",
|
316
|
+
s(:defn, :"!@", s(:args), s(:nil)),
|
317
|
+
|
318
|
+
:kDEF, "def", :expr_fname, 0, 0,
|
319
|
+
:tUBANG, "!@", :expr_arg, 0, 0,
|
320
|
+
:tSEMI, ";", :expr_beg, 0, 0,
|
321
|
+
:kEND, "end", :expr_end, 0, 0)
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_yylex_not_at_ivar
|
325
|
+
assert_lex("!@ivar",
|
326
|
+
s(:call, s(:ivar, :@ivar), :"!"),
|
327
|
+
|
328
|
+
:tBANG, "!", :expr_beg, 0, 0,
|
329
|
+
:tIVAR, "@ivar", :expr_end, 0, 0)
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_yylex_number_times_ident_times_return_number
|
333
|
+
assert_lex("1 * b * 3",
|
334
|
+
s(:call,
|
335
|
+
s(:call, s(:lit, 1), :*, s(:call, nil, :b)),
|
336
|
+
:*, s(:lit, 3)),
|
337
|
+
|
338
|
+
:tINTEGER, 1, :expr_end, 0, 0,
|
339
|
+
:tSTAR2, "*", :expr_beg, 0, 0,
|
340
|
+
:tIDENTIFIER, "b", :expr_arg, 0, 0,
|
341
|
+
:tSTAR2, "*", :expr_beg, 0, 0,
|
342
|
+
:tINTEGER, 3, :expr_end, 0, 0)
|
343
|
+
|
344
|
+
assert_lex("1 * b *\n 3",
|
345
|
+
s(:call,
|
346
|
+
s(:call, s(:lit, 1), :*, s(:call, nil, :b)),
|
347
|
+
:*, s(:lit, 3)),
|
348
|
+
|
349
|
+
:tINTEGER, 1, :expr_end, 0, 0,
|
350
|
+
:tSTAR2, "*", :expr_beg, 0, 0,
|
351
|
+
:tIDENTIFIER, "b", :expr_arg, 0, 0,
|
352
|
+
:tSTAR2, "*", :expr_beg, 0, 0,
|
353
|
+
:tINTEGER, 3, :expr_end, 0, 0)
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_yylex_paren_string_parens_interpolated_regexp
|
357
|
+
setup_lexer('%((#{(/abcd/)}))',
|
358
|
+
s(:dstr, "(", s(:evstr, s(:lit, /abcd/)), s(:str, ")")))
|
359
|
+
|
360
|
+
assert_next_lexeme :tSTRING_BEG, "%)", :expr_beg, 0, 0
|
361
|
+
assert_next_lexeme :tSTRING_CONTENT, "(", :expr_beg, 0, 0
|
362
|
+
|
363
|
+
assert_next_lexeme :tSTRING_DBEG, nil, :expr_beg, 0, 0
|
364
|
+
|
365
|
+
emulate_string_interpolation do
|
366
|
+
assert_next_lexeme :tLPAREN, "(", :expr_beg, 1, 0
|
367
|
+
assert_next_lexeme :tREGEXP_BEG, "/", :expr_beg, 1, 0
|
368
|
+
assert_next_lexeme :tSTRING_CONTENT, "abcd", :expr_beg, 1, 0
|
369
|
+
assert_next_lexeme :tREGEXP_END, "", :expr_end, 1, 0
|
370
|
+
assert_next_lexeme :tRPAREN, ")", :expr_endfn, 0, 0
|
371
|
+
end
|
372
|
+
|
373
|
+
assert_next_lexeme :tSTRING_CONTENT, ")", :expr_beg, 0, 0
|
374
|
+
assert_next_lexeme :tSTRING_END, ")", :expr_end, 0, 0
|
375
|
+
|
376
|
+
refute_lexeme
|
377
|
+
end
|
378
|
+
|
379
|
+
def test_yylex_method_parens_chevron
|
380
|
+
assert_lex("a()<<1",
|
381
|
+
s(:call, s(:call, nil, :a), :<<, s(:lit, 1)),
|
382
|
+
:tIDENTIFIER, "a", :expr_cmdarg, 0, 0,
|
383
|
+
:tLPAREN2, "(", :expr_beg, 1, 0,
|
384
|
+
:tRPAREN, ")", :expr_endfn, 0, 0,
|
385
|
+
:tLSHFT, "<<" , :expr_beg, 0, 0,
|
386
|
+
:tINTEGER, 1, :expr_end, 0, 0)
|
387
|
+
end
|
388
|
+
|
389
|
+
def test_yylex_lambda_args__20
|
390
|
+
setup_lexer_class Ruby20Parser
|
391
|
+
|
392
|
+
assert_lex("-> (a) { }",
|
393
|
+
s(:iter, s(:call, nil, :lambda),
|
394
|
+
s(:args, :a)),
|
395
|
+
|
396
|
+
:tLAMBDA, nil, :expr_endfn, 0, 0,
|
397
|
+
:tLPAREN2, "(", :expr_beg, 1, 0,
|
398
|
+
:tIDENTIFIER, "a", :expr_arg, 1, 0,
|
399
|
+
:tRPAREN, ")", :expr_endfn, 0, 0,
|
400
|
+
:tLCURLY, "{", :expr_beg, 0, 1,
|
401
|
+
:tRCURLY, "}", :expr_endarg, 0, 0)
|
402
|
+
end
|
403
|
+
|
404
|
+
def test_yylex_lambda_args_opt__20
|
405
|
+
setup_lexer_class Ruby20Parser
|
406
|
+
|
407
|
+
assert_lex("-> (a=nil) { }",
|
408
|
+
s(:iter, s(:call, nil, :lambda),
|
409
|
+
s(:args, s(:lasgn, :a, s(:nil)))),
|
410
|
+
|
411
|
+
:tLAMBDA, nil, :expr_endfn, 0, 0,
|
412
|
+
:tLPAREN2, "(", :expr_beg, 1, 0,
|
413
|
+
:tIDENTIFIER, "a", :expr_arg, 1, 0,
|
414
|
+
:tEQL, "=", :expr_beg, 1, 0,
|
415
|
+
:kNIL, "nil", :expr_end, 1, 0,
|
416
|
+
:tRPAREN, ")", :expr_endfn, 0, 0,
|
417
|
+
:tLCURLY, "{", :expr_beg, 0, 1,
|
418
|
+
:tRCURLY, "}", :expr_endarg, 0, 0)
|
419
|
+
end
|
420
|
+
|
421
|
+
def test_yylex_lambda_hash__20
|
422
|
+
setup_lexer_class Ruby20Parser
|
423
|
+
|
424
|
+
assert_lex("-> (a={}) { }",
|
425
|
+
s(:iter, s(:call, nil, :lambda),
|
426
|
+
s(:args, s(:lasgn, :a, s(:hash)))),
|
427
|
+
|
428
|
+
:tLAMBDA, nil, :expr_endfn, 0, 0,
|
429
|
+
:tLPAREN2, "(", :expr_beg, 1, 0,
|
430
|
+
:tIDENTIFIER, "a", :expr_arg, 1, 0,
|
431
|
+
:tEQL, "=", :expr_beg, 1, 0,
|
432
|
+
:tLBRACE, "{", :expr_beg, 1, 1,
|
433
|
+
:tRCURLY, "}", :expr_endarg, 1, 0,
|
434
|
+
:tRPAREN, ")", :expr_endfn, 0, 0,
|
435
|
+
:tLCURLY, "{", :expr_beg, 0, 1,
|
436
|
+
:tRCURLY, "}", :expr_endarg, 0, 0)
|
437
|
+
end
|
438
|
+
|
439
|
+
def test_yylex_iter_array_curly
|
440
|
+
assert_lex("f :a, [:b] { |c, d| }", # yes, this is bad code
|
441
|
+
s(:iter,
|
442
|
+
s(:call, nil, :f, s(:lit, :a), s(:array, s(:lit, :b))),
|
443
|
+
s(:args, :c, :d)),
|
444
|
+
|
445
|
+
:tIDENTIFIER, "f", :expr_cmdarg, 0, 0,
|
446
|
+
:tSYMBOL, "a", :expr_end, 0, 0,
|
447
|
+
:tCOMMA, ",", :expr_beg, 0, 0,
|
448
|
+
:tLBRACK, "[", :expr_beg, 1, 0,
|
449
|
+
:tSYMBOL, "b", :expr_end, 1, 0,
|
450
|
+
:tRBRACK, "]", :expr_endarg, 0, 0,
|
451
|
+
:tLBRACE_ARG, "{", :expr_beg, 0, 1,
|
452
|
+
:tPIPE, "|", :expr_beg, 0, 1,
|
453
|
+
:tIDENTIFIER, "c", :expr_arg, 0, 1,
|
454
|
+
:tCOMMA, ",", :expr_beg, 0, 1,
|
455
|
+
:tIDENTIFIER, "d", :expr_arg, 0, 1,
|
456
|
+
:tPIPE, "|", :expr_beg, 0, 1,
|
457
|
+
:tRCURLY, "}", :expr_endarg, 0, 0)
|
458
|
+
end
|
459
|
+
|
460
|
+
def test_yylex_const_call_same_name
|
461
|
+
assert_lex("X = a { }; b { f :c }",
|
462
|
+
s(:block,
|
463
|
+
s(:cdecl, :X, s(:iter, s(:call, nil, :a), s(:args))),
|
464
|
+
s(:iter,
|
465
|
+
s(:call, nil, :b),
|
466
|
+
s(:args),
|
467
|
+
s(:call, nil, :f, s(:lit, :c)))),
|
468
|
+
|
469
|
+
:tCONSTANT, "X", :expr_cmdarg, 0, 0,
|
470
|
+
:tEQL, "=", :expr_beg, 0, 0,
|
471
|
+
:tIDENTIFIER, "a", :expr_arg, 0, 0,
|
472
|
+
:tLCURLY, "{", :expr_beg, 0, 1,
|
473
|
+
:tRCURLY, "}", :expr_endarg, 0, 0,
|
474
|
+
:tSEMI, ";", :expr_beg, 0, 0,
|
475
|
+
|
476
|
+
:tIDENTIFIER, "b", :expr_cmdarg, 0, 0,
|
477
|
+
:tLCURLY, "{", :expr_beg, 0, 1,
|
478
|
+
:tIDENTIFIER, "f", :expr_cmdarg, 0, 1, # different
|
479
|
+
:tSYMBOL, "c", :expr_end, 0, 1,
|
480
|
+
:tRCURLY, "}", :expr_endarg, 0, 0)
|
481
|
+
|
482
|
+
assert_lex("X = a { }; b { X :c }",
|
483
|
+
s(:block,
|
484
|
+
s(:cdecl, :X, s(:iter, s(:call, nil, :a), s(:args))),
|
485
|
+
s(:iter,
|
486
|
+
s(:call, nil, :b),
|
487
|
+
s(:args),
|
488
|
+
s(:call, nil, :X, s(:lit, :c)))),
|
489
|
+
|
490
|
+
:tCONSTANT, "X", :expr_cmdarg, 0, 0,
|
491
|
+
:tEQL, "=", :expr_beg, 0, 0,
|
492
|
+
:tIDENTIFIER, "a", :expr_arg, 0, 0,
|
493
|
+
:tLCURLY, "{", :expr_beg, 0, 1,
|
494
|
+
:tRCURLY, "}", :expr_endarg, 0, 0,
|
495
|
+
:tSEMI, ";", :expr_beg, 0, 0,
|
496
|
+
|
497
|
+
:tIDENTIFIER, "b", :expr_cmdarg, 0, 0,
|
498
|
+
:tLCURLY, "{", :expr_beg, 0, 1,
|
499
|
+
:tCONSTANT, "X", :expr_cmdarg, 0, 1, # same
|
500
|
+
:tSYMBOL, "c", :expr_end, 0, 1,
|
501
|
+
:tRCURLY, "}", :expr_endarg, 0, 0)
|
502
|
+
end
|
503
|
+
|
504
|
+
def test_yylex_lasgn_call_same_name
|
505
|
+
assert_lex("a = b.c :d => 1",
|
506
|
+
s(:lasgn, :a,
|
507
|
+
s(:call, s(:call, nil, :b), :c,
|
508
|
+
s(:hash, s(:lit, :d), s(:lit, 1)))),
|
509
|
+
|
510
|
+
:tIDENTIFIER, "a", :expr_cmdarg, 0, 0,
|
511
|
+
:tEQL, "=", :expr_beg, 0, 0,
|
512
|
+
:tIDENTIFIER, "b", :expr_arg, 0, 0,
|
513
|
+
:tDOT, ".", :expr_dot, 0, 0,
|
514
|
+
:tIDENTIFIER, "c", :expr_arg, 0, 0, # different
|
515
|
+
:tSYMBOL, "d", :expr_end, 0, 0,
|
516
|
+
:tASSOC, "=>", :expr_beg, 0, 0,
|
517
|
+
:tINTEGER, 1, :expr_end, 0, 0)
|
518
|
+
|
519
|
+
assert_lex("a = b.a :d => 1",
|
520
|
+
s(:lasgn, :a,
|
521
|
+
s(:call, s(:call, nil, :b), :a,
|
522
|
+
s(:hash, s(:lit, :d), s(:lit, 1)))),
|
523
|
+
|
524
|
+
:tIDENTIFIER, "a", :expr_cmdarg, 0, 0,
|
525
|
+
:tEQL, "=", :expr_beg, 0, 0,
|
526
|
+
:tIDENTIFIER, "b", :expr_arg, 0, 0,
|
527
|
+
:tDOT, ".", :expr_dot, 0, 0,
|
528
|
+
:tIDENTIFIER, "a", :expr_arg, 0, 0, # same as lvar
|
529
|
+
:tSYMBOL, "d", :expr_end, 0, 0,
|
530
|
+
:tASSOC, "=>", :expr_beg, 0, 0,
|
531
|
+
:tINTEGER, 1, :expr_end, 0, 0)
|
532
|
+
end
|
533
|
+
|
167
534
|
def test_yylex_back_ref
|
168
535
|
util_lex_token("[$&, $`, $', $+]",
|
169
536
|
:tLBRACK, "[",
|
@@ -628,6 +995,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
628
995
|
end
|
629
996
|
|
630
997
|
def test_yylex_heredoc_double_interp
|
998
|
+
# TODO: convert to assert_lex
|
631
999
|
util_lex_token("a = <<\"EOF\"\n#x a \#@a b \#$b c \#{3} \nEOF\n",
|
632
1000
|
:tIDENTIFIER, "a",
|
633
1001
|
:tEQL, "=",
|
@@ -739,10 +1107,18 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
739
1107
|
util_lex_fname "<=>", :tCMP
|
740
1108
|
end
|
741
1109
|
|
742
|
-
def
|
1110
|
+
def test_yylex_identifier_def__18
|
1111
|
+
setup_lexer_class Ruby18Parser
|
1112
|
+
|
743
1113
|
util_lex_fname "identifier", :tIDENTIFIER, :expr_end
|
744
1114
|
end
|
745
1115
|
|
1116
|
+
def test_yylex_identifier_def__1920
|
1117
|
+
setup_lexer_class Ruby19Parser
|
1118
|
+
|
1119
|
+
util_lex_fname "identifier", :tIDENTIFIER, :expr_endfn
|
1120
|
+
end
|
1121
|
+
|
746
1122
|
def test_yylex_identifier_eh
|
747
1123
|
util_lex_token("identifier?", :tFID, "identifier?")
|
748
1124
|
end
|
@@ -774,10 +1150,18 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
774
1150
|
util_lex_fname "^", :tCARET
|
775
1151
|
end
|
776
1152
|
|
777
|
-
def
|
1153
|
+
def test_yylex_identifier_equals_def__18
|
1154
|
+
setup_lexer_class Ruby18Parser
|
1155
|
+
|
778
1156
|
util_lex_fname "identifier=", :tIDENTIFIER, :expr_end
|
779
1157
|
end
|
780
1158
|
|
1159
|
+
def test_yylex_identifier_equals_def__1920
|
1160
|
+
setup_lexer_class Ruby19Parser
|
1161
|
+
|
1162
|
+
util_lex_fname "identifier=", :tIDENTIFIER, :expr_endfn
|
1163
|
+
end
|
1164
|
+
|
781
1165
|
def test_yylex_identifier_equals_def2
|
782
1166
|
util_lex_fname "==", :tEQ
|
783
1167
|
end
|
@@ -868,25 +1252,25 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
868
1252
|
end
|
869
1253
|
|
870
1254
|
def test_yylex_question_eh_a__18
|
871
|
-
|
1255
|
+
setup_lexer_class Ruby18Parser
|
872
1256
|
|
873
1257
|
util_lex_token "?a", :tINTEGER, 97
|
874
1258
|
end
|
875
1259
|
|
876
1260
|
def test_yylex_question_eh_a__19
|
877
|
-
|
1261
|
+
setup_lexer_class Ruby19Parser
|
878
1262
|
|
879
1263
|
util_lex_token '?a', :tSTRING, "a"
|
880
1264
|
end
|
881
1265
|
|
882
1266
|
def test_yylex_question_eh_escape_M_escape_C__18
|
883
|
-
|
1267
|
+
setup_lexer_class Ruby18Parser
|
884
1268
|
|
885
1269
|
util_lex_token '?\M-\C-a', :tINTEGER, 129
|
886
1270
|
end
|
887
1271
|
|
888
1272
|
def test_yylex_question_eh_escape_M_escape_C__19
|
889
|
-
|
1273
|
+
setup_lexer_class Ruby19Parser
|
890
1274
|
|
891
1275
|
util_lex_token '?\M-\C-a', :tSTRING, "\M-\C-a"
|
892
1276
|
end
|
@@ -911,6 +1295,10 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
911
1295
|
util_bad_token "08"
|
912
1296
|
end
|
913
1297
|
|
1298
|
+
def test_yylex_integer_oct_bad_range2
|
1299
|
+
util_bad_token "08"
|
1300
|
+
end
|
1301
|
+
|
914
1302
|
def test_yylex_integer_oct_bad_underscores
|
915
1303
|
util_bad_token "01__23"
|
916
1304
|
end
|
@@ -1060,11 +1448,20 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1060
1448
|
util_lex_token(" (", :tLPAREN_ARG, "(")
|
1061
1449
|
end
|
1062
1450
|
|
1063
|
-
def
|
1451
|
+
def test_yylex_open_bracket_exprarg__18
|
1452
|
+
setup_lexer_class Ruby18Parser
|
1453
|
+
|
1064
1454
|
@lex.lex_state = :expr_arg
|
1065
1455
|
util_lex_token(" (", :tLPAREN2, "(")
|
1066
1456
|
end
|
1067
1457
|
|
1458
|
+
def test_yylex_open_bracket_exprarg__19
|
1459
|
+
setup_lexer_class Ruby19Parser
|
1460
|
+
|
1461
|
+
@lex.lex_state = :expr_arg
|
1462
|
+
util_lex_token(" (", :tLPAREN_ARG, "(")
|
1463
|
+
end
|
1464
|
+
|
1068
1465
|
def test_yylex_open_curly_bracket
|
1069
1466
|
util_lex_token("{",
|
1070
1467
|
:tLBRACE, "{")
|
@@ -1166,6 +1563,13 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1166
1563
|
util_lex_token "+@", :tUPLUS, "+@"
|
1167
1564
|
end
|
1168
1565
|
|
1566
|
+
def test_yylex_not_unary_method
|
1567
|
+
skip "not yet"
|
1568
|
+
|
1569
|
+
@lex.lex_state = :expr_fname
|
1570
|
+
util_lex_token "!@", :tUBANG, "!@"
|
1571
|
+
end
|
1572
|
+
|
1169
1573
|
def test_yylex_numbers
|
1170
1574
|
util_lex_token "0b10", :tINTEGER, 2
|
1171
1575
|
util_lex_token "0B10", :tINTEGER, 2
|
@@ -1211,13 +1615,13 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1211
1615
|
end
|
1212
1616
|
|
1213
1617
|
def test_yylex_question__18
|
1214
|
-
|
1618
|
+
setup_lexer_class Ruby18Parser
|
1215
1619
|
|
1216
1620
|
util_lex_token "?*", :tINTEGER, 42
|
1217
1621
|
end
|
1218
1622
|
|
1219
1623
|
def test_yylex_question__19
|
1220
|
-
|
1624
|
+
setup_lexer_class Ruby19Parser
|
1221
1625
|
|
1222
1626
|
util_lex_token "?*", :tSTRING, "*"
|
1223
1627
|
end
|
@@ -1236,7 +1640,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1236
1640
|
end
|
1237
1641
|
|
1238
1642
|
def test_yylex_question_ws_backslashed__18
|
1239
|
-
|
1643
|
+
setup_lexer_class Ruby18Parser
|
1240
1644
|
|
1241
1645
|
@lex.lex_state = :expr_beg
|
1242
1646
|
util_lex_token "?\\ ", :tINTEGER, 32
|
@@ -1253,7 +1657,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1253
1657
|
end
|
1254
1658
|
|
1255
1659
|
def test_yylex_question_ws_backslashed__19
|
1256
|
-
|
1660
|
+
setup_lexer_class Ruby19Parser
|
1257
1661
|
|
1258
1662
|
@lex.lex_state = :expr_beg
|
1259
1663
|
util_lex_token "?\\ ", :tSTRING, " "
|
@@ -1617,8 +2021,17 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1617
2021
|
end
|
1618
2022
|
|
1619
2023
|
def test_yylex_string_double_escape_M
|
2024
|
+
chr = "\341"
|
2025
|
+
chr.force_encoding("UTF-8") if RubyLexer::RUBY19
|
2026
|
+
|
1620
2027
|
util_lex_token('"\\M-a"',
|
1621
|
-
:tSTRING,
|
2028
|
+
:tSTRING, chr)
|
2029
|
+
end
|
2030
|
+
|
2031
|
+
def test_why_does_ruby_hate_me?
|
2032
|
+
util_lex_token('"Nl%\000\000A\000\999"', # you should be ashamed
|
2033
|
+
:tSTRING,
|
2034
|
+
["Nl%", "\x00", "\x00", "A", "\x00", "999"].join)
|
1622
2035
|
end
|
1623
2036
|
|
1624
2037
|
def test_yylex_string_double_escape_M_backslash
|
@@ -1684,6 +2097,11 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1684
2097
|
:tSTRING, "n = ABC")
|
1685
2098
|
end
|
1686
2099
|
|
2100
|
+
def test_yylex_string_double_escape_octal_fucked
|
2101
|
+
util_lex_token('"n = \\444"',
|
2102
|
+
:tSTRING, "n = $")
|
2103
|
+
end
|
2104
|
+
|
1687
2105
|
def test_yylex_string_double_interp
|
1688
2106
|
util_lex_token("\"blah #x a \#@a b \#$b c \#{3} # \"",
|
1689
2107
|
:tSTRING_BEG, "\"",
|
@@ -1717,6 +2135,30 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1717
2135
|
:tSTRING, "\000")
|
1718
2136
|
end
|
1719
2137
|
|
2138
|
+
def test_yylex_string_pct_i
|
2139
|
+
util_lex_token("%i[s1 s2\ns3]",
|
2140
|
+
:tQSYMBOLS_BEG, "%i[",
|
2141
|
+
:tSTRING_CONTENT, "s1",
|
2142
|
+
:tSPACE, nil,
|
2143
|
+
:tSTRING_CONTENT, "s2",
|
2144
|
+
:tSPACE, nil,
|
2145
|
+
:tSTRING_CONTENT, "s3",
|
2146
|
+
:tSPACE, nil,
|
2147
|
+
:tSTRING_END, nil)
|
2148
|
+
end
|
2149
|
+
|
2150
|
+
def test_yylex_string_pct_I
|
2151
|
+
util_lex_token("%I[s1 s2\ns3]",
|
2152
|
+
:tSYMBOLS_BEG, "%I[",
|
2153
|
+
:tSTRING_CONTENT, "s1",
|
2154
|
+
:tSPACE, nil,
|
2155
|
+
:tSTRING_CONTENT, "s2",
|
2156
|
+
:tSPACE, nil,
|
2157
|
+
:tSTRING_CONTENT, "s3",
|
2158
|
+
:tSPACE, nil,
|
2159
|
+
:tSTRING_END, nil)
|
2160
|
+
end
|
2161
|
+
|
1720
2162
|
def test_yylex_string_pct_Q
|
1721
2163
|
util_lex_token("%Q[s1 s2]",
|
1722
2164
|
:tSTRING_BEG, "%Q[",
|
@@ -1877,7 +2319,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1877
2319
|
|
1878
2320
|
def test_yylex_underscore_end
|
1879
2321
|
@lex.src = "__END__\n"
|
1880
|
-
|
2322
|
+
refute @lex.advance
|
1881
2323
|
end
|
1882
2324
|
|
1883
2325
|
def test_yylex_uplus
|
@@ -1943,7 +2385,7 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1943
2385
|
|
1944
2386
|
def util_escape expected, input
|
1945
2387
|
@lex.src = input
|
1946
|
-
assert_equal expected, @lex.read_escape
|
2388
|
+
assert_equal expected, @lex.read_escape, input
|
1947
2389
|
end
|
1948
2390
|
|
1949
2391
|
def util_escape_bad input
|
@@ -1956,7 +2398,11 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1956
2398
|
def util_lex_fname name, type, end_state = :expr_arg
|
1957
2399
|
@lex.lex_state = :expr_fname # can only set via parser's defs
|
1958
2400
|
|
1959
|
-
|
2401
|
+
assert_lex("def #{name} ",
|
2402
|
+
nil,
|
2403
|
+
|
2404
|
+
:kDEF, "def", :expr_fname, 0, 0,
|
2405
|
+
type, name, end_state, 0, 0)
|
1960
2406
|
|
1961
2407
|
assert_equal end_state, @lex.lex_state
|
1962
2408
|
end
|
@@ -1968,9 +2414,10 @@ class TestRubyLexer < MiniTest::Unit::TestCase
|
|
1968
2414
|
token = args.shift
|
1969
2415
|
value = args.shift
|
1970
2416
|
assert @lex.advance, "no more tokens"
|
2417
|
+
# assert_equal [token, value].map(&:encoding), [@lex.token, [@lex.yacc_value].flatten.first].map(&:encoding), input # TODO
|
1971
2418
|
assert_equal [token, value], [@lex.token, [@lex.yacc_value].flatten.first], input
|
1972
2419
|
end
|
1973
2420
|
|
1974
|
-
|
2421
|
+
refute @lex.advance, "must be empty, but had #{[@lex.token, @lex.yacc_value].inspect}"
|
1975
2422
|
end
|
1976
2423
|
end
|