ruby_parser 3.14.0 → 3.16.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/History.rdoc +78 -0
- data/Manifest.txt +4 -0
- data/Rakefile +50 -13
- data/bin/ruby_parse_extract_error +8 -3
- data/compare/normalize.rb +45 -5
- data/debugging.md +172 -0
- data/lib/ruby20_parser.rb +3378 -3353
- data/lib/ruby20_parser.y +99 -64
- data/lib/ruby21_parser.rb +3438 -3411
- data/lib/ruby21_parser.y +99 -64
- data/lib/ruby22_parser.rb +3445 -3414
- data/lib/ruby22_parser.y +99 -64
- data/lib/ruby23_parser.rb +3395 -3367
- data/lib/ruby23_parser.y +99 -64
- data/lib/ruby24_parser.rb +3443 -3407
- data/lib/ruby24_parser.y +99 -64
- data/lib/ruby25_parser.rb +3442 -3407
- data/lib/ruby25_parser.y +99 -64
- data/lib/ruby26_parser.rb +3380 -3343
- data/lib/ruby26_parser.y +100 -64
- data/lib/ruby27_parser.rb +7310 -0
- data/lib/ruby27_parser.y +2677 -0
- data/lib/ruby30_parser.rb +7310 -0
- data/lib/ruby30_parser.y +2677 -0
- data/lib/ruby_lexer.rb +94 -43
- data/lib/ruby_lexer.rex +6 -7
- data/lib/ruby_lexer.rex.rb +7 -9
- data/lib/ruby_parser.rb +4 -0
- data/lib/ruby_parser.yy +122 -64
- data/lib/ruby_parser_extras.rb +52 -23
- data/test/test_ruby_lexer.rb +80 -16
- data/test/test_ruby_parser.rb +259 -4
- data/tools/munge.rb +9 -4
- metadata +57 -36
- metadata.gz.sig +2 -2
data/lib/ruby_parser.yy
CHANGED
@@ -14,6 +14,10 @@ class Ruby24Parser
|
|
14
14
|
class Ruby25Parser
|
15
15
|
#elif V == 26
|
16
16
|
class Ruby26Parser
|
17
|
+
#elif V == 27
|
18
|
+
class Ruby27Parser
|
19
|
+
#elif V == 30
|
20
|
+
class Ruby30Parser
|
17
21
|
#else
|
18
22
|
fail "version not specified or supported on code generation"
|
19
23
|
#endif
|
@@ -44,6 +48,9 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
|
|
44
48
|
#if V >= 23
|
45
49
|
tLONELY
|
46
50
|
#endif
|
51
|
+
#if V >= 26
|
52
|
+
tBDOT2 tBDOT3
|
53
|
+
#endif
|
47
54
|
|
48
55
|
preclow
|
49
56
|
nonassoc tLOWEST
|
@@ -55,7 +62,7 @@ preclow
|
|
55
62
|
right tEQL tOP_ASGN
|
56
63
|
left kRESCUE_MOD
|
57
64
|
right tEH tCOLON
|
58
|
-
nonassoc tDOT2 tDOT3
|
65
|
+
nonassoc tDOT2 tDOT3 tBDOT2 tBDOT3
|
59
66
|
left tOROP
|
60
67
|
left tANDOP
|
61
68
|
nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
|
@@ -78,6 +85,9 @@ rule
|
|
78
85
|
top_compstmt
|
79
86
|
{
|
80
87
|
result = new_compstmt val
|
88
|
+
|
89
|
+
lexer.cond.pop # local_pop
|
90
|
+
lexer.cmdarg.pop
|
81
91
|
}
|
82
92
|
|
83
93
|
top_compstmt: top_stmts opt_terms
|
@@ -286,13 +296,15 @@ rule
|
|
286
296
|
}
|
287
297
|
| primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
|
288
298
|
{
|
289
|
-
|
290
|
-
|
299
|
+
lhs1, _, lhs2, op, rhs = val
|
300
|
+
|
301
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.to_sym)
|
291
302
|
}
|
292
303
|
| primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
|
293
304
|
{
|
294
|
-
|
295
|
-
|
305
|
+
lhs1, _, lhs2, op, rhs = val
|
306
|
+
|
307
|
+
result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.to_sym)
|
296
308
|
}
|
297
309
|
| backref tOP_ASGN command_rhs
|
298
310
|
{
|
@@ -852,6 +864,24 @@ rule
|
|
852
864
|
result = s(:dot3, v1, v2).line v1.line
|
853
865
|
}
|
854
866
|
#endif
|
867
|
+
|
868
|
+
#if V >= 27
|
869
|
+
| tBDOT2 arg
|
870
|
+
{
|
871
|
+
_, v2, = val
|
872
|
+
v1 = nil
|
873
|
+
|
874
|
+
result = s(:dot2, v1, v2).line v2.line
|
875
|
+
}
|
876
|
+
| tBDOT3 arg
|
877
|
+
{
|
878
|
+
_, v2 = val
|
879
|
+
v1 = nil
|
880
|
+
|
881
|
+
result = s(:dot3, v1, v2).line v2.line
|
882
|
+
}
|
883
|
+
#endif
|
884
|
+
|
855
885
|
| arg tPLUS arg
|
856
886
|
{
|
857
887
|
result = new_call val[0], :+, argl(val[2])
|
@@ -1063,17 +1093,14 @@ rule
|
|
1063
1093
|
| args opt_block_arg
|
1064
1094
|
{
|
1065
1095
|
result = call_args val
|
1066
|
-
result = self.arg_blk_pass val[0], val[1]
|
1067
1096
|
}
|
1068
1097
|
| assocs opt_block_arg
|
1069
1098
|
{
|
1070
|
-
result = call_args [array_to_hash(val[0])]
|
1071
|
-
result = self.arg_blk_pass result, val[1]
|
1099
|
+
result = call_args [array_to_hash(val[0]), val[1]]
|
1072
1100
|
}
|
1073
1101
|
| args tCOMMA assocs opt_block_arg
|
1074
1102
|
{
|
1075
|
-
result = call_args [val[0], array_to_hash(val[2])]
|
1076
|
-
result = self.arg_blk_pass result, val[3]
|
1103
|
+
result = call_args [val[0], array_to_hash(val[2]), val[3]]
|
1077
1104
|
}
|
1078
1105
|
| block_arg
|
1079
1106
|
{
|
@@ -1081,12 +1108,39 @@ rule
|
|
1081
1108
|
}
|
1082
1109
|
|
1083
1110
|
command_args: {
|
1084
|
-
|
1111
|
+
# parse26.y line 2200
|
1112
|
+
|
1113
|
+
# If call_args starts with a open paren '(' or
|
1114
|
+
# '[', look-ahead reading of the letters calls
|
1115
|
+
# CMDARG_PUSH(0), but the push must be done
|
1116
|
+
# after CMDARG_PUSH(1). So this code makes them
|
1117
|
+
# consistent by first cancelling the premature
|
1118
|
+
# CMDARG_PUSH(0), doing CMDARG_PUSH(1), and
|
1119
|
+
# finally redoing CMDARG_PUSH(0).
|
1120
|
+
|
1121
|
+
result = yychar = self.last_token_type.first
|
1122
|
+
lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar)
|
1123
|
+
lexer.cmdarg.pop if lookahead
|
1124
|
+
lexer.cmdarg.push true
|
1125
|
+
lexer.cmdarg.push false if lookahead
|
1085
1126
|
}
|
1086
1127
|
call_args
|
1087
1128
|
{
|
1088
|
-
|
1089
|
-
|
1129
|
+
yychar, args = val
|
1130
|
+
|
1131
|
+
# call_args can be followed by tLBRACE_ARG (that
|
1132
|
+
# does CMDARG_PUSH(0) in the lexer) but the push
|
1133
|
+
# must be done after CMDARG_POP() in the parser.
|
1134
|
+
# So this code does CMDARG_POP() to pop 0 pushed
|
1135
|
+
# by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed
|
1136
|
+
# by command_args, and CMDARG_PUSH(0) to restore
|
1137
|
+
# back the flag set by tLBRACE_ARG.
|
1138
|
+
|
1139
|
+
lookahead = [:tLBRACE_ARG].include?(yychar)
|
1140
|
+
lexer.cmdarg.pop if lookahead
|
1141
|
+
lexer.cmdarg.pop
|
1142
|
+
lexer.cmdarg.push false if lookahead
|
1143
|
+
result = args
|
1090
1144
|
}
|
1091
1145
|
|
1092
1146
|
block_arg: tAMPER arg_value
|
@@ -1104,8 +1158,9 @@ rule
|
|
1104
1158
|
args: arg_value
|
1105
1159
|
{
|
1106
1160
|
arg, = val
|
1161
|
+
lineno = arg.line || lexer.lineno # HACK
|
1107
1162
|
|
1108
|
-
result = s(:array, arg).line
|
1163
|
+
result = s(:array, arg).line lineno
|
1109
1164
|
}
|
1110
1165
|
| tSTAR arg_value
|
1111
1166
|
{
|
@@ -1117,9 +1172,11 @@ rule
|
|
1117
1172
|
args, _, id = val
|
1118
1173
|
result = self.list_append args, id
|
1119
1174
|
}
|
1120
|
-
| args tCOMMA tSTAR
|
1175
|
+
| args tCOMMA tSTAR arg_value
|
1121
1176
|
{
|
1122
|
-
|
1177
|
+
# TODO: the line number from tSTAR has been dropped
|
1178
|
+
args, _, _, id = val
|
1179
|
+
line = lexer.lineno
|
1123
1180
|
result = self.list_append args, s(:splat, id).line(line)
|
1124
1181
|
}
|
1125
1182
|
|
@@ -1140,7 +1197,6 @@ rule
|
|
1140
1197
|
}
|
1141
1198
|
| args tCOMMA tSTAR arg_value
|
1142
1199
|
{
|
1143
|
-
# FIX: bad shift/reduce conflict with rhs' comma star prod
|
1144
1200
|
# TODO: make all tXXXX terminals include lexer.lineno
|
1145
1201
|
arg, _, _, splat = val
|
1146
1202
|
result = self.arg_concat arg, splat
|
@@ -1168,21 +1224,13 @@ rule
|
|
1168
1224
|
}
|
1169
1225
|
| k_begin
|
1170
1226
|
{
|
1227
|
+
lexer.cmdarg.push false
|
1171
1228
|
result = self.lexer.lineno
|
1172
|
-
# TODO:
|
1173
|
-
# $<val>1 = cmdarg_stack;
|
1174
|
-
# CMDARG_SET(0);
|
1175
1229
|
}
|
1176
1230
|
bodystmt k_end
|
1177
1231
|
{
|
1178
|
-
|
1179
|
-
|
1180
|
-
result = s(:nil)
|
1181
|
-
else
|
1182
|
-
result = s(:begin, val[2])
|
1183
|
-
end
|
1184
|
-
|
1185
|
-
result.line = val[1]
|
1232
|
+
lexer.cmdarg.pop
|
1233
|
+
result = new_begin val
|
1186
1234
|
}
|
1187
1235
|
| tLPAREN_ARG
|
1188
1236
|
{
|
@@ -1195,18 +1243,14 @@ rule
|
|
1195
1243
|
result = s(:begin).line line
|
1196
1244
|
}
|
1197
1245
|
| tLPAREN_ARG
|
1198
|
-
{
|
1199
|
-
result = lexer.cmdarg.store false
|
1200
|
-
}
|
1201
1246
|
stmt
|
1202
1247
|
{
|
1203
1248
|
lexer.lex_state = EXPR_ENDARG
|
1204
1249
|
}
|
1205
1250
|
rparen
|
1206
1251
|
{
|
1207
|
-
_,
|
1208
|
-
warning "(...) interpreted as grouped expression"
|
1209
|
-
lexer.cmdarg.restore cmdarg
|
1252
|
+
_, stmt, _, _, = val
|
1253
|
+
# warning "(...) interpreted as grouped expression"
|
1210
1254
|
result = stmt
|
1211
1255
|
}
|
1212
1256
|
| tLPAREN compstmt tRPAREN
|
@@ -1389,48 +1433,61 @@ rule
|
|
1389
1433
|
}
|
1390
1434
|
| k_def fname
|
1391
1435
|
{
|
1392
|
-
result =
|
1436
|
+
result = self.in_def
|
1393
1437
|
|
1394
|
-
self.
|
1395
|
-
self.in_def = true
|
1438
|
+
self.in_def = true # group = local_push
|
1396
1439
|
self.env.extend
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1440
|
+
lexer.cmdarg.push false
|
1441
|
+
lexer.cond.push false
|
1442
|
+
|
1443
|
+
self.comments.push self.lexer.comments
|
1400
1444
|
}
|
1401
1445
|
f_arglist bodystmt { result = lexer.lineno } k_end
|
1402
1446
|
{
|
1403
|
-
in_def
|
1447
|
+
in_def = val[2]
|
1404
1448
|
|
1405
1449
|
result = new_defn val
|
1406
1450
|
|
1407
|
-
lexer.
|
1451
|
+
lexer.cond.pop # group = local_pop
|
1452
|
+
lexer.cmdarg.pop
|
1408
1453
|
self.env.unextend
|
1409
1454
|
self.in_def = in_def
|
1455
|
+
|
1410
1456
|
self.lexer.comments # we don't care about comments in the body
|
1411
1457
|
}
|
1412
1458
|
| k_def singleton dot_or_colon
|
1413
1459
|
{
|
1414
|
-
self.comments.push self.lexer.comments
|
1415
1460
|
lexer.lex_state = EXPR_FNAME
|
1416
1461
|
}
|
1417
1462
|
fname
|
1418
1463
|
{
|
1419
|
-
self.
|
1464
|
+
result = [self.in_def, lexer.lineno]
|
1465
|
+
|
1466
|
+
self.in_single += 1 # TODO: remove?
|
1467
|
+
|
1468
|
+
self.in_def = true # local_push
|
1420
1469
|
self.env.extend
|
1421
|
-
lexer.
|
1422
|
-
|
1423
|
-
|
1470
|
+
lexer.cmdarg.push false
|
1471
|
+
lexer.cond.push false
|
1472
|
+
|
1473
|
+
lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
|
1474
|
+
self.comments.push self.lexer.comments
|
1424
1475
|
}
|
1425
1476
|
f_arglist bodystmt k_end
|
1426
1477
|
{
|
1427
|
-
_,
|
1428
|
-
result = new_defs val
|
1478
|
+
_, _recv, _, _, _name, (in_def, _lineno), _args, _body, _ = val
|
1429
1479
|
|
1430
|
-
|
1480
|
+
result = new_defs val
|
1431
1481
|
|
1482
|
+
lexer.cond.pop # group = local_pop
|
1483
|
+
lexer.cmdarg.pop
|
1432
1484
|
self.env.unextend
|
1485
|
+
self.in_def = in_def
|
1486
|
+
|
1433
1487
|
self.in_single -= 1
|
1488
|
+
|
1489
|
+
# TODO: restore cur_arg ? what's cur_arg?
|
1490
|
+
|
1434
1491
|
self.lexer.comments # we don't care about comments in the body
|
1435
1492
|
}
|
1436
1493
|
| kBREAK
|
@@ -1715,20 +1772,19 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1715
1772
|
}
|
1716
1773
|
f_larglist
|
1717
1774
|
{
|
1718
|
-
|
1775
|
+
lexer.cmdarg.push false
|
1719
1776
|
}
|
1720
1777
|
lambda_body
|
1721
1778
|
{
|
1722
|
-
(line, lpar), args,
|
1779
|
+
(line, lpar), args, _cmdarg, body = val
|
1723
1780
|
lexer.lpar_beg = lpar
|
1724
1781
|
|
1725
|
-
lexer.cmdarg.
|
1726
|
-
lexer.cmdarg.lexpop
|
1782
|
+
lexer.cmdarg.pop
|
1727
1783
|
|
1728
1784
|
call = s(:lambda).line line
|
1729
1785
|
result = new_iter call, args, body
|
1730
1786
|
result.line = line
|
1731
|
-
self.env.unextend
|
1787
|
+
self.env.unextend # TODO: dynapush & dynapop
|
1732
1788
|
}
|
1733
1789
|
|
1734
1790
|
f_larglist: tLPAREN2 f_args opt_bv_decl rparen
|
@@ -1881,7 +1937,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1881
1937
|
}
|
1882
1938
|
|
1883
1939
|
do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
|
1884
|
-
{
|
1940
|
+
{ lexer.cmdarg.push false }
|
1885
1941
|
opt_block_param
|
1886
1942
|
#if V >= 25
|
1887
1943
|
bodystmt
|
@@ -1889,11 +1945,11 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1889
1945
|
compstmt
|
1890
1946
|
#endif
|
1891
1947
|
{
|
1892
|
-
line,
|
1948
|
+
line, _cmdarg, param, cmpstmt = val
|
1893
1949
|
|
1894
1950
|
result = new_do_body param, cmpstmt, line
|
1951
|
+
lexer.cmdarg.pop
|
1895
1952
|
self.env.unextend
|
1896
|
-
lexer.cmdarg.restore cmdarg
|
1897
1953
|
}
|
1898
1954
|
|
1899
1955
|
case_body: k_when
|
@@ -1993,7 +2049,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
1993
2049
|
|
1994
2050
|
xstring: tXSTRING_BEG xstring_contents tSTRING_END
|
1995
2051
|
{
|
1996
|
-
result = new_xstring val
|
2052
|
+
result = new_xstring val
|
1997
2053
|
# TODO: dedent?!?! SERIOUSLY?!?
|
1998
2054
|
}
|
1999
2055
|
|
@@ -2135,12 +2191,13 @@ regexp_contents: none
|
|
2135
2191
|
result = [lexer.lex_strterm,
|
2136
2192
|
lexer.brace_nest,
|
2137
2193
|
lexer.string_nest, # TODO: remove
|
2138
|
-
lexer.cond.store,
|
2139
|
-
lexer.cmdarg.store,
|
2140
2194
|
lexer.lex_state,
|
2141
2195
|
lexer.lineno,
|
2142
2196
|
]
|
2143
2197
|
|
2198
|
+
lexer.cmdarg.push false
|
2199
|
+
lexer.cond.push false
|
2200
|
+
|
2144
2201
|
lexer.lex_strterm = nil
|
2145
2202
|
lexer.brace_nest = 0
|
2146
2203
|
lexer.string_nest = 0
|
@@ -2152,14 +2209,15 @@ regexp_contents: none
|
|
2152
2209
|
{
|
2153
2210
|
_, memo, stmt, _ = val
|
2154
2211
|
|
2155
|
-
lex_strterm, brace_nest, string_nest,
|
2212
|
+
lex_strterm, brace_nest, string_nest, oldlex_state, line = memo
|
2213
|
+
# TODO: heredoc_indent
|
2156
2214
|
|
2157
2215
|
lexer.lex_strterm = lex_strterm
|
2158
2216
|
lexer.brace_nest = brace_nest
|
2159
2217
|
lexer.string_nest = string_nest
|
2160
2218
|
|
2161
|
-
lexer.
|
2162
|
-
lexer.
|
2219
|
+
lexer.cmdarg.pop
|
2220
|
+
lexer.cond.pop
|
2163
2221
|
|
2164
2222
|
lexer.lex_state = oldlex_state
|
2165
2223
|
|
data/lib/ruby_parser_extras.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# encoding: ASCII-8BIT
|
2
|
+
# TODO: remove
|
2
3
|
|
3
4
|
require "sexp"
|
4
5
|
require "ruby_lexer"
|
@@ -28,7 +29,7 @@ class Sexp
|
|
28
29
|
end
|
29
30
|
|
30
31
|
module RubyParserStuff
|
31
|
-
VERSION = "3.
|
32
|
+
VERSION = "3.16.0"
|
32
33
|
|
33
34
|
attr_accessor :lexer, :in_def, :in_single, :file
|
34
35
|
attr_accessor :in_kwarg
|
@@ -45,6 +46,11 @@ module RubyParserStuff
|
|
45
46
|
|
46
47
|
attr_accessor :canonicalize_conditions
|
47
48
|
|
49
|
+
##
|
50
|
+
# The last token type returned from #next_token
|
51
|
+
|
52
|
+
attr_accessor :last_token_type
|
53
|
+
|
48
54
|
$good20 = []
|
49
55
|
|
50
56
|
%w[
|
@@ -109,7 +115,7 @@ module RubyParserStuff
|
|
109
115
|
def initialize(options = {})
|
110
116
|
super()
|
111
117
|
|
112
|
-
v = self.class.name[/
|
118
|
+
v = self.class.name[/[23]\d/]
|
113
119
|
raise "Bad Class name #{self.class}" unless v
|
114
120
|
|
115
121
|
self.lexer = RubyLexer.new v && v.to_i
|
@@ -124,12 +130,6 @@ module RubyParserStuff
|
|
124
130
|
self.reset
|
125
131
|
end
|
126
132
|
|
127
|
-
def arg_blk_pass node1, node2 # TODO: nuke
|
128
|
-
node1 = s(:arglist, node1) unless ARG_TYPES[node1.sexp_type]
|
129
|
-
node1 << node2 if node2
|
130
|
-
node1
|
131
|
-
end
|
132
|
-
|
133
133
|
def arg_concat node1, node2 # TODO: nuke
|
134
134
|
raise "huh" unless node2
|
135
135
|
|
@@ -499,6 +499,8 @@ module RubyParserStuff
|
|
499
499
|
str.encode! Encoding::UTF_8
|
500
500
|
break
|
501
501
|
end
|
502
|
+
rescue ArgumentError # unknown encoding name
|
503
|
+
# do nothing
|
502
504
|
rescue Encoding::InvalidByteSequenceError
|
503
505
|
# do nothing
|
504
506
|
rescue Encoding::UndefinedConversionError
|
@@ -538,7 +540,7 @@ module RubyParserStuff
|
|
538
540
|
header.map! { |s| s.force_encoding "ASCII-8BIT" } if has_enc
|
539
541
|
|
540
542
|
first = header.first || ""
|
541
|
-
encoding, str = "utf-8", str[3..-1] if first =~ /\A\xEF\xBB\xBF/
|
543
|
+
encoding, str = "utf-8", str.b[3..-1] if first =~ /\A\xEF\xBB\xBF/
|
542
544
|
|
543
545
|
encoding = $1.strip if header.find { |s|
|
544
546
|
s[/^#.*?-\*-.*?coding:\s*([^ ;]+).*?-\*-/, 1] ||
|
@@ -598,7 +600,9 @@ module RubyParserStuff
|
|
598
600
|
case ttype
|
599
601
|
when :str then
|
600
602
|
if htype == :str
|
601
|
-
head.last
|
603
|
+
a, b = head.last, tail.last
|
604
|
+
b = b.dup.force_encoding a.encoding unless Encoding.compatible?(a, b)
|
605
|
+
a << b
|
602
606
|
elsif htype == :dstr and head.size == 2 then
|
603
607
|
head.last << tail.last
|
604
608
|
else
|
@@ -702,6 +706,15 @@ module RubyParserStuff
|
|
702
706
|
result
|
703
707
|
end
|
704
708
|
|
709
|
+
def new_begin val
|
710
|
+
_, lineno, body, _ = val
|
711
|
+
|
712
|
+
result = body ? s(:begin, body) : s(:nil)
|
713
|
+
result.line lineno
|
714
|
+
|
715
|
+
result
|
716
|
+
end
|
717
|
+
|
705
718
|
def new_body val
|
706
719
|
body, resbody, elsebody, ensurebody = val
|
707
720
|
|
@@ -729,7 +742,10 @@ module RubyParserStuff
|
|
729
742
|
result = block_append(result, elsebody)
|
730
743
|
end
|
731
744
|
|
732
|
-
|
745
|
+
if ensurebody
|
746
|
+
lineno = (result || ensurebody).line
|
747
|
+
result = s(:ensure, result, ensurebody).compact.line lineno
|
748
|
+
end
|
733
749
|
|
734
750
|
result
|
735
751
|
end
|
@@ -831,6 +847,8 @@ module RubyParserStuff
|
|
831
847
|
(_, line), name, _, args, body, nil_body_line, * = val
|
832
848
|
body ||= s(:nil).line nil_body_line
|
833
849
|
|
850
|
+
args.line line
|
851
|
+
|
834
852
|
result = s(:defn, name.to_sym, args).line line
|
835
853
|
|
836
854
|
if body then
|
@@ -847,14 +865,17 @@ module RubyParserStuff
|
|
847
865
|
end
|
848
866
|
|
849
867
|
def new_defs val
|
850
|
-
recv,
|
851
|
-
|
868
|
+
_, recv, _, _, name, (_in_def, line), args, body, _ = val
|
869
|
+
|
852
870
|
body ||= s(:nil).line line
|
853
871
|
|
854
872
|
args.line line
|
855
873
|
|
856
874
|
result = s(:defs, recv, name.to_sym, args)
|
857
875
|
|
876
|
+
# TODO: remove_begin
|
877
|
+
# TODO: reduce_nodes
|
878
|
+
|
858
879
|
if body then
|
859
880
|
if body.sexp_type == :block then
|
860
881
|
result.push(*body.sexp_body)
|
@@ -879,7 +900,9 @@ module RubyParserStuff
|
|
879
900
|
end
|
880
901
|
|
881
902
|
def new_hash val
|
882
|
-
|
903
|
+
_, line, assocs = val
|
904
|
+
|
905
|
+
s(:hash).line(line).concat assocs.values
|
883
906
|
end
|
884
907
|
|
885
908
|
def new_if c, t, f
|
@@ -1138,6 +1161,7 @@ module RubyParserStuff
|
|
1138
1161
|
def new_string val
|
1139
1162
|
str, = val
|
1140
1163
|
str.force_encoding("UTF-8")
|
1164
|
+
# TODO: remove:
|
1141
1165
|
str.force_encoding("ASCII-8BIT") unless str.valid_encoding?
|
1142
1166
|
result = s(:str, str).line lexer.lineno
|
1143
1167
|
self.lexer.fixup_lineno str.count("\n")
|
@@ -1232,20 +1256,23 @@ module RubyParserStuff
|
|
1232
1256
|
result
|
1233
1257
|
end
|
1234
1258
|
|
1235
|
-
def new_xstring
|
1236
|
-
|
1237
|
-
|
1259
|
+
def new_xstring val
|
1260
|
+
_, node = val
|
1261
|
+
|
1262
|
+
node ||= s(:str, "").line lexer.lineno
|
1263
|
+
|
1264
|
+
if node then
|
1265
|
+
case node.sexp_type
|
1238
1266
|
when :str
|
1239
|
-
|
1267
|
+
node.sexp_type = :xstr
|
1240
1268
|
when :dstr
|
1241
|
-
|
1269
|
+
node.sexp_type = :dxstr
|
1242
1270
|
else
|
1243
|
-
|
1271
|
+
node = s(:dxstr, "", node).line node.line
|
1244
1272
|
end
|
1245
|
-
str
|
1246
|
-
else
|
1247
|
-
s(:xstr, "")
|
1248
1273
|
end
|
1274
|
+
|
1275
|
+
node
|
1249
1276
|
end
|
1250
1277
|
|
1251
1278
|
def new_yield args = nil
|
@@ -1266,6 +1293,7 @@ module RubyParserStuff
|
|
1266
1293
|
token = self.lexer.next_token
|
1267
1294
|
|
1268
1295
|
if token and token.first != RubyLexer::EOF then
|
1296
|
+
self.last_token_type = token
|
1269
1297
|
return token
|
1270
1298
|
else
|
1271
1299
|
return [false, false]
|
@@ -1324,6 +1352,7 @@ module RubyParserStuff
|
|
1324
1352
|
self.in_single = 0
|
1325
1353
|
self.env.reset
|
1326
1354
|
self.comments.clear
|
1355
|
+
self.last_token_type = nil
|
1327
1356
|
end
|
1328
1357
|
|
1329
1358
|
def ret_args node
|