parser 2.4.0.2 → 2.5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -6
- data/CHANGELOG.md +35 -1
- data/Gemfile +2 -0
- data/README.md +1 -2
- data/Rakefile +2 -1
- data/bin/ruby-parse +2 -1
- data/bin/ruby-rewrite +2 -1
- data/lib/gauntlet_parser.rb +2 -0
- data/lib/parser.rb +16 -17
- data/lib/parser/all.rb +2 -0
- data/lib/parser/ast/node.rb +2 -0
- data/lib/parser/ast/processor.rb +2 -0
- data/lib/parser/base.rb +6 -12
- data/lib/parser/builders/default.rb +28 -47
- data/lib/parser/clobbering_error.rb +2 -0
- data/lib/parser/context.rb +42 -0
- data/lib/parser/current.rb +4 -20
- data/lib/parser/deprecation.rb +13 -0
- data/lib/parser/diagnostic.rb +3 -3
- data/lib/parser/diagnostic/engine.rb +2 -0
- data/lib/parser/lexer.rl +122 -60
- data/lib/parser/lexer/dedenter.rb +2 -0
- data/lib/parser/lexer/explanation.rb +2 -0
- data/lib/parser/lexer/literal.rb +4 -9
- data/lib/parser/lexer/stack_state.rb +4 -1
- data/lib/parser/macruby.y +32 -17
- data/lib/parser/messages.rb +14 -0
- data/lib/parser/meta.rb +2 -0
- data/lib/parser/rewriter.rb +30 -44
- data/lib/parser/ruby18.y +20 -13
- data/lib/parser/ruby19.y +32 -17
- data/lib/parser/ruby20.y +33 -18
- data/lib/parser/ruby21.y +32 -17
- data/lib/parser/ruby22.y +32 -17
- data/lib/parser/ruby23.y +32 -17
- data/lib/parser/ruby24.y +63 -46
- data/lib/parser/ruby25.y +72 -48
- data/lib/parser/rubymotion.y +33 -18
- data/lib/parser/runner.rb +4 -7
- data/lib/parser/runner/ruby_parse.rb +10 -0
- data/lib/parser/runner/ruby_rewrite.rb +2 -0
- data/lib/parser/source/buffer.rb +19 -24
- data/lib/parser/source/comment.rb +2 -0
- data/lib/parser/source/comment/associator.rb +2 -0
- data/lib/parser/source/map.rb +2 -0
- data/lib/parser/source/map/collection.rb +2 -0
- data/lib/parser/source/map/condition.rb +2 -0
- data/lib/parser/source/map/constant.rb +2 -0
- data/lib/parser/source/map/definition.rb +2 -0
- data/lib/parser/source/map/for.rb +2 -0
- data/lib/parser/source/map/heredoc.rb +2 -0
- data/lib/parser/source/map/keyword.rb +2 -0
- data/lib/parser/source/map/objc_kwarg.rb +2 -0
- data/lib/parser/source/map/operator.rb +2 -0
- data/lib/parser/source/map/rescue_body.rb +2 -0
- data/lib/parser/source/map/send.rb +2 -0
- data/lib/parser/source/map/ternary.rb +2 -0
- data/lib/parser/source/map/variable.rb +2 -0
- data/lib/parser/source/range.rb +81 -13
- data/lib/parser/source/rewriter.rb +48 -10
- data/lib/parser/source/rewriter/action.rb +2 -0
- data/lib/parser/source/tree_rewriter.rb +301 -0
- data/lib/parser/source/tree_rewriter/action.rb +133 -0
- data/lib/parser/static_environment.rb +2 -0
- data/lib/parser/syntax_error.rb +2 -0
- data/lib/parser/tree_rewriter.rb +133 -0
- data/lib/parser/version.rb +3 -1
- data/parser.gemspec +4 -1
- data/test/bug_163/fixtures/input.rb +2 -0
- data/test/bug_163/fixtures/output.rb +2 -0
- data/test/bug_163/rewriter.rb +2 -0
- data/test/helper.rb +7 -7
- data/test/parse_helper.rb +57 -10
- data/test/racc_coverage_helper.rb +2 -0
- data/test/test_base.rb +2 -0
- data/test/test_current.rb +2 -4
- data/test/test_diagnostic.rb +3 -1
- data/test/test_diagnostic_engine.rb +2 -0
- data/test/test_encoding.rb +61 -49
- data/test/test_lexer.rb +164 -77
- data/test/test_lexer_stack_state.rb +2 -0
- data/test/test_parse_helper.rb +8 -8
- data/test/test_parser.rb +613 -51
- data/test/test_runner_rewrite.rb +47 -0
- data/test/test_source_buffer.rb +22 -10
- data/test/test_source_comment.rb +2 -0
- data/test/test_source_comment_associator.rb +2 -0
- data/test/test_source_map.rb +2 -0
- data/test/test_source_range.rb +92 -45
- data/test/test_source_rewriter.rb +3 -1
- data/test/test_source_rewriter_action.rb +2 -0
- data/test/test_source_tree_rewriter.rb +177 -0
- data/test/test_static_environment.rb +2 -0
- data/test/using_tree_rewriter/fixtures/input.rb +3 -0
- data/test/using_tree_rewriter/fixtures/output.rb +3 -0
- data/test/using_tree_rewriter/using_tree_rewriter.rb +9 -0
- metadata +21 -10
- data/lib/parser/compatibility/ruby1_8.rb +0 -20
- data/lib/parser/compatibility/ruby1_9.rb +0 -32
- data/test/bug_163/test_runner_rewrite.rb +0 -35
data/test/test_lexer.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: ascii-8bit
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'helper'
|
4
5
|
require 'complex'
|
@@ -22,11 +23,7 @@ class TestLexer < Minitest::Test
|
|
22
23
|
#
|
23
24
|
|
24
25
|
def utf(str)
|
25
|
-
|
26
|
-
str.force_encoding(Encoding::UTF_8)
|
27
|
-
else
|
28
|
-
str
|
29
|
-
end
|
26
|
+
str.dup.force_encoding(Encoding::UTF_8)
|
30
27
|
end
|
31
28
|
|
32
29
|
#
|
@@ -42,20 +39,14 @@ class TestLexer < Minitest::Test
|
|
42
39
|
def assert_escape(expected, input)
|
43
40
|
source_buffer = Parser::Source::Buffer.new('(assert_escape)')
|
44
41
|
|
45
|
-
|
46
|
-
source_buffer.source = "\"\\#{input}\"".encode(input.encoding)
|
47
|
-
else
|
48
|
-
source_buffer.source = "\"\\#{input}\""
|
49
|
-
end
|
42
|
+
source_buffer.source = "\"\\#{input}\"".encode(input.encoding)
|
50
43
|
|
51
44
|
@lex.reset
|
52
45
|
@lex.source_buffer = source_buffer
|
53
46
|
|
54
47
|
lex_token, (lex_value, *) = @lex.advance
|
55
48
|
|
56
|
-
|
57
|
-
lex_value.force_encoding(Encoding::BINARY)
|
58
|
-
end
|
49
|
+
lex_value.force_encoding(Encoding::BINARY)
|
59
50
|
|
60
51
|
assert_equal [:tSTRING, expected],
|
61
52
|
[lex_token, lex_value],
|
@@ -156,23 +147,19 @@ class TestLexer < Minitest::Test
|
|
156
147
|
end
|
157
148
|
|
158
149
|
def test_read_escape_unicode__19
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
assert_escape "\x09\x01", 'u{9 1}'
|
150
|
+
assert_escape "\x09", 'u{9}'
|
151
|
+
assert_escape "\x31", 'u{31}'
|
152
|
+
assert_escape "\x09\x01", 'u{9 1}'
|
163
153
|
|
164
|
-
|
165
|
-
|
166
|
-
end
|
154
|
+
assert_escape "\xc4\xa3", utf('u0123')
|
155
|
+
assert_escape "\xc4\xa3\xc3\xb0\xeb\x84\xa3", utf('u{123 f0 B123}')
|
167
156
|
end
|
168
157
|
|
169
158
|
def test_read_escape_unicode_bad__19
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
refute_escape 'u{123 f0'
|
175
|
-
end
|
159
|
+
refute_escape 'u123'
|
160
|
+
refute_escape 'u{}'
|
161
|
+
refute_escape 'u{123 f0h}'
|
162
|
+
refute_escape 'u{123 f0'
|
176
163
|
end
|
177
164
|
|
178
165
|
def test_ambiguous_uminus
|
@@ -974,6 +961,34 @@ class TestLexer < Minitest::Test
|
|
974
961
|
:tNL, nil, [8, 9])
|
975
962
|
end
|
976
963
|
|
964
|
+
def test_heredoc_with_identifier_ending_newline__19
|
965
|
+
setup_lexer 19
|
966
|
+
refute_scanned "<<\"EOS\n\"\n123\nEOS\n"
|
967
|
+
end
|
968
|
+
|
969
|
+
def test_heredoc_with_identifier_ending_newline__24
|
970
|
+
setup_lexer 24
|
971
|
+
|
972
|
+
assert_scanned("a = <<\"EOS\n\"\nABCDEF\nEOS\n",
|
973
|
+
:tIDENTIFIER, "a", [0, 1],
|
974
|
+
:tEQL, "=", [2, 3],
|
975
|
+
:tSTRING_BEG, "<<\"", [4, 12],
|
976
|
+
:tSTRING_CONTENT, "ABCDEF\n", [13, 20],
|
977
|
+
:tSTRING_END, "EOS", [20, 23],
|
978
|
+
:tNL, nil, [12, 13])
|
979
|
+
end
|
980
|
+
|
981
|
+
def test_heredoc_with_identifier_containing_newline_inside__19
|
982
|
+
setup_lexer 19
|
983
|
+
refute_scanned "<<\"EOS\nEOS\"\n123\nEOS\n"
|
984
|
+
end
|
985
|
+
|
986
|
+
def test_heredoc_with_identifier_containing_newline_inside__24
|
987
|
+
setup_lexer 24
|
988
|
+
|
989
|
+
refute_scanned "<<\"EOS\nEOS\"\n123\nEOS\n"
|
990
|
+
end
|
991
|
+
|
977
992
|
def test_identifier
|
978
993
|
assert_scanned("identifier",
|
979
994
|
:tIDENTIFIER, "identifier", [0, 10])
|
@@ -1171,20 +1186,16 @@ class TestLexer < Minitest::Test
|
|
1171
1186
|
end
|
1172
1187
|
|
1173
1188
|
def test_question_eh_escape_u_4_digits
|
1174
|
-
|
1175
|
-
|
1176
|
-
assert_scanned '?\\u0001', :tCHARACTER, "\u0001", [0, 7]
|
1177
|
-
end
|
1189
|
+
setup_lexer 19
|
1190
|
+
assert_scanned '?\\u0001', :tCHARACTER, "\u0001", [0, 7]
|
1178
1191
|
end
|
1179
1192
|
|
1180
1193
|
def test_question_eh_single_unicode_point
|
1181
|
-
|
1182
|
-
|
1183
|
-
assert_scanned '?\\u{123}', :tCHARACTER, "\u0123", [0, 8]
|
1194
|
+
setup_lexer 19
|
1195
|
+
assert_scanned '?\\u{123}', :tCHARACTER, "\u0123", [0, 8]
|
1184
1196
|
|
1185
|
-
|
1186
|
-
|
1187
|
-
end
|
1197
|
+
setup_lexer 19
|
1198
|
+
assert_scanned '?\\u{a}', :tCHARACTER, "\n", [0, 6]
|
1188
1199
|
end
|
1189
1200
|
|
1190
1201
|
def test_question_eh_multiple_unicode_points
|
@@ -1201,6 +1212,46 @@ class TestLexer < Minitest::Test
|
|
1201
1212
|
refute_scanned '?\\u{123'
|
1202
1213
|
end
|
1203
1214
|
|
1215
|
+
def test_question_eh_escape_space_around_unicode_point__19
|
1216
|
+
setup_lexer 19
|
1217
|
+
refute_scanned '"\\u{1 }"'
|
1218
|
+
|
1219
|
+
setup_lexer 19
|
1220
|
+
refute_scanned '"\\u{ 1}"'
|
1221
|
+
|
1222
|
+
setup_lexer 19
|
1223
|
+
refute_scanned '"\\u{ 1 }"'
|
1224
|
+
|
1225
|
+
setup_lexer 19
|
1226
|
+
refute_scanned '"\\u{1 2 }"'
|
1227
|
+
|
1228
|
+
setup_lexer 19
|
1229
|
+
refute_scanned '"\\u{ 1 2}"'
|
1230
|
+
|
1231
|
+
setup_lexer 19
|
1232
|
+
refute_scanned '"\\u{1 2}"'
|
1233
|
+
end
|
1234
|
+
|
1235
|
+
def test_question_eh_escape_space_around_unicode_point__24
|
1236
|
+
setup_lexer 24
|
1237
|
+
assert_scanned '"\\u{ 1}"', :tSTRING, "\u0001", [0, 8]
|
1238
|
+
|
1239
|
+
setup_lexer 24
|
1240
|
+
assert_scanned '"\\u{1 }"', :tSTRING, "\u0001", [0, 8]
|
1241
|
+
|
1242
|
+
setup_lexer 24
|
1243
|
+
assert_scanned '"\\u{ 1 }"', :tSTRING, "\u0001", [0, 9]
|
1244
|
+
|
1245
|
+
setup_lexer 24
|
1246
|
+
assert_scanned '"\\u{1 2 }"', :tSTRING, "\u0001\u0002", [0, 10]
|
1247
|
+
|
1248
|
+
setup_lexer 24
|
1249
|
+
assert_scanned '"\\u{ 1 2}"', :tSTRING, "\u0001\u0002", [0, 10]
|
1250
|
+
|
1251
|
+
setup_lexer 24
|
1252
|
+
assert_scanned '"\\u{1 2}"', :tSTRING, "\u0001\u0002", [0, 10]
|
1253
|
+
end
|
1254
|
+
|
1204
1255
|
def test_integer_hex
|
1205
1256
|
assert_scanned "0x2a", :tINTEGER, 42, [0, 4]
|
1206
1257
|
end
|
@@ -2836,19 +2887,17 @@ class TestLexer < Minitest::Test
|
|
2836
2887
|
# Handling of encoding-related issues.
|
2837
2888
|
#
|
2838
2889
|
|
2839
|
-
|
2840
|
-
|
2841
|
-
|
2842
|
-
|
2843
|
-
|
2844
|
-
|
2845
|
-
|
2846
|
-
|
2847
|
-
|
2848
|
-
|
2849
|
-
|
2850
|
-
assert_equal Encoding::UTF_8, str.encoding
|
2851
|
-
end
|
2890
|
+
def test_transcoded_source_is_converted_back_to_original_encoding
|
2891
|
+
setup_lexer(19)
|
2892
|
+
@lex.force_utf32 = true
|
2893
|
+
@lex.tokens = []
|
2894
|
+
assert_scanned(utf('"a" + "b"'),
|
2895
|
+
:tSTRING, "a", [0, 3],
|
2896
|
+
:tPLUS, "+", [4, 5],
|
2897
|
+
:tSTRING, "b", [6, 9])
|
2898
|
+
|
2899
|
+
@lex.tokens.each do |_type, (str, _range)|
|
2900
|
+
assert_equal Encoding::UTF_8, str.encoding
|
2852
2901
|
end
|
2853
2902
|
end
|
2854
2903
|
|
@@ -3286,21 +3335,17 @@ class TestLexer < Minitest::Test
|
|
3286
3335
|
assert_scanned(%q{"\xE2\x80\x99"},
|
3287
3336
|
:tSTRING, "\xE2\x80\x99", [0, 14])
|
3288
3337
|
|
3289
|
-
|
3290
|
-
|
3291
|
-
|
3292
|
-
|
3293
|
-
|
3294
|
-
|
3295
|
-
:tSTRING, utf('’'), [0, 20])
|
3296
|
-
end
|
3338
|
+
assert_scanned(utf(%q{"\xE2\x80\x99"}),
|
3339
|
+
:tSTRING, utf('’'), [0, 14])
|
3340
|
+
assert_scanned(utf(%q{"\342\200\231"}),
|
3341
|
+
:tSTRING, utf('’'), [0, 14])
|
3342
|
+
assert_scanned(utf(%q{"\M-b\C-\M-@\C-\M-Y"}),
|
3343
|
+
:tSTRING, utf('’'), [0, 20])
|
3297
3344
|
end
|
3298
3345
|
|
3299
3346
|
def test_bug_string_utf_escape_noop
|
3300
|
-
|
3301
|
-
|
3302
|
-
:tSTRING, utf("あ"), [0, 4])
|
3303
|
-
end
|
3347
|
+
assert_scanned(utf(%q{"\あ"}),
|
3348
|
+
:tSTRING, utf("あ"), [0, 4])
|
3304
3349
|
end
|
3305
3350
|
|
3306
3351
|
def test_bug_string_non_utf
|
@@ -3309,10 +3354,8 @@ class TestLexer < Minitest::Test
|
|
3309
3354
|
assert_scanned(%Q{"caf\xC3\xA9"},
|
3310
3355
|
:tSTRING, "caf\xC3\xA9", [0, 7])
|
3311
3356
|
|
3312
|
-
|
3313
|
-
|
3314
|
-
:tSTRING, utf("café"), [0, 6])
|
3315
|
-
end
|
3357
|
+
assert_scanned(utf(%q{"café"}),
|
3358
|
+
:tSTRING, utf("café"), [0, 6])
|
3316
3359
|
end
|
3317
3360
|
|
3318
3361
|
def test_bug_semi__END__
|
@@ -3383,19 +3426,17 @@ class TestLexer < Minitest::Test
|
|
3383
3426
|
:kIF_MOD, 'if', [3, 5])
|
3384
3427
|
end
|
3385
3428
|
|
3386
|
-
|
3387
|
-
|
3388
|
-
|
3389
|
-
|
3390
|
-
|
3391
|
-
end
|
3429
|
+
def test_bug_unicode_in_literal
|
3430
|
+
setup_lexer(19)
|
3431
|
+
assert_scanned('"\u00a4"',
|
3432
|
+
:tSTRING, "\u00a4", [0, 8])
|
3433
|
+
end
|
3392
3434
|
|
3393
|
-
|
3394
|
-
|
3395
|
-
|
3396
|
-
|
3397
|
-
|
3398
|
-
end
|
3435
|
+
def test_bug_utf32le_leak
|
3436
|
+
setup_lexer(19)
|
3437
|
+
@lex.force_utf32 = true
|
3438
|
+
assert_scanned('"F0"',
|
3439
|
+
:tSTRING, "F0", [0, 4])
|
3399
3440
|
end
|
3400
3441
|
|
3401
3442
|
def test_bug_ragel_stack
|
@@ -3411,4 +3452,50 @@ class TestLexer < Minitest::Test
|
|
3411
3452
|
:tSTRING_END, "\"", [15, 16])
|
3412
3453
|
end
|
3413
3454
|
|
3455
|
+
def test_bug_423
|
3456
|
+
@lex.state = :expr_beg
|
3457
|
+
assert_scanned(':&&',
|
3458
|
+
:tSYMBEG, ':', [0, 1],
|
3459
|
+
:tANDOP, '&&', [1, 3])
|
3460
|
+
|
3461
|
+
@lex.state = :expr_beg
|
3462
|
+
assert_scanned(':||',
|
3463
|
+
:tSYMBEG, ':', [0, 1],
|
3464
|
+
:tOROP, '||', [1, 3])
|
3465
|
+
end
|
3466
|
+
|
3467
|
+
def test_bug_418
|
3468
|
+
setup_lexer 19
|
3469
|
+
|
3470
|
+
assert_scanned("{\n=begin\nx: 1,\n=end\ny: 2}",
|
3471
|
+
:tLBRACE, '{', [0, 1],
|
3472
|
+
:tLABEL, 'y', [20, 22],
|
3473
|
+
:tINTEGER, 2, [23, 24],
|
3474
|
+
:tRCURLY, '}', [24, 25])
|
3475
|
+
end
|
3476
|
+
|
3477
|
+
def test_bug_407
|
3478
|
+
setup_lexer(21)
|
3479
|
+
|
3480
|
+
assert_scanned('123if cond',
|
3481
|
+
:tINTEGER, 123, [0, 3],
|
3482
|
+
:kIF_MOD, 'if', [3, 5],
|
3483
|
+
:tIDENTIFIER, 'cond', [6, 10])
|
3484
|
+
|
3485
|
+
assert_scanned('1.23if cond',
|
3486
|
+
:tFLOAT, 1.23, [0, 4],
|
3487
|
+
:kIF_MOD, 'if', [4, 6],
|
3488
|
+
:tIDENTIFIER, 'cond', [7, 11])
|
3489
|
+
|
3490
|
+
assert_scanned('123rescue cond',
|
3491
|
+
:tINTEGER, 123, [0, 3],
|
3492
|
+
:kRESCUE_MOD, 'rescue', [3, 9],
|
3493
|
+
:tIDENTIFIER, 'cond', [10, 14])
|
3494
|
+
|
3495
|
+
assert_scanned('1.23rescue cond',
|
3496
|
+
:tFLOAT, 1.23, [0, 4],
|
3497
|
+
:kRESCUE_MOD, 'rescue', [4, 10],
|
3498
|
+
:tIDENTIFIER, 'cond', [11, 15])
|
3499
|
+
end
|
3500
|
+
|
3414
3501
|
end
|
data/test/test_parse_helper.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'helper'
|
2
4
|
require 'parse_helper'
|
3
5
|
|
@@ -8,16 +10,14 @@ class TestParseHelper < Minitest::Test
|
|
8
10
|
assert_instance_of Parser::Ruby18,
|
9
11
|
parser_for_ruby_version('1.8')
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
parser_for_ruby_version('1.9')
|
13
|
+
assert_instance_of Parser::Ruby19,
|
14
|
+
parser_for_ruby_version('1.9')
|
14
15
|
|
15
|
-
|
16
|
-
|
16
|
+
assert_instance_of Parser::Ruby20,
|
17
|
+
parser_for_ruby_version('2.0')
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
end
|
19
|
+
assert_instance_of Parser::Ruby21,
|
20
|
+
parser_for_ruby_version('2.1')
|
21
21
|
end
|
22
22
|
|
23
23
|
def parse_maps(what)
|
data/test/test_parser.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
# encoding:utf-8
|
1
|
+
# encoding: utf-8
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'helper'
|
4
5
|
require 'parse_helper'
|
@@ -1102,6 +1103,21 @@ class TestParser < Minitest::Test
|
|
1102
1103
|
[:error, :dynamic_const],
|
1103
1104
|
%q{def f; ::Bar = 1; end},
|
1104
1105
|
%q{ ~~~~~ location})
|
1106
|
+
|
1107
|
+
assert_diagnoses(
|
1108
|
+
[:error, :dynamic_const],
|
1109
|
+
%q{def self.f; Foo = 1; end},
|
1110
|
+
%q{ ~~~ location})
|
1111
|
+
|
1112
|
+
assert_diagnoses(
|
1113
|
+
[:error, :dynamic_const],
|
1114
|
+
%q{def self.f; Foo::Bar = 1; end},
|
1115
|
+
%q{ ~~~~~~~~ location})
|
1116
|
+
|
1117
|
+
assert_diagnoses(
|
1118
|
+
[:error, :dynamic_const],
|
1119
|
+
%q{def self.f; ::Bar = 1; end},
|
1120
|
+
%q{ ~~~~~ location})
|
1105
1121
|
end
|
1106
1122
|
|
1107
1123
|
# Multiple assignment
|
@@ -1732,6 +1748,11 @@ class TestParser < Minitest::Test
|
|
1732
1748
|
[:error, :class_in_def],
|
1733
1749
|
%q{def a; class Foo; end; end},
|
1734
1750
|
%q{ ^^^^^ location})
|
1751
|
+
|
1752
|
+
assert_diagnoses(
|
1753
|
+
[:error, :class_in_def],
|
1754
|
+
%q{def self.a; class Foo; end; end},
|
1755
|
+
%q{ ^^^^^ location})
|
1735
1756
|
end
|
1736
1757
|
|
1737
1758
|
def test_sclass
|
@@ -5204,39 +5225,37 @@ class TestParser < Minitest::Test
|
|
5204
5225
|
end
|
5205
5226
|
end
|
5206
5227
|
|
5207
|
-
|
5208
|
-
|
5209
|
-
|
5210
|
-
|
5211
|
-
|
5212
|
-
|
5213
|
-
|
5214
|
-
end
|
5228
|
+
def test_bom
|
5229
|
+
assert_parses(
|
5230
|
+
s(:int, 1),
|
5231
|
+
%Q{\xef\xbb\xbf1}.dup.force_encoding(Encoding::BINARY),
|
5232
|
+
%q{},
|
5233
|
+
%w(1.9 2.0 2.1))
|
5234
|
+
end
|
5215
5235
|
|
5216
|
-
|
5217
|
-
|
5218
|
-
|
5219
|
-
|
5220
|
-
|
5221
|
-
|
5222
|
-
|
5223
|
-
|
5224
|
-
|
5225
|
-
|
5226
|
-
|
5227
|
-
|
5236
|
+
def test_magic_encoding_comment
|
5237
|
+
assert_parses(
|
5238
|
+
s(:begin,
|
5239
|
+
s(:lvasgn, :"проверка", s(:int, 42)),
|
5240
|
+
s(:send, nil, :puts, s(:lvar, :"проверка"))),
|
5241
|
+
%Q{# coding:koi8-r
|
5242
|
+
\xd0\xd2\xcf\xd7\xc5\xd2\xcb\xc1 = 42
|
5243
|
+
puts \xd0\xd2\xcf\xd7\xc5\xd2\xcb\xc1}.dup.
|
5244
|
+
force_encoding(Encoding::BINARY),
|
5245
|
+
%q{},
|
5246
|
+
%w(1.9 2.0 2.1))
|
5247
|
+
end
|
5228
5248
|
|
5229
|
-
|
5230
|
-
|
5231
|
-
|
5232
|
-
|
5233
|
-
|
5234
|
-
|
5235
|
-
|
5236
|
-
|
5237
|
-
|
5238
|
-
|
5239
|
-
end
|
5249
|
+
def test_regexp_encoding
|
5250
|
+
assert_parses(
|
5251
|
+
s(:match_with_lvasgn,
|
5252
|
+
s(:regexp,
|
5253
|
+
s(:str, "\\xa8"),
|
5254
|
+
s(:regopt, :n)),
|
5255
|
+
s(:str, "")),
|
5256
|
+
%q{/\xa8/n =~ ""}.dup.force_encoding(Encoding::UTF_8),
|
5257
|
+
%{},
|
5258
|
+
SINCE_1_9)
|
5240
5259
|
end
|
5241
5260
|
|
5242
5261
|
#
|
@@ -5460,25 +5479,23 @@ class TestParser < Minitest::Test
|
|
5460
5479
|
end
|
5461
5480
|
|
5462
5481
|
def test_bug_ascii_8bit_in_literal
|
5463
|
-
|
5464
|
-
|
5465
|
-
|
5466
|
-
|
5467
|
-
|
5468
|
-
|
5469
|
-
|
5470
|
-
|
5471
|
-
|
5472
|
-
|
5473
|
-
|
5474
|
-
|
5475
|
-
|
5476
|
-
|
5477
|
-
|
5478
|
-
|
5479
|
-
|
5480
|
-
ALL_VERSIONS)
|
5481
|
-
end
|
5482
|
+
assert_diagnoses(
|
5483
|
+
[:error, :invalid_encoding],
|
5484
|
+
%q{".\xc3."},
|
5485
|
+
%q{^^^^^^^^ location},
|
5486
|
+
ALL_VERSIONS)
|
5487
|
+
|
5488
|
+
assert_diagnoses(
|
5489
|
+
[:error, :invalid_encoding],
|
5490
|
+
%q{%W"x .\xc3."},
|
5491
|
+
%q{ ^^^^^^ location},
|
5492
|
+
ALL_VERSIONS)
|
5493
|
+
|
5494
|
+
assert_diagnoses(
|
5495
|
+
[:error, :invalid_encoding],
|
5496
|
+
%q{:".\xc3."},
|
5497
|
+
%q{ ^^^^^^ location},
|
5498
|
+
ALL_VERSIONS)
|
5482
5499
|
|
5483
5500
|
assert_diagnoses(
|
5484
5501
|
[:error, :invalid_encoding],
|
@@ -5969,6 +5986,170 @@ class TestParser < Minitest::Test
|
|
5969
5986
|
%q{ ^^^^^^ location})
|
5970
5987
|
end
|
5971
5988
|
|
5989
|
+
def test_ruby_bug_11873
|
5990
|
+
# strings
|
5991
|
+
assert_parses(
|
5992
|
+
s(:block,
|
5993
|
+
s(:send, nil, :a,
|
5994
|
+
s(:block,
|
5995
|
+
s(:send, nil, :b),
|
5996
|
+
s(:args),
|
5997
|
+
s(:send, nil, :c, s(:send, nil, :d))),
|
5998
|
+
s(:str, "x")),
|
5999
|
+
s(:args),
|
6000
|
+
nil),
|
6001
|
+
%q{a b{c d}, "x" do end},
|
6002
|
+
%q{},
|
6003
|
+
SINCE_2_4)
|
6004
|
+
|
6005
|
+
assert_parses(
|
6006
|
+
s(:block,
|
6007
|
+
s(:send, nil, :a,
|
6008
|
+
s(:send, nil, :b,
|
6009
|
+
s(:send, nil, :c,
|
6010
|
+
s(:send, nil, :d))),
|
6011
|
+
s(:str, "x")),
|
6012
|
+
s(:args),
|
6013
|
+
nil),
|
6014
|
+
%q{a b(c d), "x" do end},
|
6015
|
+
%q{},
|
6016
|
+
SINCE_2_4)
|
6017
|
+
|
6018
|
+
assert_parses(
|
6019
|
+
s(:block,
|
6020
|
+
s(:send, nil, :a,
|
6021
|
+
s(:block,
|
6022
|
+
s(:send, nil, :b),
|
6023
|
+
s(:args),
|
6024
|
+
s(:send, nil, :c,
|
6025
|
+
s(:send, nil, :d))),
|
6026
|
+
s(:str, "x")),
|
6027
|
+
s(:args), nil),
|
6028
|
+
%q{a b{c(d)}, "x" do end},
|
6029
|
+
%q{},
|
6030
|
+
SINCE_2_4)
|
6031
|
+
|
6032
|
+
assert_parses(
|
6033
|
+
s(:block,
|
6034
|
+
s(:send, nil, :a,
|
6035
|
+
s(:send, nil, :b,
|
6036
|
+
s(:send, nil, :c,
|
6037
|
+
s(:send, nil, :d))),
|
6038
|
+
s(:str, "x")),
|
6039
|
+
s(:args), nil),
|
6040
|
+
%q{a b(c(d)), "x" do end},
|
6041
|
+
%q{},
|
6042
|
+
SINCE_2_4)
|
6043
|
+
|
6044
|
+
# regexps without options
|
6045
|
+
assert_parses(
|
6046
|
+
s(:block,
|
6047
|
+
s(:send, nil, :a,
|
6048
|
+
s(:block,
|
6049
|
+
s(:send, nil, :b),
|
6050
|
+
s(:args),
|
6051
|
+
s(:send, nil, :c, s(:send, nil, :d))),
|
6052
|
+
s(:regexp, s(:str, "x"), s(:regopt))),
|
6053
|
+
s(:args),
|
6054
|
+
nil),
|
6055
|
+
%q{a b{c d}, /x/ do end},
|
6056
|
+
%q{},
|
6057
|
+
SINCE_2_4)
|
6058
|
+
|
6059
|
+
assert_parses(
|
6060
|
+
s(:block,
|
6061
|
+
s(:send, nil, :a,
|
6062
|
+
s(:send, nil, :b,
|
6063
|
+
s(:send, nil, :c,
|
6064
|
+
s(:send, nil, :d))),
|
6065
|
+
s(:regexp, s(:str, "x"), s(:regopt))),
|
6066
|
+
s(:args),
|
6067
|
+
nil),
|
6068
|
+
%q{a b(c d), /x/ do end},
|
6069
|
+
%q{},
|
6070
|
+
SINCE_2_4)
|
6071
|
+
|
6072
|
+
assert_parses(
|
6073
|
+
s(:block,
|
6074
|
+
s(:send, nil, :a,
|
6075
|
+
s(:block,
|
6076
|
+
s(:send, nil, :b),
|
6077
|
+
s(:args),
|
6078
|
+
s(:send, nil, :c,
|
6079
|
+
s(:send, nil, :d))),
|
6080
|
+
s(:regexp, s(:str, "x"), s(:regopt))),
|
6081
|
+
s(:args), nil),
|
6082
|
+
%q{a b{c(d)}, /x/ do end},
|
6083
|
+
%q{},
|
6084
|
+
SINCE_2_4)
|
6085
|
+
|
6086
|
+
assert_parses(
|
6087
|
+
s(:block,
|
6088
|
+
s(:send, nil, :a,
|
6089
|
+
s(:send, nil, :b,
|
6090
|
+
s(:send, nil, :c,
|
6091
|
+
s(:send, nil, :d))),
|
6092
|
+
s(:regexp, s(:str, "x"), s(:regopt))),
|
6093
|
+
s(:args), nil),
|
6094
|
+
%q{a b(c(d)), /x/ do end},
|
6095
|
+
%q{},
|
6096
|
+
SINCE_2_4)
|
6097
|
+
|
6098
|
+
# regexps with options
|
6099
|
+
assert_parses(
|
6100
|
+
s(:block,
|
6101
|
+
s(:send, nil, :a,
|
6102
|
+
s(:block,
|
6103
|
+
s(:send, nil, :b),
|
6104
|
+
s(:args),
|
6105
|
+
s(:send, nil, :c, s(:send, nil, :d))),
|
6106
|
+
s(:regexp, s(:str, "x"), s(:regopt, :m))),
|
6107
|
+
s(:args),
|
6108
|
+
nil),
|
6109
|
+
%q{a b{c d}, /x/m do end},
|
6110
|
+
%q{},
|
6111
|
+
SINCE_2_4)
|
6112
|
+
|
6113
|
+
assert_parses(
|
6114
|
+
s(:block,
|
6115
|
+
s(:send, nil, :a,
|
6116
|
+
s(:send, nil, :b,
|
6117
|
+
s(:send, nil, :c,
|
6118
|
+
s(:send, nil, :d))),
|
6119
|
+
s(:regexp, s(:str, "x"), s(:regopt, :m))),
|
6120
|
+
s(:args),
|
6121
|
+
nil),
|
6122
|
+
%q{a b(c d), /x/m do end},
|
6123
|
+
%q{},
|
6124
|
+
SINCE_2_4)
|
6125
|
+
|
6126
|
+
assert_parses(
|
6127
|
+
s(:block,
|
6128
|
+
s(:send, nil, :a,
|
6129
|
+
s(:block,
|
6130
|
+
s(:send, nil, :b),
|
6131
|
+
s(:args),
|
6132
|
+
s(:send, nil, :c,
|
6133
|
+
s(:send, nil, :d))),
|
6134
|
+
s(:regexp, s(:str, "x"), s(:regopt, :m))),
|
6135
|
+
s(:args), nil),
|
6136
|
+
%q{a b{c(d)}, /x/m do end},
|
6137
|
+
%q{},
|
6138
|
+
SINCE_2_4)
|
6139
|
+
|
6140
|
+
assert_parses(
|
6141
|
+
s(:block,
|
6142
|
+
s(:send, nil, :a,
|
6143
|
+
s(:send, nil, :b,
|
6144
|
+
s(:send, nil, :c,
|
6145
|
+
s(:send, nil, :d))),
|
6146
|
+
s(:regexp, s(:str, "x"), s(:regopt, :m))),
|
6147
|
+
s(:args), nil),
|
6148
|
+
%q{a b(c(d)), /x/m do end},
|
6149
|
+
%q{},
|
6150
|
+
SINCE_2_4)
|
6151
|
+
end
|
6152
|
+
|
5972
6153
|
def test_parser_bug_198
|
5973
6154
|
assert_parses(
|
5974
6155
|
s(:array,
|
@@ -6021,4 +6202,385 @@ class TestParser < Minitest::Test
|
|
6021
6202
|
s(:regexp, s(:str, "#)"), s(:regopt, :x)),
|
6022
6203
|
%Q{/#)/x})
|
6023
6204
|
end
|
6205
|
+
|
6206
|
+
def test_bug_do_block_in_hash_brace
|
6207
|
+
assert_parses(
|
6208
|
+
s(:send, nil, :p,
|
6209
|
+
s(:sym, :foo),
|
6210
|
+
s(:hash,
|
6211
|
+
s(:pair,
|
6212
|
+
s(:sym, :a),
|
6213
|
+
s(:block,
|
6214
|
+
s(:send, nil, :proc),
|
6215
|
+
s(:args), nil)),
|
6216
|
+
s(:pair,
|
6217
|
+
s(:sym, :b),
|
6218
|
+
s(:block,
|
6219
|
+
s(:send, nil, :proc),
|
6220
|
+
s(:args), nil)))),
|
6221
|
+
%q{p :foo, {a: proc do end, b: proc do end}},
|
6222
|
+
%q{},
|
6223
|
+
SINCE_2_3)
|
6224
|
+
|
6225
|
+
assert_parses(
|
6226
|
+
s(:send, nil, :p,
|
6227
|
+
s(:sym, :foo),
|
6228
|
+
s(:hash,
|
6229
|
+
s(:pair,
|
6230
|
+
s(:sym, :a),
|
6231
|
+
s(:block,
|
6232
|
+
s(:send, nil, :proc),
|
6233
|
+
s(:args), nil)),
|
6234
|
+
s(:pair,
|
6235
|
+
s(:sym, :b),
|
6236
|
+
s(:block,
|
6237
|
+
s(:send, nil, :proc),
|
6238
|
+
s(:args), nil)))),
|
6239
|
+
%q{p :foo, {:a => proc do end, b: proc do end}},
|
6240
|
+
%q{},
|
6241
|
+
SINCE_2_3)
|
6242
|
+
|
6243
|
+
assert_parses(
|
6244
|
+
s(:send, nil, :p,
|
6245
|
+
s(:sym, :foo),
|
6246
|
+
s(:hash,
|
6247
|
+
s(:pair,
|
6248
|
+
s(:sym, :a),
|
6249
|
+
s(:block,
|
6250
|
+
s(:send, nil, :proc),
|
6251
|
+
s(:args), nil)),
|
6252
|
+
s(:pair,
|
6253
|
+
s(:sym, :b),
|
6254
|
+
s(:block,
|
6255
|
+
s(:send, nil, :proc),
|
6256
|
+
s(:args), nil)))),
|
6257
|
+
%q{p :foo, {"a": proc do end, b: proc do end}},
|
6258
|
+
%q{},
|
6259
|
+
SINCE_2_3)
|
6260
|
+
|
6261
|
+
assert_parses(
|
6262
|
+
s(:send, nil, :p,
|
6263
|
+
s(:sym, :foo),
|
6264
|
+
s(:hash,
|
6265
|
+
s(:pair,
|
6266
|
+
s(:block,
|
6267
|
+
s(:send, nil, :proc),
|
6268
|
+
s(:args), nil),
|
6269
|
+
s(:block,
|
6270
|
+
s(:send, nil, :proc),
|
6271
|
+
s(:args), nil)),
|
6272
|
+
s(:pair,
|
6273
|
+
s(:sym, :b),
|
6274
|
+
s(:block,
|
6275
|
+
s(:send, nil, :proc),
|
6276
|
+
s(:args), nil)))),
|
6277
|
+
%q{p :foo, {proc do end => proc do end, b: proc do end}},
|
6278
|
+
%q{},
|
6279
|
+
SINCE_2_3)
|
6280
|
+
|
6281
|
+
assert_parses(
|
6282
|
+
s(:send, nil, :p,
|
6283
|
+
s(:sym, :foo),
|
6284
|
+
s(:hash,
|
6285
|
+
s(:kwsplat,
|
6286
|
+
s(:block,
|
6287
|
+
s(:send, nil, :proc),
|
6288
|
+
s(:args), nil)),
|
6289
|
+
s(:pair,
|
6290
|
+
s(:sym, :b),
|
6291
|
+
s(:block,
|
6292
|
+
s(:send, nil, :proc),
|
6293
|
+
s(:args), nil)))),
|
6294
|
+
%q{p :foo, {** proc do end, b: proc do end}},
|
6295
|
+
%q{},
|
6296
|
+
SINCE_2_3)
|
6297
|
+
end
|
6298
|
+
|
6299
|
+
def test_lparenarg_after_lvar__since_25
|
6300
|
+
assert_parses(
|
6301
|
+
s(:send, nil, :meth,
|
6302
|
+
s(:send,
|
6303
|
+
s(:begin,
|
6304
|
+
s(:float, -1.3)), :abs)),
|
6305
|
+
%q{meth (-1.3).abs},
|
6306
|
+
%q{},
|
6307
|
+
ALL_VERSIONS - SINCE_2_5)
|
6308
|
+
|
6309
|
+
assert_parses(
|
6310
|
+
s(:send,
|
6311
|
+
s(:send, nil, :foo,
|
6312
|
+
s(:float, -1.3)), :abs),
|
6313
|
+
%q{foo (-1.3).abs},
|
6314
|
+
%q{},
|
6315
|
+
ALL_VERSIONS - SINCE_2_5)
|
6316
|
+
|
6317
|
+
assert_parses(
|
6318
|
+
s(:send, nil, :meth,
|
6319
|
+
s(:send,
|
6320
|
+
s(:begin,
|
6321
|
+
s(:float, -1.3)), :abs)),
|
6322
|
+
%q{meth (-1.3).abs},
|
6323
|
+
%q{},
|
6324
|
+
SINCE_2_5)
|
6325
|
+
|
6326
|
+
assert_parses(
|
6327
|
+
s(:send, nil, :foo,
|
6328
|
+
s(:send,
|
6329
|
+
s(:begin,
|
6330
|
+
s(:float, -1.3)), :abs)),
|
6331
|
+
%q{foo (-1.3).abs},
|
6332
|
+
%q{},
|
6333
|
+
SINCE_2_5)
|
6334
|
+
end
|
6335
|
+
|
6336
|
+
def test_context_class
|
6337
|
+
[
|
6338
|
+
%q{class A;},
|
6339
|
+
%q{class A < B;}
|
6340
|
+
].each do |code|
|
6341
|
+
assert_context([:class], code, ALL_VERSIONS)
|
6342
|
+
end
|
6343
|
+
end
|
6344
|
+
|
6345
|
+
def test_context_sclass
|
6346
|
+
assert_context(
|
6347
|
+
[:sclass],
|
6348
|
+
%q{class << foo;},
|
6349
|
+
ALL_VERSIONS)
|
6350
|
+
end
|
6351
|
+
|
6352
|
+
def test_context_def
|
6353
|
+
assert_context(
|
6354
|
+
[:def],
|
6355
|
+
%q{def m;},
|
6356
|
+
ALL_VERSIONS)
|
6357
|
+
end
|
6358
|
+
|
6359
|
+
def test_context_defs
|
6360
|
+
assert_context(
|
6361
|
+
[:defs],
|
6362
|
+
%q{def foo.m;},
|
6363
|
+
ALL_VERSIONS)
|
6364
|
+
end
|
6365
|
+
|
6366
|
+
def test_context_cmd_brace_block
|
6367
|
+
[
|
6368
|
+
'tap 1, { 1 => 2 } {',
|
6369
|
+
'foo.tap 1, { 1 => 2 } {',
|
6370
|
+
'foo::tap 1, { 1 => 2 } {'
|
6371
|
+
].each do |code|
|
6372
|
+
assert_context([:block], code, ALL_VERSIONS)
|
6373
|
+
end
|
6374
|
+
end
|
6375
|
+
|
6376
|
+
def test_context_brace_block
|
6377
|
+
[
|
6378
|
+
'tap {',
|
6379
|
+
'foo.tap {',
|
6380
|
+
'foo::tap {',
|
6381
|
+
'tap do',
|
6382
|
+
'foo.tap do',
|
6383
|
+
'foo::tap do'
|
6384
|
+
].each do |code|
|
6385
|
+
assert_context([:block], code, ALL_VERSIONS)
|
6386
|
+
end
|
6387
|
+
end
|
6388
|
+
|
6389
|
+
def test_context_do_block
|
6390
|
+
[
|
6391
|
+
%q{tap 1 do},
|
6392
|
+
%q{foo.tap do},
|
6393
|
+
%q{foo::tap do}
|
6394
|
+
].each do |code|
|
6395
|
+
assert_context([:block], code, ALL_VERSIONS)
|
6396
|
+
end
|
6397
|
+
end
|
6398
|
+
|
6399
|
+
def test_context_lambda
|
6400
|
+
[
|
6401
|
+
'->() {',
|
6402
|
+
'->() do'
|
6403
|
+
].each do |code|
|
6404
|
+
assert_context([:lambda], code, SINCE_1_9)
|
6405
|
+
end
|
6406
|
+
end
|
6407
|
+
|
6408
|
+
def test_context_nested
|
6409
|
+
assert_context(
|
6410
|
+
[:class, :sclass, :defs, :def, :block],
|
6411
|
+
%q{class A; class << foo; def bar.m; def m; tap do},
|
6412
|
+
ALL_VERSIONS)
|
6413
|
+
|
6414
|
+
assert_context(
|
6415
|
+
[:class, :sclass, :defs, :def, :lambda, :block],
|
6416
|
+
%q{class A; class << foo; def bar.m; def m; -> do; tap do},
|
6417
|
+
SINCE_1_9)
|
6418
|
+
|
6419
|
+
assert_context(
|
6420
|
+
[],
|
6421
|
+
%q{
|
6422
|
+
class A
|
6423
|
+
class << foo
|
6424
|
+
def bar.m
|
6425
|
+
def m
|
6426
|
+
tap do
|
6427
|
+
end
|
6428
|
+
end
|
6429
|
+
end
|
6430
|
+
end
|
6431
|
+
end
|
6432
|
+
},
|
6433
|
+
ALL_VERSIONS)
|
6434
|
+
|
6435
|
+
assert_context(
|
6436
|
+
[],
|
6437
|
+
%q{
|
6438
|
+
class A
|
6439
|
+
class << foo
|
6440
|
+
def bar.m
|
6441
|
+
def m
|
6442
|
+
-> do
|
6443
|
+
tap do
|
6444
|
+
end
|
6445
|
+
end
|
6446
|
+
end
|
6447
|
+
end
|
6448
|
+
end
|
6449
|
+
end
|
6450
|
+
},
|
6451
|
+
SINCE_1_9)
|
6452
|
+
end
|
6453
|
+
|
6454
|
+
def test_return_in_class
|
6455
|
+
assert_parses(
|
6456
|
+
s(:class,
|
6457
|
+
s(:const, nil, :A), nil,
|
6458
|
+
s(:return)),
|
6459
|
+
%q{class A; return; end},
|
6460
|
+
%q{},
|
6461
|
+
ALL_VERSIONS - SINCE_2_5)
|
6462
|
+
|
6463
|
+
assert_diagnoses(
|
6464
|
+
[:error, :invalid_return, {}],
|
6465
|
+
%q{class A; return; end},
|
6466
|
+
%q{ ^^^^^^ location},
|
6467
|
+
SINCE_2_5)
|
6468
|
+
|
6469
|
+
[
|
6470
|
+
%q{class << foo; return; end},
|
6471
|
+
%q{def m; return; end},
|
6472
|
+
%q{tap { return }},
|
6473
|
+
%q{class A; class << self; return; end; end},
|
6474
|
+
%q{class A; def m; return; end; end},
|
6475
|
+
].each do |code|
|
6476
|
+
refute_diagnoses(code, ALL_VERSIONS)
|
6477
|
+
end
|
6478
|
+
|
6479
|
+
[
|
6480
|
+
%q{-> do return end},
|
6481
|
+
%q{class A; -> do return end; end},
|
6482
|
+
].each do |code|
|
6483
|
+
refute_diagnoses(code, SINCE_1_9)
|
6484
|
+
end
|
6485
|
+
end
|
6486
|
+
|
6487
|
+
def test_ruby_bug_13547
|
6488
|
+
assert_diagnoses(
|
6489
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6490
|
+
%q{m "x" {}},
|
6491
|
+
%q{ ^ location},
|
6492
|
+
SINCE_2_4)
|
6493
|
+
|
6494
|
+
assert_diagnoses(
|
6495
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6496
|
+
%q{m "#{'x'}" {}},
|
6497
|
+
%q{ ^ location},
|
6498
|
+
SINCE_2_4)
|
6499
|
+
|
6500
|
+
assert_diagnoses(
|
6501
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6502
|
+
%q{m 1 {}},
|
6503
|
+
%q{ ^ location},
|
6504
|
+
SINCE_2_4)
|
6505
|
+
|
6506
|
+
assert_diagnoses(
|
6507
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6508
|
+
%q{m 1.0 {}},
|
6509
|
+
%q{ ^ location},
|
6510
|
+
SINCE_2_4)
|
6511
|
+
|
6512
|
+
assert_diagnoses(
|
6513
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6514
|
+
%q{m 1r {}},
|
6515
|
+
%q{ ^ location},
|
6516
|
+
SINCE_2_4)
|
6517
|
+
|
6518
|
+
assert_diagnoses(
|
6519
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6520
|
+
%q{m 1i {}},
|
6521
|
+
%q{ ^ location},
|
6522
|
+
SINCE_2_4)
|
6523
|
+
|
6524
|
+
assert_diagnoses(
|
6525
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6526
|
+
%q{m :m {}},
|
6527
|
+
%q{ ^ location},
|
6528
|
+
SINCE_2_4)
|
6529
|
+
|
6530
|
+
assert_diagnoses(
|
6531
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6532
|
+
%q{m :"#{m}" {}},
|
6533
|
+
%q{ ^ location},
|
6534
|
+
SINCE_2_4)
|
6535
|
+
|
6536
|
+
assert_diagnoses(
|
6537
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6538
|
+
%q{m %[] {}},
|
6539
|
+
%q{ ^ location},
|
6540
|
+
SINCE_2_4)
|
6541
|
+
|
6542
|
+
assert_diagnoses(
|
6543
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6544
|
+
%q{m 0..1 {}},
|
6545
|
+
%q{ ^ location},
|
6546
|
+
SINCE_2_4)
|
6547
|
+
|
6548
|
+
assert_diagnoses(
|
6549
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6550
|
+
%q{m 0...1 {}},
|
6551
|
+
%q{ ^ location},
|
6552
|
+
SINCE_2_4)
|
6553
|
+
|
6554
|
+
assert_diagnoses(
|
6555
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }],
|
6556
|
+
%q{m [] {}},
|
6557
|
+
%q{ ^ location},
|
6558
|
+
SINCE_2_4)
|
6559
|
+
|
6560
|
+
assert_parses(
|
6561
|
+
s(:block,
|
6562
|
+
s(:send,
|
6563
|
+
s(:send, nil, :meth), :[]),
|
6564
|
+
s(:args), nil),
|
6565
|
+
%q{meth[] {}},
|
6566
|
+
%q{},
|
6567
|
+
SINCE_2_4
|
6568
|
+
)
|
6569
|
+
|
6570
|
+
assert_diagnoses_many(
|
6571
|
+
[
|
6572
|
+
[:warning, :ambiguous_literal],
|
6573
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }]
|
6574
|
+
],
|
6575
|
+
%q{m /foo/ {}},
|
6576
|
+
SINCE_2_4)
|
6577
|
+
|
6578
|
+
assert_diagnoses_many(
|
6579
|
+
[
|
6580
|
+
[:warning, :ambiguous_literal],
|
6581
|
+
[:error, :unexpected_token, { :token => 'tLCURLY' }]
|
6582
|
+
],
|
6583
|
+
%q{m /foo/x {}},
|
6584
|
+
SINCE_2_4)
|
6585
|
+
end
|
6024
6586
|
end
|